Browse Source

libobs/audio-monitoring: Fix mutex leak

Use SRWLOCK for simplicity. Does not need to be destroyed.
jpark37 4 years ago
parent
commit
b005e6748e
1 changed files with 7 additions and 12 deletions
  1. 7 12
      libobs/audio-monitoring/win32/wasapi-output.c

+ 7 - 12
libobs/audio-monitoring/win32/wasapi-output.c

@@ -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;