[vlc-devel] [PATCH 4/7] mmdevice: refactor DevicesEnum()

Thomas Guillem thomas at gllm.fr
Tue Feb 27 16:21:23 CET 2018


On Tue, Feb 27, 2018, at 15:35, Rémi Denis-Courmont wrote:
> Le 27 février 2018 12:41:08 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
> >In order to be used by the change_string_cb callback (see next commit).
> >---
> > modules/audio_output/mmdevice.c | 23 ++++++++++++++++++-----
> > 1 file changed, 18 insertions(+), 5 deletions(-)
> >
> >diff --git a/modules/audio_output/mmdevice.c
> >b/modules/audio_output/mmdevice.c
> >index cc5bbf0eec..9561b8701d 100644
> >--- a/modules/audio_output/mmdevice.c
> >+++ b/modules/audio_output/mmdevice.c
> >@@ -708,16 +708,20 @@ static const struct IMMNotificationClientVtbl
> >vlc_MMNotificationClient =
> >     vlc_MMNotificationClient_OnPropertyValueChanged,
> > };
> > 
> >-static int DevicesEnum(audio_output_t *aout, IMMDeviceEnumerator *it)
> >+static int DevicesEnum(vlc_object_t *this, IMMDeviceEnumerator *it,
> >+                       void (*added_cb)(vlc_object_t *, void *data,
> >LPCWSTR wid,
> >+                                        IMMDevice *dev),
> >+                       void *added_cb_data)
> > {
> >     HRESULT hr;
> >     IMMDeviceCollection *devs;
> >+    assert(added_cb != NULL);
> > 
> >     hr = IMMDeviceEnumerator_EnumAudioEndpoints(it, eRender,
> >                                           DEVICE_STATE_ACTIVE, &devs);
> >     if (FAILED(hr))
> >     {
> >-        msg_Warn(aout, "cannot enumerate audio endpoints (error
> >0x%lx)", hr);
> >+        msg_Warn(this, "cannot enumerate audio endpoints (error
> >0x%lx)", hr);
> >         return -1;
> >     }
> > 
> >@@ -725,7 +729,7 @@ static int DevicesEnum(audio_output_t *aout,
> >IMMDeviceEnumerator *it)
> >     hr = IMMDeviceCollection_GetCount(devs, &count);
> >     if (FAILED(hr))
> >     {
> >-        msg_Warn(aout, "cannot count audio endpoints (error 0x%lx)",
> >hr);
> >+        msg_Warn(this, "cannot count audio endpoints (error 0x%lx)",
> >hr);
> >         count = 0;
> >     }
> > 
> >@@ -748,7 +752,7 @@ static int DevicesEnum(audio_output_t *aout,
> >IMMDeviceEnumerator *it)
> >             continue;
> >         }
> > 
> >-        DeviceHotplugReport(aout, devid, dev);
> >+        added_cb(this, added_cb_data, devid, dev);
> >         IMMDevice_Release(dev);
> >         CoTaskMemFree(devid);
> >         n++;
> >@@ -1067,6 +1071,15 @@ static HRESULT MMSession(audio_output_t *aout,
> >IMMDeviceEnumerator *it)
> >     return S_OK;
> > }
> > 
> >+static void MMThread_DevicesEnum_Added(vlc_object_t *this, void *data,
> >+                                       LPCWSTR wid, IMMDevice *dev)
> >+{
> >+    audio_output_t *aout = (void *) this;
> >+    (void) data;
> >+
> >+    DeviceHotplugReport(aout, wid, dev);
> >+}
> >+
> > static void *MMThread(void *data)
> > {
> >     audio_output_t *aout = data;
> >@@ -1076,7 +1089,7 @@ static void *MMThread(void *data)
> >     EnterMTA();
> >     IMMDeviceEnumerator_RegisterEndpointNotificationCallback(it,
> >                                                  &sys->device_events);
> >-    DevicesEnum(aout, it);
> >+    DevicesEnum(VLC_OBJECT(aout), it, MMThread_DevicesEnum_Added,
> >NULL);
> > 
> >     EnterCriticalSection(&sys->lock);
> > 
> >-- 
> >2.11.0
> >
> >_______________________________________________
> >vlc-devel mailing list
> >To unsubscribe or modify your subscription options:
> >https://mailman.videolan.org/listinfo/vlc-devel
> 
> Do you really need effectively two context pointers for the callback? 
> that seems rather unusual and hackish.

The vlc_object_t is for the logs, the void *data is for the context.

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