From 6f293db1ac490c67598fe2331d822186acaccaea Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Thu, 22 Feb 2018 15:54:57 +0100 Subject: [PATCH] mmdevice: follow default device changes Restart and request the new default device when it's changed by Windows and when the "Default" virtual device is selected by VLC. Fixes #19638 --- modules/audio_output/mmdevice.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/modules/audio_output/mmdevice.c b/modules/audio_output/mmdevice.c index aaa1b5987c..10cc4e5b30 100644 --- a/modules/audio_output/mmdevice.c +++ b/modules/audio_output/mmdevice.c @@ -37,6 +37,7 @@ DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); #include +#include #include #include #include @@ -93,6 +94,7 @@ struct aout_sys_t float requested_volume; /**< Requested volume, negative if none */ signed char requested_mute; /**< Requested mute, negative if none */ wchar_t *acquired_device; /**< Acquired device identifier, NULL if none */ + bool request_device_restart; CRITICAL_SECTION lock; CONDITION_VARIABLE work; CONDITION_VARIABLE ready; @@ -569,7 +571,15 @@ vlc_MMNotificationClient_OnDefaultDeviceChange(IMMNotificationClient *this, if (role != eConsole) return S_OK; - msg_Dbg(aout, "default device changed: %ls", wid); /* TODO? migrate */ + EnterCriticalSection(&sys->lock); + if (sys->acquired_device == default_device) + { + msg_Dbg(aout, "default device changed: %ls", wid); + sys->request_device_restart = true; + aout_RestartRequest(aout, AOUT_RESTART_OUTPUT); + } + LeaveCriticalSection(&sys->lock); + return S_OK; } @@ -719,6 +729,8 @@ static int DeviceRequestLocked(audio_output_t *aout) aout_sys_t *sys = aout->sys; assert(sys->requested_device); + sys->request_device_restart = false; + WakeConditionVariable(&sys->work); while (sys->requested_device != NULL) SleepConditionVariableCS(&sys->ready, &sys->lock, INFINITE); @@ -1117,6 +1129,10 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt) EnterMTA(); EnterCriticalSection(&sys->lock); + + if (sys->request_device_restart) + DeviceRestartLocked(aout); + for (;;) { char *modlist = var_InheritString(aout, "mmdevice-backend"); @@ -1232,6 +1248,7 @@ static int Open(vlc_object_t *obj) sys->requested_volume = -1.f; sys->requested_mute = -1; sys->acquired_device = NULL; + sys->request_device_restart = false; InitializeCriticalSection(&sys->lock); InitializeConditionVariable(&sys->work); InitializeConditionVariable(&sys->ready); -- 2.11.4.GIT