[vlc-devel] [PATCH 2/4] mmdevice: support WASAPI device endpoint activation events

Rémi Denis-Courmont remi at remlab.net
Mon May 23 21:29:03 CEST 2016


On Monday 23 May 2016 09:39:23 Thomas Guillem wrote:
> From: Sean McGovern <gseanmcg at gmail.com>
> 
> Some devices expose more than one endpoint such as speakers and headphone
> output. Disconnecting headphones does not remove the endpoint but instead
> marks it as being in unplugged state.
> 
> Respond to the appropriate activation events in order to enable/disable
> endpoints correctly when they are added/removed from set of "active"
> endpoints.
> 
> Fix #15966
> 
> Signed-off-by: Thomas Guillem <thomas at gllm.fr>
> ---
>  modules/audio_output/mmdevice.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
> 
> diff --git a/modules/audio_output/mmdevice.c
> b/modules/audio_output/mmdevice.c index a58b7dc..8082363 100644
> --- a/modules/audio_output/mmdevice.c
> +++ b/modules/audio_output/mmdevice.c
> @@ -492,7 +492,7 @@ static bool DeviceIsRender(IMMDevice *dev)
>      return flow == eRender;
>  }
> 
> -static HRESULT DeviceUpdated(audio_output_t *aout, LPCWSTR wid)
> +static HRESULT DeviceUpdated(audio_output_t *aout, LPCWSTR wid, bool
> activating) {

That flag does not seem to be accounted for in the commit log, and I don´t 
really see the need for it TBH.

>      aout_sys_t *sys = aout->sys;
>      HRESULT hr;
> @@ -518,7 +518,11 @@ static HRESULT DeviceUpdated(audio_output_t *aout,
> LPCWSTR wid) char *name = DeviceName(dev);
>      IMMDevice_Release(dev);
> 
> -    aout_HotplugReport(aout, id, (name != NULL) ? name : id);
> +    if (activating)
> +        aout_HotplugReport(aout, id, (name != NULL) ? name : id);
> +    else
> +        aout_HotplugReport(aout, id, NULL);
> +
>      free(name);
>      free(id);
>      return S_OK;
> @@ -586,7 +590,7 @@
> vlc_MMNotificationClient_OnDeviceAdded(IMMNotificationClient *this,
> audio_output_t *aout = sys->aout;
> 
>      msg_Dbg(aout, "device %ls added", wid);
> -    return DeviceUpdated(aout, wid);
> +    return DeviceUpdated(aout, wid, true);
>  }
> 
>  static STDMETHODIMP
> @@ -601,7 +605,7 @@
> vlc_MMNotificationClient_OnDeviceRemoved(IMMNotificationClient *this, if
> (unlikely(id == NULL))
>          return E_OUTOFMEMORY;
> 
> -    aout_HotplugReport(aout, id, NULL);
> +    DeviceUpdated(aout, wid, false);
>      free(id);
>      return S_OK;
>  }
> @@ -616,15 +620,19 @@
> vlc_MMNotificationClient_OnDeviceStateChanged(IMMNotificationClient *this,
> switch (state) {
>          case DEVICE_STATE_UNPLUGGED:
>              msg_Warn(aout, "device %ls was unplugged", wid);
> +            DeviceUpdated(aout, wid, false);
>              break;
>          case DEVICE_STATE_ACTIVE:
>              msg_Warn(aout, "device %ls became active", wid);
> +            DeviceUpdated(aout, wid, true);
>              break;
>          case DEVICE_STATE_DISABLED:
>              msg_Warn(aout, "device %ls was disabled", wid);
> +            DeviceUpdated(aout, wid, false);
>              break;
>          case DEVICE_STATE_NOTPRESENT:
>              msg_Warn(aout, "device %ls is not present anymore", wid);
> +            DeviceUpdated(aout, wid, false);
>              break;
>          default:
>              msg_Warn(aout, "device %ls: unknown state %08lx", wid, state);
> @@ -645,7 +653,7 @@
> vlc_MMNotificationClient_OnPropertyValueChanged(IMMNotificationClient
> *this, if (key.pid == PKEY_Device_FriendlyName.pid)
>      {
>          msg_Dbg(aout, "device %ls name changed", wid);
> -        return DeviceUpdated(aout, wid);
> +        return DeviceUpdated(aout, wid, true);
>      }
>      return S_OK;
>  }

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list