libobs/audio-monitoring: Fix mutex leak
Use SRWLOCK for simplicity. Does not need to be destroyed.
This commit is contained in:
parent
8ce1bb645f
commit
b005e6748e
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user