libobs/audio-monitoring: Fix mutex leak

Use SRWLOCK for simplicity. Does not need to be destroyed.
This commit is contained in:
jpark37 2021-10-01 21:32:09 -07:00 committed by Jim
parent 8ce1bb645f
commit b005e6748e

View File

@ -48,7 +48,7 @@ struct audio_monitor {
uint32_t delay_size;
DARRAY(float) buf;
pthread_mutex_t playback_mutex;
SRWLOCK playback_mutex;
};
/* #define DEBUG_AUDIO */
@ -152,7 +152,7 @@ static void on_audio_playback(void *param, obs_source_t *source,
bool success;
BYTE *output;
if (pthread_mutex_trylock(&monitor->playback_mutex) != 0) {
if (!TryAcquireSRWLockExclusive(&monitor->playback_mutex)) {
return;
}
if (os_atomic_load_long(&source->activate_refs) == 0) {
@ -206,7 +206,7 @@ static void on_audio_playback(void *param, obs_source_t *source,
muted ? AUDCLNT_BUFFERFLAGS_SILENT : 0);
unlock:
pthread_mutex_unlock(&monitor->playback_mutex);
ReleaseSRWLockExclusive(&monitor->playback_mutex);
}
static inline void audio_monitor_free(struct audio_monitor *monitor)
@ -259,8 +259,6 @@ static bool audio_monitor_init(struct audio_monitor *monitor,
UINT32 frames;
HRESULT hr;
pthread_mutex_init_value(&monitor->playback_mutex);
monitor->source = source;
const char *id = obs->audio.monitoring_device_id;
@ -375,17 +373,14 @@ static bool audio_monitor_init(struct audio_monitor *monitor,
goto fail;
}
if (pthread_mutex_init(&monitor->playback_mutex, NULL) != 0) {
warn("%s: Failed to initialize mutex", __FUNCTION__);
goto fail;
}
hr = monitor->client->lpVtbl->Start(monitor->client);
if (FAILED(hr)) {
warn("%s: Failed to start audio: %08lX", __FUNCTION__, hr);
goto fail;
}
InitializeSRWLock(&monitor->playback_mutex);
success = true;
fail:
@ -434,9 +429,9 @@ void audio_monitor_reset(struct audio_monitor *monitor)
struct audio_monitor new_monitor = {0};
bool success;
pthread_mutex_lock(&monitor->playback_mutex);
AcquireSRWLockExclusive(&monitor->playback_mutex);
success = audio_monitor_init(&new_monitor, monitor->source);
pthread_mutex_unlock(&monitor->playback_mutex);
ReleaseSRWLockExclusive(&monitor->playback_mutex);
if (success) {
obs_source_t *source = monitor->source;