[PATCH v3 1/3] mmdevapi: Make MMDevEnumerator a static variable.
Andrew Eikum
aeikum at codeweavers.com
Fri Jun 4 10:29:45 CDT 2021
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Thu, Jun 03, 2021 at 06:15:29PM +0200, Rémi Bernon wrote:
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>
> v3: Keep enumerator refcounting, as there are tests checking it.
>
> dlls/mmdevapi/devenum.c | 28 +++++++++++-----------------
> 1 file changed, 11 insertions(+), 17 deletions(-)
>
> diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
> index fc33cac17ec..38ae5f8962d 100644
> --- a/dlls/mmdevapi/devenum.c
> +++ b/dlls/mmdevapi/devenum.c
> @@ -59,7 +59,6 @@ typedef struct MMDevEnumImpl
> LONG ref;
> } MMDevEnumImpl;
>
> -static MMDevEnumImpl *MMDevEnumerator;
> static MMDevice **MMDevice_head;
> static MMDevice *MMDevice_def_rec, *MMDevice_def_play;
> static DWORD MMDevice_count;
> @@ -69,6 +68,7 @@ static const IMMDeviceVtbl MMDeviceVtbl;
> static const IPropertyStoreVtbl MMDevPropVtbl;
> static const IMMEndpointVtbl MMEndpointVtbl;
>
> +static MMDevEnumImpl enumerator;
> static IMMDevice info_device;
>
> typedef struct MMDevColImpl
> @@ -860,23 +860,15 @@ static const IMMDeviceCollectionVtbl MMDevColVtbl =
>
> HRESULT MMDevEnum_Create(REFIID riid, void **ppv)
> {
> - MMDevEnumImpl *This = MMDevEnumerator;
> -
> - if (!This)
> + if (enumerator.ref == 0)
> {
> - This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
> - *ppv = NULL;
> - if (!This)
> - return E_OUTOFMEMORY;
> - This->ref = 1;
> - This->IMMDeviceEnumerator_iface.lpVtbl = &MMDevEnumVtbl;
> - MMDevEnumerator = This;
> -
> + enumerator.ref = 1;
> load_devices_from_reg();
> load_driver_devices(eRender);
> load_driver_devices(eCapture);
> }
> - return IMMDeviceEnumerator_QueryInterface(&This->IMMDeviceEnumerator_iface, riid, ppv);
> +
> + return IMMDeviceEnumerator_QueryInterface(&enumerator.IMMDeviceEnumerator_iface, riid, ppv);
> }
>
> void MMDevEnum_Free(void)
> @@ -886,8 +878,6 @@ void MMDevEnum_Free(void)
> RegCloseKey(key_render);
> RegCloseKey(key_capture);
> key_render = key_capture = NULL;
> - HeapFree(GetProcessHeap(), 0, MMDevEnumerator);
> - MMDevEnumerator = NULL;
> }
>
> static HRESULT WINAPI MMDevEnum_QueryInterface(IMMDeviceEnumerator *iface, REFIID riid, void **ppv)
> @@ -920,8 +910,6 @@ static ULONG WINAPI MMDevEnum_Release(IMMDeviceEnumerator *iface)
> {
> MMDevEnumImpl *This = impl_from_IMMDeviceEnumerator(iface);
> LONG ref = InterlockedDecrement(&This->ref);
> - if (!ref)
> - MMDevEnum_Free();
> TRACE("Refcount now %i\n", ref);
> return ref;
> }
> @@ -1287,6 +1275,12 @@ static const IMMDeviceEnumeratorVtbl MMDevEnumVtbl =
> MMDevEnum_UnregisterEndpointNotificationCallback
> };
>
> +static MMDevEnumImpl enumerator =
> +{
> + {&MMDevEnumVtbl},
> + 0,
> +};
> +
> static HRESULT MMDevPropStore_Create(MMDevice *parent, DWORD access, IPropertyStore **ppv)
> {
> MMDevPropStore *This;
> --
> 2.31.0
>
>
More information about the wine-devel
mailing list