[vlc-devel] [PATCH 1/7] mmdevice: add "Default" device

Thomas Guillem thomas at gllm.fr
Tue Feb 27 11:41:05 CET 2018


Like for DirectSound, add the "Default" virtual device that is selected by
default and that follows Windows devices change via external programs (or via
the taskbar).

Refs #19638
---
 modules/audio_output/mmdevice.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/modules/audio_output/mmdevice.c b/modules/audio_output/mmdevice.c
index 731474848b..48d05ad2d6 100644
--- a/modules/audio_output/mmdevice.c
+++ b/modules/audio_output/mmdevice.c
@@ -71,6 +71,7 @@ static void LeaveMTA(void)
 }
 
 static wchar_t default_device[1] = L"";
+static char default_device_b[1] = "";
 
 struct aout_sys_t
 {
@@ -111,6 +112,8 @@ struct aout_sys_t
  * and (trivially) the device and session notifications. */
 
 static int DeviceSelect(audio_output_t *, const char *);
+static int DeviceSelectLocked(audio_output_t *t, const char *);
+
 static int vlc_FromHR(audio_output_t *aout, HRESULT hr)
 {
     /* Select the default device (and restart) on unplug */
@@ -733,7 +736,7 @@ static int DeviceSelectLocked(audio_output_t *aout, const char *id)
     aout_sys_t *sys = aout->sys;
     assert(sys->requested_device == NULL);
 
-    if (id != NULL)
+    if (id != NULL && strcmp(id, default_device_b) != 0)
     {
         sys->requested_device = ToWide(id);
         if (unlikely(sys->requested_device == NULL))
@@ -835,15 +838,20 @@ static HRESULT MMSession(audio_output_t *aout, IMMDeviceEnumerator *it)
     {   /* Report actual device */
         LPWSTR wdevid;
 
-        hr = IMMDevice_GetId(sys->dev, &wdevid);
-        if (SUCCEEDED(hr))
+        if (sys->acquired_device == default_device)
+            aout_DeviceReport(aout, default_device_b);
+        else
         {
-            char *id = FromWide(wdevid);
-            CoTaskMemFree(wdevid);
-            if (likely(id != NULL))
+            hr = IMMDevice_GetId(sys->dev, &wdevid);
+            if (SUCCEEDED(hr))
             {
-                aout_DeviceReport(aout, id);
-                free(id);
+                char *id = FromWide(wdevid);
+                CoTaskMemFree(wdevid);
+                if (likely(id != NULL))
+                {
+                    aout_DeviceReport(aout, id);
+                    free(id);
+                }
             }
         }
     }
@@ -1227,6 +1235,8 @@ static int Open(vlc_object_t *obj)
     InitializeConditionVariable(&sys->work);
     InitializeConditionVariable(&sys->ready);
 
+    aout_HotplugReport(aout, default_device_b, _("Default"));
+
     /* Initialize MMDevice API */
     if (TryEnterMTA(aout))
         goto error;
@@ -1264,6 +1274,7 @@ static int Open(vlc_object_t *obj)
     aout->volume_set = VolumeSet;
     aout->mute_set = MuteSet;
     aout->device_select = DeviceSelect;
+
     return VLC_SUCCESS;
 
 error:
-- 
2.11.0



More information about the vlc-devel mailing list