[vlc-devel] [PATCH 2/7] mmdevice: follow default device changes
Thomas Guillem
thomas at gllm.fr
Tue Feb 27 11:41:06 CET 2018
Restart and request the new default device when it's changed by Windows and
when the "Default" virtual device is selected by VLC.
Refs #19638
---
modules/audio_output/mmdevice.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/modules/audio_output/mmdevice.c b/modules/audio_output/mmdevice.c
index 48d05ad2d6..525f16ff6a 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 <vlc_common.h>
+#include <vlc_atomic.h>
#include <vlc_plugin.h>
#include <vlc_aout.h>
#include <vlc_charset.h>
@@ -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 */
+ atomic_bool request_default_device;
CRITICAL_SECTION lock;
CONDITION_VARIABLE work;
CONDITION_VARIABLE ready;
@@ -136,11 +138,30 @@ static int TimeGet(audio_output_t *aout, mtime_t *restrict delay)
return SUCCEEDED(hr) ? 0 : -1;
}
+static bool CheckDefaultDevice(audio_output_t *aout)
+{
+ aout_sys_t *sys = aout->sys;
+ if (!atomic_exchange(&sys->request_default_device, false))
+ return false;
+
+ if (sys->acquired_device != default_device)
+ return false;
+
+ DeviceSelect(aout, NULL);
+ return true; /* Should restart */
+}
+
static void Play(audio_output_t *aout, block_t *block)
{
aout_sys_t *sys = aout->sys;
HRESULT hr;
+ if (CheckDefaultDevice(aout))
+ {
+ block_Release(block);
+ return;
+ }
+
EnterMTA();
hr = aout_stream_Play(sys->stream, block);
LeaveMTA();
@@ -166,6 +187,9 @@ static void Flush(audio_output_t *aout, bool wait)
aout_sys_t *sys = aout->sys;
HRESULT hr;
+ if (CheckDefaultDevice(aout))
+ return;
+
EnterMTA();
hr = aout_stream_Flush(sys->stream, wait);
LeaveMTA();
@@ -571,7 +595,9 @@ vlc_MMNotificationClient_OnDefaultDeviceChange(IMMNotificationClient *this,
if (role != eConsole)
return S_OK;
- msg_Dbg(aout, "default device changed: %ls", wid); /* TODO? migrate */
+ msg_Dbg(aout, "default device changed: %ls", wid);
+ atomic_store(&sys->request_default_device, true);
+
return S_OK;
}
@@ -1089,6 +1115,8 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
{
aout_sys_t *sys = aout->sys;
+ CheckDefaultDevice(aout);
+
if (sys->dev == NULL)
return -1;
@@ -1225,6 +1253,7 @@ static int Open(vlc_object_t *obj)
sys->duck.lpVtbl = &vlc_AudioVolumeDuckNotification;
sys->refs = 1;
sys->ducks = 0;
+ atomic_init(&sys->request_default_device, false);
sys->gain = 1.f;
sys->requested_device = default_device;
--
2.11.0
More information about the vlc-devel
mailing list