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

Rémi Denis-Courmont remi at remlab.net
Tue Feb 27 13:51:41 CET 2018


Le 27 février 2018 12:41:05 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>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
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

I wouldn't call that "following" external changes. Following external changes ought to involve automatically moving *and* automatically reporting the device change.

Also, IIRC*, Windows mixer does not show "default" as a target to move a stream to.

With that noted, I think it is much better to report the current device in audio menu than to show "Default" there.

* I don't have access to a Windows Vista or later installation anymore. 

-- 
Remi Denis-Courmont


More information about the vlc-devel mailing list