[vlc-devel] [PATCH 3/7] mmdevice: split DeviceHotplugReport()

Thomas Guillem thomas at gllm.fr
Tue Feb 27 14:13:20 CET 2018



On Tue, Feb 27, 2018, at 13:55, Rémi Denis-Courmont wrote:
> Le 27 février 2018 12:41:07 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
> >Add DeviceGetFriendlyName() that can be used to fetch the friendly
> >name.
> >---
> >modules/audio_output/mmdevice.c | 45
> >+++++++++++++++++++++++++++--------------
> > 1 file changed, 30 insertions(+), 15 deletions(-)
> >
> >diff --git a/modules/audio_output/mmdevice.c
> >b/modules/audio_output/mmdevice.c
> >index 525f16ff6a..cc5bbf0eec 100644
> >--- a/modules/audio_output/mmdevice.c
> >+++ b/modules/audio_output/mmdevice.c
> >@@ -470,42 +470,57 @@ static const struct
> >IAudioVolumeDuckNotificationVtbl vlc_AudioVolumeDuckNotifica
> > /*** Audio devices ***/
> > 
> > /** Gets the user-readable device name */
> >-static int DeviceHotplugReport(audio_output_t *aout, LPCWSTR wid,
> >-                               IMMDevice *dev)
> >+static int DeviceGetFriendlyName(LPCWSTR wid, IMMDevice *dev, char
> >**id, char **name)
> > {
> >     IPropertyStore *props;
> >-    char *name;
> >     PROPVARIANT v;
> >     HRESULT hr;
> > 
> >-    char *id = FromWide(wid);
> >+    *id = FromWide(wid);
> >     if (unlikely(id == NULL))
> >-        return VLC_ENOMEM;
> >+        return VLC_EGENERIC;
> > 
> >     hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &props);
> >     if (FAILED(hr))
> >-    {
> >-        free(id);
> >-        return VLC_EGENERIC;
> >-    }
> >+        goto fallback;
> > 
> >     PropVariantInit(&v);
> >    hr = IPropertyStore_GetValue(props, &PKEY_Device_FriendlyName, &v);
> >     if (SUCCEEDED(hr))
> >     {
> >-        name = FromWide(v.pwszVal);
> >+        *name = FromWide(v.pwszVal);
> >         PropVariantClear(&v);
> >     }
> >     else
> >-        name = id;
> >+    {
> >+        IPropertyStore_Release(props);
> >+        goto fallback;
> >+    }
> > 
> >     IPropertyStore_Release(props);
> >-    aout_HotplugReport(aout, id, name);
> > 
> >-    free(id);
> >-    if (id != name)
> >-        free(name);
> >     return VLC_SUCCESS;
> >+fallback:
> >+
> >+    *name = strdup(*id);
> >+    if (!*name)
> >+    {
> >+        free(*id);
> >+        return VLC_EGENERIC;
> >+    }
> >+    return VLC_SUCCESS;
> >+}
> >+
> >+static int DeviceHotplugReport(audio_output_t *aout, LPCWSTR wid,
> >+                               IMMDevice *dev)
> >+{
> >+    char *id, *name;
> >+    int ret = DeviceGetFriendlyName(wid, dev, &id, &name);
> >+    if (ret == VLC_SUCCESS)
> >+        aout_HotplugReport(aout, id, name);
> >+    free(id);
> >+    free(name);
> >+    return ret;
> > }
> > 
> > /** Checks that a device is an output device */
> >-- 
> >2.11.0
> >
> >_______________________________________________
> >vlc-devel mailing list
> >To unsubscribe or modify your subscription options:
> >https://mailman.videolan.org/listinfo/vlc-devel
> 
> Splitting the Friendly name lookup is probably OK, but why mix ID 
> conversion in it??

Because fetching the friendly name can fail. In that case: name = id;

> -- 
> 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