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

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


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



More information about the vlc-devel mailing list