-- v2: winepulse: Refactor get_device_name_from_guid() to allocate memory dynamically. wineoss: Refactor get_device_name_from_guid() to allocate memory dynamically. winecoreaudio: Refactor get_device_name_from_guid() to allocate memory dynamically. winealsa: Refactor get_device_name_from_guid() to allocate memory dynamically. winepulse: Return E_UNEXPECTED with invalid dataflow in GetAudioEndpoint. wineoss: Return E_UNEXPECTED with invalid dataflow in GetAudioEndpoint. winecoreaudio: Return E_UNEXPECTED with invalid dataflow in GetAudioEndpoint.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/client.c | 67 ++++++++++++++------- dlls/winealsa.drv/mmdevdrv.c | 96 +------------------------------ dlls/winecoreaudio.drv/mmdevdrv.c | 96 +------------------------------ dlls/wineoss.drv/mmdevdrv.c | 96 +------------------------------ dlls/winepulse.drv/mmdevdrv.c | 96 +------------------------------ 5 files changed, 50 insertions(+), 401 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 8779ae1dc23..11a0a572d98 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -406,7 +406,7 @@ const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = capture_GetNextPacketSize };
-HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, REFIID riid, void **ppv) +static HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, REFIID riid, void **ppv) { TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
@@ -431,7 +431,7 @@ HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, REFIID riid, void **p return S_OK; }
-ULONG WINAPI client_AddRef(IAudioClient3 *iface) +static ULONG WINAPI client_AddRef(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); ULONG ref = InterlockedIncrement(&This->ref); @@ -439,7 +439,7 @@ ULONG WINAPI client_AddRef(IAudioClient3 *iface) return ref; }
-ULONG WINAPI client_Release(IAudioClient3 *iface) +static ULONG WINAPI client_Release(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); ULONG ref = InterlockedDecrement(&This->ref); @@ -467,7 +467,7 @@ ULONG WINAPI client_Release(IAudioClient3 *iface) return ref; }
-HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, +static HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, REFERENCE_TIME period, const WAVEFORMATEX *fmt, const GUID *sessionguid) { @@ -562,7 +562,7 @@ exit: return params.result; }
-HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) +static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) { struct audio_client *This = impl_from_IAudioClient3(iface); struct get_buffer_size_params params; @@ -583,7 +583,7 @@ HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) return params.result; }
-HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, REFERENCE_TIME *latency) +static HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, REFERENCE_TIME *latency) { struct audio_client *This = impl_from_IAudioClient3(iface); struct get_latency_params params; @@ -604,7 +604,7 @@ HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, REFERENCE_TIME *lat return params.result; }
-HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, UINT32 *out) +static HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, UINT32 *out) { struct audio_client *This = impl_from_IAudioClient3(iface); struct get_current_padding_params params; @@ -625,7 +625,7 @@ HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, UINT32 *out) return params.result; }
-HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, +static HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, WAVEFORMATEX **out) { struct audio_client *This = impl_from_IAudioClient3(iface); @@ -658,7 +658,7 @@ HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, AUDCLNT_SHAREMODE return params.result; }
-HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, WAVEFORMATEX **pwfx) +static HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, WAVEFORMATEX **pwfx) { struct audio_client *This = impl_from_IAudioClient3(iface); struct get_mix_format_params params; @@ -687,7 +687,7 @@ HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, WAVEFORMATEX **pwfx) return params.result; }
-HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIME *defperiod, +static HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) { struct audio_client *This = impl_from_IAudioClient3(iface); @@ -708,7 +708,7 @@ HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIME *defp return params.result; }
-HRESULT WINAPI client_Start(IAudioClient3 *iface) +static HRESULT WINAPI client_Start(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); struct start_params params; @@ -739,7 +739,7 @@ HRESULT WINAPI client_Start(IAudioClient3 *iface) return params.result; }
-HRESULT WINAPI client_Stop(IAudioClient3 *iface) +static HRESULT WINAPI client_Stop(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); struct stop_params params; @@ -756,7 +756,7 @@ HRESULT WINAPI client_Stop(IAudioClient3 *iface) return params.result; }
-HRESULT WINAPI client_Reset(IAudioClient3 *iface) +static HRESULT WINAPI client_Reset(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); struct reset_params params; @@ -773,7 +773,7 @@ HRESULT WINAPI client_Reset(IAudioClient3 *iface) return params.result; }
-HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, HANDLE event) +static HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, HANDLE event) { struct audio_client *This = impl_from_IAudioClient3(iface); struct set_event_handle_params params; @@ -794,7 +794,7 @@ HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, HANDLE event) return params.result; }
-HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, void **ppv) +static HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, void **ppv) { struct audio_client *This = impl_from_IAudioClient3(iface); HRESULT hr; @@ -869,7 +869,7 @@ exit: return hr; }
-HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, AUDIO_STREAM_CATEGORY category, +static HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) { struct audio_client *This = impl_from_IAudioClient3(iface); @@ -884,7 +884,7 @@ HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, AUDIO_STREAM_CATEGO return S_OK; }
-HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, +static HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, const AudioClientProperties *prop) { struct audio_client *This = impl_from_IAudioClient3(iface); @@ -913,7 +913,7 @@ HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, return S_OK; }
-HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, const WAVEFORMATEX *format, +static HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, REFERENCE_TIME *max_duration) { @@ -922,7 +922,7 @@ HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, const WAVEFORMAT return E_NOTIMPL; }
-HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, +static HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, @@ -936,7 +936,7 @@ HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, return E_NOTIMPL; }
-HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +static HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) { @@ -945,7 +945,7 @@ HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, return E_NOTIMPL; }
-HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, DWORD flags, +static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, const GUID *session_guid) @@ -955,6 +955,31 @@ HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, DWORD fl return E_NOTIMPL; }
+const IAudioClient3Vtbl AudioClient3_Vtbl = +{ + client_QueryInterface, + client_AddRef, + client_Release, + client_Initialize, + client_GetBufferSize, + client_GetStreamLatency, + client_GetCurrentPadding, + client_IsFormatSupported, + client_GetMixFormat, + client_GetDevicePeriod, + client_Start, + client_Stop, + client_Reset, + client_SetEventHandle, + client_GetService, + client_IsOffloadCapable, + client_SetClientProperties, + client_GetBufferSizeLimits, + client_GetSharedModeEnginePeriod, + client_GetCurrentSharedModeEnginePeriod, + client_InitializeSharedAudioStream, +}; + static HRESULT WINAPI clock_QueryInterface(IAudioClock *iface, REFIID riid, void **ppv) { struct audio_client *This = impl_from_IAudioClock(iface); diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 507613e71ad..52a56a9c281 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -66,7 +66,7 @@ static struct list g_sessions = LIST_INIT(g_sessions); static WCHAR drv_key_devicesW[256]; static const WCHAR guidW[] = {'g','u','i','d',0};
-static const IAudioClient3Vtbl AudioClient3_Vtbl; +extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; @@ -89,11 +89,6 @@ void DECLSPEC_HIDDEN sessions_unlock(void) LeaveCriticalSection(&g_sessions_lock); }
-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) -{ - return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -363,13 +358,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, - REFIID riid, void **ppv); - -extern ULONG WINAPI client_AddRef(IAudioClient3 *iface); - -extern ULONG WINAPI client_Release(IAudioClient3 *iface); - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -449,88 +437,6 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, - REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid); - -extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, - UINT32 *out); - -extern HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, - REFERENCE_TIME *latency); - -extern HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, - UINT32 *out); - -extern HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, - WAVEFORMATEX **out); - -extern HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, - WAVEFORMATEX **pwfx); - -extern HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, - REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod); - -extern HRESULT WINAPI client_Start(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Stop(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Reset(IAudioClient3 *iface); - -extern HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, - HANDLE event); - -extern HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, - void **ppv); - -extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, - AUDIO_STREAM_CATEGORY category, BOOL *offload_capable); - -extern HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, - const AudioClientProperties *prop); - -extern HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, - const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, - REFERENCE_TIME *max_duration); - -extern HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, - const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, - UINT32 *min_period_frames, UINT32 *max_period_frames); - -extern HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, - WAVEFORMATEX **cur_format, UINT32 *cur_period_frames); - -extern HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, - DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, - const GUID *session_guid); - -static const IAudioClient3Vtbl AudioClient3_Vtbl = -{ - client_QueryInterface, - client_AddRef, - client_Release, - client_Initialize, - client_GetBufferSize, - client_GetStreamLatency, - client_GetCurrentPadding, - client_IsFormatSupported, - client_GetMixFormat, - client_GetDevicePeriod, - client_Start, - client_Stop, - client_Reset, - client_SetEventHandle, - client_GetService, - client_IsOffloadCapable, - client_SetClientProperties, - client_GetBufferSizeLimits, - client_GetSharedModeEnginePeriod, - client_GetCurrentSharedModeEnginePeriod, - client_InitializeSharedAudioStream, -}; - HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index f4e3416dcc6..d88346d9fe5 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -48,7 +48,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(coreaudio);
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
-static const IAudioClient3Vtbl AudioClient3_Vtbl; +extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; @@ -83,11 +83,6 @@ void DECLSPEC_HIDDEN sessions_unlock(void) LeaveCriticalSection(&g_sessions_lock); }
-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) -{ - return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -359,13 +354,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, - REFIID riid, void **ppv); - -extern ULONG WINAPI client_AddRef(IAudioClient3 *iface); - -extern ULONG WINAPI client_Release(IAudioClient3 *iface); - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -445,88 +433,6 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, - REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid); - -extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, - UINT32 *frames); - -extern HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, - REFERENCE_TIME *out); - -extern HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, - UINT32 *numpad); - -extern HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, - WAVEFORMATEX **outpwfx); - -extern HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, - WAVEFORMATEX **pwfx); - -extern HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, - REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod); - -extern HRESULT WINAPI client_Start(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Stop(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Reset(IAudioClient3 *iface); - -extern HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, - HANDLE event); - -extern HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, - void **ppv); - -extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, - AUDIO_STREAM_CATEGORY category, BOOL *offload_capable); - -extern HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, - const AudioClientProperties *prop); - -extern HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, - const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, - REFERENCE_TIME *max_duration); - -extern HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, - const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, - UINT32 *min_period_frames, UINT32 *max_period_frames); - -extern HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, - WAVEFORMATEX **cur_format, UINT32 *cur_period_frames); - -extern HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, - DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, - const GUID *session_guid); - -static const IAudioClient3Vtbl AudioClient3_Vtbl = -{ - client_QueryInterface, - client_AddRef, - client_Release, - client_Initialize, - client_GetBufferSize, - client_GetStreamLatency, - client_GetCurrentPadding, - client_IsFormatSupported, - client_GetMixFormat, - client_GetDevicePeriod, - client_Start, - client_Stop, - client_Reset, - client_SetEventHandle, - client_GetService, - client_IsOffloadCapable, - client_SetClientProperties, - client_GetBufferSizeLimits, - client_GetSharedModeEnginePeriod, - client_GetCurrentSharedModeEnginePeriod, - client_InitializeSharedAudioStream, -}; - HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 48c600b089f..3322374cb90 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -72,7 +72,7 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; static struct list g_sessions = LIST_INIT(g_sessions);
-static const IAudioClient3Vtbl AudioClient3_Vtbl; +extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; @@ -95,11 +95,6 @@ void DECLSPEC_HIDDEN sessions_unlock(void) LeaveCriticalSection(&g_sessions_lock); }
-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) -{ - return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -341,13 +336,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, return S_OK; }
-extern HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, - REFIID riid, void **ppv); - -extern ULONG WINAPI client_AddRef(IAudioClient3 *iface); - -extern ULONG WINAPI client_Release(IAudioClient3 *iface); - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -427,88 +415,6 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, - REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid); - -extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, - UINT32 *frames); - -extern HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, - REFERENCE_TIME *latency); - -extern HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, - UINT32 *numpad); - -extern HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, - WAVEFORMATEX **out); - -extern HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, - WAVEFORMATEX **pwfx); - -extern HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, - REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod); - -extern HRESULT WINAPI client_Start(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Stop(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Reset(IAudioClient3 *iface); - -extern HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, - HANDLE event); - -extern HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, - void **ppv); - -extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, - AUDIO_STREAM_CATEGORY category, BOOL *offload_capable); - -extern HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, - const AudioClientProperties *prop); - -extern HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, - const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, - REFERENCE_TIME *max_duration); - -extern HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, - const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, - UINT32 *min_period_frames, UINT32 *max_period_frames); - -extern HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, - WAVEFORMATEX **cur_format, UINT32 *cur_period_frames); - -extern HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, - DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, - const GUID *session_guid); - -static const IAudioClient3Vtbl AudioClient3_Vtbl = -{ - client_QueryInterface, - client_AddRef, - client_Release, - client_Initialize, - client_GetBufferSize, - client_GetStreamLatency, - client_GetCurrentPadding, - client_IsFormatSupported, - client_GetMixFormat, - client_GetDevicePeriod, - client_Start, - client_Stop, - client_Reset, - client_SetEventHandle, - client_GetService, - client_IsOffloadCapable, - client_SetClientProperties, - client_GetBufferSizeLimits, - client_GetSharedModeEnginePeriod, - client_GetCurrentSharedModeEnginePeriod, - client_InitializeSharedAudioStream, -}; - HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index abde1c80b2a..b3b0bad2990 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -118,7 +118,7 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) return TRUE; }
-static const IAudioClient3Vtbl AudioClient3_Vtbl; +extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; @@ -131,11 +131,6 @@ extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) -{ - return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); -} - static void pulse_call(enum unix_funcs code, void *params) { NTSTATUS status; @@ -377,13 +372,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern HRESULT WINAPI client_QueryInterface(IAudioClient3 *iface, - REFIID riid, void **ppv); - -extern ULONG WINAPI client_AddRef(IAudioClient3 *iface); - -extern ULONG WINAPI client_Release(IAudioClient3 *iface); - static void session_init_vols(AudioSession *session, UINT channels) { if (session->channel_count < channels) { @@ -463,88 +451,6 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, - REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid); - -extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, - UINT32 *out); - -extern HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, - REFERENCE_TIME *latency); - -extern HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, - UINT32 *out); - -extern HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, - AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, - WAVEFORMATEX **out); - -extern HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, - WAVEFORMATEX **pwfx); - -extern HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, - REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod); - -extern HRESULT WINAPI client_Start(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Stop(IAudioClient3 *iface); - -extern HRESULT WINAPI client_Reset(IAudioClient3 *iface); - -extern HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, - HANDLE event); - -extern HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, - void **ppv); - -extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, - AUDIO_STREAM_CATEGORY category, BOOL *offload_capable); - -extern HRESULT WINAPI client_SetClientProperties(IAudioClient3 *iface, - const AudioClientProperties *prop); - -extern HRESULT WINAPI client_GetBufferSizeLimits(IAudioClient3 *iface, - const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, - REFERENCE_TIME *max_duration); - -extern HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, - const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, - UINT32 *min_period_frames, UINT32 *max_period_frames); - -extern HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, - WAVEFORMATEX **cur_format, UINT32 *cur_period_frames); - -extern HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, - DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, - const GUID *session_guid); - -static const IAudioClient3Vtbl AudioClient3_Vtbl = -{ - client_QueryInterface, - client_AddRef, - client_Release, - client_Initialize, - client_GetBufferSize, - client_GetStreamLatency, - client_GetCurrentPadding, - client_IsFormatSupported, - client_GetMixFormat, - client_GetDevicePeriod, - client_Start, - client_Stop, - client_Reset, - client_SetEventHandle, - client_GetService, - client_IsOffloadCapable, - client_SetClientProperties, - client_GetBufferSizeLimits, - client_GetSharedModeEnginePeriod, - client_GetCurrentSharedModeEnginePeriod, - client_InitializeSharedAudioStream, -}; - HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index d88346d9fe5..9903640c66a 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -322,7 +322,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return AUDCLNT_E_DEVICE_INVALIDATED;
if(dataflow != eRender && dataflow != eCapture) - return E_INVALIDARG; + return E_UNEXPECTED;
name_len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[name_len + 1]));
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 3322374cb90..6bc1002bff7 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -306,6 +306,10 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, WARN("Unknown GUID: %s\n", debugstr_guid(guid)); return AUDCLNT_E_DEVICE_INVALIDATED; } + + if(oss_dev->flow != eRender && oss_dev->flow != eCapture) + return E_UNEXPECTED; + len = strlen(oss_dev->devnode); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); if(!This)
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index b3b0bad2990..908202c44a8 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -342,6 +342,9 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient if (!get_pulse_name_by_guid(guid, pulse_name, &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED;
+ if (dataflow != eRender && dataflow != eCapture) + return E_UNEXPECTED; + *out = NULL;
len = strlen(pulse_name) + 1;
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 40 ++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 9 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 52a56a9c281..31e3baa4eb4 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -251,7 +251,7 @@ end: return params.result; }
-static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EDataFlow *flow) +static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { HKEY devices_key; UINT i = 0; @@ -282,6 +282,8 @@ static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EData if(RegQueryValueExW(key, guidW, 0, &type, (BYTE*)®_guid, &size) == ERROR_SUCCESS){ if(IsEqualGUID(®_guid, guid)){ + INT size; + RegCloseKey(key); RegCloseKey(devices_key);
@@ -296,7 +298,16 @@ static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EData return FALSE; }
- WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, name, name_size, NULL, NULL); + if(!(size = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL))) + return FALSE; + + if(!(*name = malloc(size))) + return FALSE; + + if(!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, size, NULL, NULL)){ + free(name); + return FALSE; + }
return TRUE; } @@ -315,23 +326,30 @@ static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EData HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - char alsa_name[256]; + char *alsa_name; EDataFlow dataflow; HRESULT hr; int len;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- if(!get_alsa_name_by_guid(guid, alsa_name, sizeof(alsa_name), &dataflow)) + if(!get_device_name_from_guid(guid, &alsa_name, &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED;
- if(dataflow != eRender && dataflow != eCapture) + if(dataflow != eRender && dataflow != eCapture){ + free(alsa_name); return E_UNEXPECTED; + }
len = strlen(alsa_name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); - if(!This) + if(!This){ + free(alsa_name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, alsa_name, len + 1); + free(alsa_name);
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; @@ -347,7 +365,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient }
This->dataflow = dataflow; - memcpy(This->device_name, alsa_name, len + 1);
This->parent = dev; IMMDevice_AddRef(This->parent); @@ -458,13 +475,13 @@ HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; - char name[256]; + char *name; EDataFlow flow; unsigned int size = 0;
TRACE("%s, (%s,%lu), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out);
- if(!get_alsa_name_by_guid(guid, name, sizeof(name), &flow)) + if(!get_device_name_from_guid(guid, &name, &flow)) { WARN("Unknown interface %s\n", debugstr_guid(guid)); return E_NOINTERFACE; @@ -487,10 +504,15 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI CoTaskMemFree(params.buffer); params.buffer = CoTaskMemAlloc(*params.buffer_size); if(!params.buffer) + { + free(name); return E_OUTOFMEMORY; + } } if(FAILED(params.result)) CoTaskMemFree(params.buffer);
+ free(name); + return params.result; }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 9903640c66a..3f24ca6a6c6 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -247,7 +247,7 @@ end: return params.result; }
-static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T name_size, EDataFlow *flow) +static BOOL get_device_name_from_guid(const GUID *guid, char **name, EDataFlow *flow) { HKEY devices_key; UINT i = 0; @@ -292,7 +292,16 @@ static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T n return FALSE; }
- WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, name, name_size, NULL, NULL); + if(!(size = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL))) + return FALSE; + + if(!(*name = malloc(size))) + return FALSE; + + if(!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, size, NULL, NULL)){ + free(name); + return FALSE; + }
return TRUE; } @@ -311,23 +320,30 @@ static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T n HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - char name[256]; + char *name; SIZE_T name_len; EDataFlow dataflow; HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- if(!get_device_name_by_guid(guid, name, sizeof(name), &dataflow)) + if(!get_device_name_from_guid(guid, &name, &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED;
- if(dataflow != eRender && dataflow != eCapture) + if(dataflow != eRender && dataflow != eCapture){ + free(name); return E_UNEXPECTED; + }
name_len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[name_len + 1])); - if(!This) + if(!This){ + free(name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, name, name_len + 1); + free(name);
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; @@ -337,7 +353,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl;
This->dataflow = dataflow; - memcpy(This->device_name, name, name_len + 1);
hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); if (FAILED(hr)) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 50 ++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 17 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 6bc1002bff7..63e6f53764b 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -204,21 +204,31 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid) RegCloseKey(key); }
-static const OSSDevice *get_ossdevice_from_guid(const GUID *guid) +static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { OSSDevice *dev_item; LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry) - if(IsEqualGUID(guid, &dev_item->guid)) - return dev_item; - return NULL; + if(IsEqualGUID(guid, &dev_item->guid)){ + if((*name = strdup(dev_item->devnode))){ + return TRUE; + } + + return FALSE; + } + + return FALSE; }
static void device_add(OSSDevice *oss_dev) { - if(get_ossdevice_from_guid(&oss_dev->guid)) /* already in list */ - HeapFree(GetProcessHeap(), 0, oss_dev); - else - list_add_tail(&g_devices, &oss_dev->entry); + OSSDevice *dev_item; + LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry) + if(IsEqualGUID(&oss_dev->guid, &dev_item->guid)){ /* already in list */ + HeapFree(GetProcessHeap(), 0, oss_dev); + return; + } + + list_add_tail(&g_devices, &oss_dev->entry); }
HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out, @@ -295,25 +305,32 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - const OSSDevice *oss_dev; - HRESULT hr; + char *name; int len; + EDataFlow dataflow; + HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- oss_dev = get_ossdevice_from_guid(guid); - if(!oss_dev){ + if(!get_device_name_from_guid(guid, &name, &dataflow)){ WARN("Unknown GUID: %s\n", debugstr_guid(guid)); return AUDCLNT_E_DEVICE_INVALIDATED; }
- if(oss_dev->flow != eRender && oss_dev->flow != eCapture) + if(dataflow != eRender && dataflow != eCapture){ + free(name); return E_UNEXPECTED; + }
- len = strlen(oss_dev->devnode); + len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); - if(!This) + if(!This){ + free(name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, name, len + 1); + free(name);
hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); if (FAILED(hr)) { @@ -321,8 +338,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, return hr; }
- This->dataflow = oss_dev->flow; - strcpy(This->device_name, oss_dev->devnode); + This->dataflow = dataflow;
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 58 ++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 15 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 908202c44a8..067cfa2e113 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -245,7 +245,7 @@ end: return params.result; }
-static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_NAME_LEN], EDataFlow *flow) +static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { struct device_cache *device; WCHAR key_name[MAX_PULSE_NAME_LEN + 2]; @@ -253,13 +253,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N DWORD index = 0; HKEY key;
+ *name = NULL; + /* Return empty string for default PulseAudio device */ - pulse_name[0] = 0; if (IsEqualGUID(guid, &pulse_render_guid)) { *flow = eRender; - return TRUE; + if (!(*name = malloc(1))) + return FALSE; } else if (IsEqualGUID(guid, &pulse_capture_guid)) { *flow = eCapture; + if (!(*name = malloc(1))) + return FALSE; + } + + if (*name) { + *name[0] = '\0'; return TRUE; }
@@ -268,8 +276,10 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N if (!IsEqualGUID(guid, &device->guid)) continue; *flow = device->dataflow; - strcpy(pulse_name, device->pulse_name); - return TRUE; + if ((*name = strdup(device->pulse_name))) + return TRUE; + + return FALSE; }
if (RegOpenKeyExW(HKEY_CURRENT_USER, drv_key_devicesW, 0, KEY_READ | KEY_WOW64_64KEY, &key) != ERROR_SUCCESS) { @@ -311,13 +321,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N return FALSE; }
- if (!(len = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, pulse_name, MAX_PULSE_NAME_LEN, NULL, NULL))) + if (!(len = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL))) + return FALSE; + + if (!(*name = malloc(len))) return FALSE;
+ if (!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, len, NULL, NULL)) { + free(name); + return FALSE; + } + if ((device = malloc(FIELD_OFFSET(struct device_cache, pulse_name[len])))) { device->guid = reg_guid; device->dataflow = *flow; - strcpy(device->pulse_name, pulse_name); + memcpy(device->pulse_name, *name, len); list_add_tail(&g_devices_cache, &device->entry); } return TRUE; @@ -332,25 +350,32 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - char pulse_name[MAX_PULSE_NAME_LEN]; + char *pulse_name; EDataFlow dataflow; unsigned len; HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- if (!get_pulse_name_by_guid(guid, pulse_name, &dataflow)) + if (!get_device_name_from_guid(guid, &pulse_name, &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED;
- if (dataflow != eRender && dataflow != eCapture) + if (dataflow != eRender && dataflow != eCapture) { + free(pulse_name); return E_UNEXPECTED; + }
*out = NULL;
len = strlen(pulse_name) + 1; This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(ACImpl, device_name[len])); - if (!This) + if (!This) { + free(pulse_name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, pulse_name, len); + free(pulse_name);
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; @@ -360,7 +385,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; This->dataflow = dataflow; This->parent = dev; - memcpy(This->device_name, pulse_name, len);
hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal); if (FAILED(hr)) { @@ -475,12 +499,12 @@ HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; - char pulse_name[MAX_PULSE_NAME_LEN]; + char *pulse_name; unsigned int size = 0;
TRACE("%s, (%s,%lu), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out);
- if (!get_pulse_name_by_guid(guid, pulse_name, ¶ms.flow)) + if (!get_device_name_from_guid(guid, &pulse_name, ¶ms.flow)) return E_FAIL;
params.device = pulse_name; @@ -498,11 +522,15 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI
CoTaskMemFree(params.buffer); params.buffer = CoTaskMemAlloc(*params.buffer_size); - if(!params.buffer) + if(!params.buffer) { + free(pulse_name); return E_OUTOFMEMORY; + } } if(FAILED(params.result)) CoTaskMemFree(params.buffer);
+ free(pulse_name); + return params.result; }
In the commit message(s) I wrote `get_device_name_from_guid()` (with the parentheses), is it alright?
Huw Davies (@huw) commented about dlls/winealsa.drv/mmdevdrv.c:
return FALSE; }
WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, name, name_size, NULL, NULL);
if(!(size = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL)))
return FALSE;
if(!(*name = malloc(size)))
return FALSE;
if(!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, size, NULL, NULL)){
free(name);
```suggestion:-0+0 free(*name); ```
On Thu Jun 29 10:44:04 2023 +0000, Huw Davies wrote:
free(*name);
Oops.