[vlc-devel] [PATCH 3/7] mmdevice: split DeviceHotplugReport()
Rémi Denis-Courmont
remi at remlab.net
Tue Feb 27 15:39:17 CET 2018
Le 27 février 2018 15:13:20 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>
>
>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
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
I don't really see how that justifies the functionality aggregation. And you need to handle failure in any case, since ID conversion can fail too.
--
Remi Denis-Courmont
More information about the vlc-devel
mailing list