[vlc-devel] [PATCH 1/7] mmdevice: add "Default" device
Thomas Guillem
thomas at gllm.fr
Tue Feb 27 16:35:39 CET 2018
On Tue, Feb 27, 2018, at 14:19, Rémi Denis-Courmont wrote:
> Le 27 février 2018 15:07:07 GMT+02:00, "Hugo Beauzée-Luyssen"
> <hugo at beauzee.fr> a écrit :
> >On Tue, Feb 27, 2018, at 2:03 PM, Rémi Denis-Courmont wrote:
> >> Le 27 février 2018 14:57:45 GMT+02:00, "Hugo Beauzée-Luyssen"
> >> <hugo at beauzee.fr> a écrit :
> >> >On Tue, Feb 27, 2018, at 1:51 PM, Rémi Denis-Courmont wrote:
> >> >> 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.
> >> >>
> >> >
> >> >It does not, as the device selection list basically represents the
> >> >default device (to be fair, I don't recall how things are presented
> >on
> >> >Windows before Win10)
> >> >
> >> >> With that noted, I think it is much better to report the current
> >> >device
> >> >> in audio menu than to show "Default" there.
> >> >>
> >> >
> >> >I disagree. Having a "Default" virtual device allows you to say
> >> >"whichever is selected by windows", but also allows you to
> >explicitly
> >> >pin VLC to a specific device.
> >> >Not having a default device means that when windows defaults change,
> >we
> >> >also change, which I find to be an unintuitive behavior.
> >> >
> >> >> * I don't have access to a Windows Vista or later installation
> >> >anymore.
> >> >>
> >> >
> >> >
> >> >--
> >> > Hugo Beauzée-Luyssen
> >> > hugo at beauzee.fr
> >> >_______________________________________________
> >> >vlc-devel mailing list
> >> >To unsubscribe or modify your subscription options:
> >> >https://mailman.videolan.org/listinfo/vlc-devel
> >>
> >> Default is necessary in configuration, if only because a default
> >value
> >> is needed. In run-time Audio menu, it's counter-intuitive, if the
> >> platform itself does not exhibit such an option.
> >>
> >> Oh sure, it means the user cannot explicitly switch between the
> >current
> >> default device and the abstract default choice. That seems like a
> >rather
> >> small loss compared to not seeing what the current device actually
> >is.
> >> --
> >> Remi Denis-Courmont
> >
> >I don't understand your point.
> >The platform exposes a default device, the application offers you a
> >choice to abide by that setting, or to use a different device
> >explicitly.
> >
> >--
> > Hugo Beauzée-Luyssen
> > hugo at beauzee.fr
> >_______________________________________________
> >vlc-devel mailing list
> >To unsubscribe or modify your subscription options:
> >https://mailman.videolan.org/listinfo/vlc-devel
>
> If the platform exposes an explicit virtual default to user, then there
> is no need to special case it. It will just show up.
>
> If the platform only exposes default at API level, but conceals it from
> the user in OS mixer and wherever else applicable, it makes sense to do
> the same thing.
>
> In other words, it makes sense to expose in GUI the same that the
> platform exposes in its own GUI.
By default, if the user didn't touch any audio devices preferences, VLC must follow the Windows audio device selection. Do we all agree on that ?
There are 2 ways of doing that:
1/ Add a "Default" virtual device (like for macOS);
2/ Don't add it but follow the Windows device if the user never changed the audio device.
I prefer the solution 1/.
> --
> Remi Denis-Courmont
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list