From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/Makefile.in | 5 +++-- dlls/mmdevapi/devenum.c | 1 - dlls/mmdevapi/uuid.c | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 dlls/mmdevapi/uuid.c
diff --git a/dlls/mmdevapi/Makefile.in b/dlls/mmdevapi/Makefile.in index 027854ea97b..1ffa00c9c68 100644 --- a/dlls/mmdevapi/Makefile.in +++ b/dlls/mmdevapi/Makefile.in @@ -1,5 +1,5 @@ MODULE = mmdevapi.dll -IMPORTS = uuid ole32 oleaut32 user32 advapi32 version +IMPORTS = ole32 oleaut32 user32 advapi32 version
C_SRCS = \ audiosessionmanager.c \ @@ -8,6 +8,7 @@ C_SRCS = \ devenum.c \ main.c \ session.c \ - spatialaudio.c + spatialaudio.c \ + uuid.c
IDL_SRCS = mmdevapi_classes.idl diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 2b7833edd08..e42aaf7613f 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -27,7 +27,6 @@ #include "wine/debug.h" #include "wine/list.h"
-#include "initguid.h" #include "ole2.h" #include "mmdeviceapi.h" #include "dshow.h" diff --git a/dlls/mmdevapi/uuid.c b/dlls/mmdevapi/uuid.c new file mode 100644 index 00000000000..0129c7615d4 --- /dev/null +++ b/dlls/mmdevapi/uuid.c @@ -0,0 +1,11 @@ +#include <initguid.h> + +#include <amstream.h> +#include <audioclient.h> +#include <audiopolicy.h> +#include <devpkey.h> +#include <dsound.h> +#include <endpointvolume.h> +#include <mmdeviceapi.h> +#include <spatialaudioclient.h> +#include <uuids.h>
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/audiosessionmanager.c | 6 ----- dlls/mmdevapi/session.c | 40 ++++++++++++++++++++++++++--- dlls/mmdevapi/uuid.c | 2 ++ dlls/winealsa.drv/mmdevdrv.c | 39 ++-------------------------- dlls/winecoreaudio.drv/mmdevdrv.c | 38 ++------------------------- dlls/wineoss.drv/mmdevdrv.c | 38 ++------------------------- dlls/winepulse.drv/mmdevdrv.c | 38 ++------------------------- 7 files changed, 47 insertions(+), 154 deletions(-)
diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index abba0ad3a1d..74368ea2be3 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -45,12 +45,6 @@ void sessions_unlock(void) LeaveCriticalSection(&g_sessions_lock); }
-HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, - struct audio_session **out) -{ - return E_NOTIMPL; -} - static inline struct session_mgr *impl_from_IAudioSessionManager2(IAudioSessionManager2 *iface) { return CONTAINING_RECORD(iface, struct session_mgr, IAudioSessionManager2_iface); diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 32718739f03..09b54222f51 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -40,7 +40,7 @@ extern void sessions_unlock(void) DECLSPEC_HIDDEN;
extern void set_stream_volumes(struct audio_client *This) DECLSPEC_HIDDEN;
-struct list sessions = LIST_INIT(sessions); +static struct list sessions = LIST_INIT(sessions);
static inline struct audio_session_wrapper *impl_from_IAudioSessionControl2(IAudioSessionControl2 *iface) { @@ -553,7 +553,7 @@ const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = simplevolume_GetMute };
-void session_init_vols(struct audio_session *session, UINT channels) +static void session_init_vols(struct audio_session *session, UINT channels) { if (session->channel_count < channels) { UINT i; @@ -574,7 +574,7 @@ void session_init_vols(struct audio_session *session, UINT channels) } }
-struct audio_session *session_create(const GUID *guid, IMMDevice *device, UINT channels) +static struct audio_session *session_create(const GUID *guid, IMMDevice *device, UINT channels) { struct audio_session *ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct audio_session)); @@ -618,3 +618,37 @@ struct audio_session_wrapper *session_wrapper_create(struct audio_client *client
return ret; } + +/* If channels == 0, then this will return or create a session with + * matching dataflow and GUID. Otherwise, channels must also match. */ +HRESULT get_audio_session(const GUID *guid, IMMDevice *device, UINT channels, + struct audio_session **out) +{ + struct audio_session *session; + + TRACE("(%s, %p, %u, %p)\n", debugstr_guid(guid), device, channels, out); + + if (!guid || IsEqualGUID(guid, &GUID_NULL)) { + if (!(*out = session_create(&GUID_NULL, device, channels))) + return E_OUTOFMEMORY; + + return S_OK; + } + + *out = NULL; + LIST_FOR_EACH_ENTRY(session, &sessions, struct audio_session, entry) { + if (session->device == device && + IsEqualGUID(guid, &session->guid)) { + session_init_vols(session, channels); + *out = session; + break; + } + } + + if (!*out) { + if (!(*out = session_create(guid, device, channels))) + return E_OUTOFMEMORY; + } + + return S_OK; +} diff --git a/dlls/mmdevapi/uuid.c b/dlls/mmdevapi/uuid.c index 0129c7615d4..e2c14e550aa 100644 --- a/dlls/mmdevapi/uuid.c +++ b/dlls/mmdevapi/uuid.c @@ -9,3 +9,5 @@ #include <mmdeviceapi.h> #include <spatialaudioclient.h> #include <uuids.h> + +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index a27916b37a5..49d649bc537 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -61,7 +61,6 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } }; static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; -extern struct list sessions;
static WCHAR drv_key_devicesW[256]; static const WCHAR guidW[] = {'g','u','i','d',0}; @@ -375,44 +374,10 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern void session_init_vols(AudioSession *session, UINT channels); - -extern AudioSession *session_create(const GUID *guid, IMMDevice *device, - UINT num_channels); - /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out) -{ - AudioSession *session; - - if(!sessionguid || IsEqualGUID(sessionguid, &GUID_NULL)){ - *out = session_create(&GUID_NULL, device, channels); - if(!*out) - return E_OUTOFMEMORY; - - return S_OK; - } - - *out = NULL; - LIST_FOR_EACH_ENTRY(session, &sessions, AudioSession, entry){ - if(session->device == device && - IsEqualGUID(sessionguid, &session->guid)){ - session_init_vols(session, channels); - *out = session; - break; - } - } - - if(!*out){ - *out = session_create(sessionguid, device, channels); - if(!*out) - return E_OUTOFMEMORY; - } - - return S_OK; -} +extern HRESULT get_audio_session(const GUID *sessionguid, + IMMDevice *device, UINT channels, AudioSession **out);
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 ef2e5033305..3aa774c9162 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -68,7 +68,6 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } }; static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; -extern struct list sessions;
extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN; @@ -369,43 +368,10 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern void session_init_vols(AudioSession *session, UINT channels); - -extern AudioSession *session_create(const GUID *guid, IMMDevice *device, - UINT num_channels); /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out) -{ - AudioSession *session; - - if(!sessionguid || IsEqualGUID(sessionguid, &GUID_NULL)){ - *out = session_create(&GUID_NULL, device, channels); - if(!*out) - return E_OUTOFMEMORY; - - return S_OK; - } - - *out = NULL; - LIST_FOR_EACH_ENTRY(session, &sessions, AudioSession, entry){ - if(session->device == device && - IsEqualGUID(sessionguid, &session->guid)){ - session_init_vols(session, channels); - *out = session; - break; - } - } - - if(!*out){ - *out = session_create(sessionguid, device, channels); - if(!*out) - return E_OUTOFMEMORY; - } - - return S_OK; -} +extern HRESULT get_audio_session(const GUID *sessionguid, + IMMDevice *device, UINT channels, AudioSession **out);
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 e69985f70f6..35ec7cc6757 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -70,7 +70,6 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } }; static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; -extern struct list sessions;
extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; @@ -359,43 +358,10 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, return S_OK; }
-extern void session_init_vols(AudioSession *session, UINT channels); - -extern AudioSession *session_create(const GUID *guid, IMMDevice *device, - UINT num_channels); /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out) -{ - AudioSession *session; - - if(!sessionguid || IsEqualGUID(sessionguid, &GUID_NULL)){ - *out = session_create(&GUID_NULL, device, channels); - if(!*out) - return E_OUTOFMEMORY; - - return S_OK; - } - - *out = NULL; - LIST_FOR_EACH_ENTRY(session, &sessions, AudioSession, entry){ - if(session->device == device && - IsEqualGUID(sessionguid, &session->guid)){ - session_init_vols(session, channels); - *out = session; - break; - } - } - - if(!*out){ - *out = session_create(sessionguid, device, channels); - if(!*out) - return E_OUTOFMEMORY; - } - - return S_OK; -} +extern HRESULT get_audio_session(const GUID *sessionguid, + IMMDevice *device, UINT channels, AudioSession **out);
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 dafaf5d2590..69658c4cfd1 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -56,7 +56,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(pulse);
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
-extern struct list sessions; static struct list g_devices_cache = LIST_INIT(g_devices_cache);
struct device_cache { @@ -399,43 +398,10 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-extern void session_init_vols(AudioSession *session, UINT channels); - -extern AudioSession *session_create(const GUID *guid, IMMDevice *device, - UINT num_channels); /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out) -{ - AudioSession *session; - - if (!sessionguid || IsEqualGUID(sessionguid, &GUID_NULL)) { - *out = session_create(&GUID_NULL, device, channels); - if (!*out) - return E_OUTOFMEMORY; - - return S_OK; - } - - *out = NULL; - LIST_FOR_EACH_ENTRY(session, &sessions, AudioSession, entry) { - if (session->device == device && - IsEqualGUID(sessionguid, &session->guid)) { - session_init_vols(session, channels); - *out = session; - break; - } - } - - if (!*out) { - *out = session_create(sessionguid, device, channels); - if (!*out) - return E_OUTOFMEMORY; - } - - return S_OK; -} +extern HRESULT get_audio_session(const GUID *sessionguid, + IMMDevice *device, UINT channels, AudioSession **out);
HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out)
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/audiosessionmanager.c | 7 +++++-- dlls/mmdevapi/main.c | 1 - dlls/mmdevapi/mmdevapi_private.h | 2 -- dlls/mmdevapi/session.c | 23 ++++++++++++++++++--- dlls/winepulse.drv/mmdevdrv.c | 29 --------------------------- dlls/winepulse.drv/winepulse.drv.spec | 1 - 6 files changed, 25 insertions(+), 38 deletions(-)
diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index 74368ea2be3..ba23634e54d 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -26,6 +26,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+extern HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, + struct audio_session_wrapper **out); + static CRITICAL_SECTION g_sessions_lock; static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = { @@ -102,7 +105,7 @@ static HRESULT WINAPI ASM_GetAudioSessionControl(IAudioSessionManager2 *iface,
TRACE("(%p)->(%s, %lx, %p)\n", This, debugstr_guid(guid), flags, out);
- hr = drvs.pGetAudioSessionWrapper(guid, This->device, &wrapper); + hr = get_audio_session_wrapper(guid, This->device, &wrapper); if (FAILED(hr)) return hr;
@@ -121,7 +124,7 @@ static HRESULT WINAPI ASM_GetSimpleAudioVolume(IAudioSessionManager2 *iface,
TRACE("(%p)->(%s, %lx, %p)\n", This, debugstr_guid(guid), flags, out);
- hr = drvs.pGetAudioSessionWrapper(guid, This->device, &wrapper); + hr = get_audio_session_wrapper(guid, This->device, &wrapper); if (FAILED(hr)) return hr;
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index d1006b9999c..bba2ad2cc49 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -100,7 +100,6 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver) if(!driver->p##n) { goto fail; } } while(0) LDFC(GetEndpointIDs); LDFC(GetAudioEndpoint); - LDFC(GetAudioSessionWrapper); #undef LDFC
/* optional - do not fail if not found */ diff --git a/dlls/mmdevapi/mmdevapi_private.h b/dlls/mmdevapi/mmdevapi_private.h index 1cd8412b6ea..6f267ee756f 100644 --- a/dlls/mmdevapi/mmdevapi_private.h +++ b/dlls/mmdevapi/mmdevapi_private.h @@ -49,8 +49,6 @@ typedef struct _DriverFuncs { GUID **guids, UINT *num, UINT *default_index); HRESULT (WINAPI *pGetAudioEndpoint)(void *key, IMMDevice *dev, IAudioClient **out); - HRESULT (WINAPI *pGetAudioSessionWrapper)(const GUID *guid, IMMDevice *device, - struct audio_session_wrapper **out); HRESULT (WINAPI *pGetPropValue)(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out); } DriverFuncs; diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 09b54222f51..a0bb49c3cdf 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -245,7 +245,7 @@ static HRESULT WINAPI control_SetDuckingPreference(IAudioSessionControl2 *iface, return S_OK; }
-const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl = +static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl = { control_QueryInterface, control_AddRef, @@ -416,7 +416,7 @@ static HRESULT WINAPI channelvolume_GetAllVolumes(IChannelAudioVolume *iface, UI return S_OK; }
-const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl = +static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl = { channelvolume_QueryInterface, channelvolume_AddRef, @@ -542,7 +542,7 @@ static HRESULT WINAPI simplevolume_GetMute(ISimpleAudioVolume *iface, BOOL *mute return S_OK; }
-const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = +static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = { simplevolume_QueryInterface, simplevolume_AddRef, @@ -652,3 +652,20 @@ HRESULT get_audio_session(const GUID *guid, IMMDevice *device, UINT channels,
return S_OK; } + +HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, + struct audio_session_wrapper **out) +{ + struct audio_session *session; + + const HRESULT hr = get_audio_session(guid, device, 0, &session); + if (FAILED(hr)) + return hr; + + if (!(*out = session_wrapper_create(NULL))) + return E_OUTOFMEMORY; + + (*out)->session = session; + + return S_OK; +} diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 69658c4cfd1..8850bce44a7 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -120,16 +120,10 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; -extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; extern const IAudioClockVtbl AudioClock_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl;
-extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - static void pulse_call(enum unix_funcs code, void *params) { NTSTATUS status; @@ -398,29 +392,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; -} - HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec index 96cbd97bd68..94f8d4ef64c 100644 --- a/dlls/winepulse.drv/winepulse.drv.spec +++ b/dlls/winepulse.drv/winepulse.drv.spec @@ -1,7 +1,6 @@ # MMDevAPI driver functions @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue
# WinMM driver functions
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 29 ----------------------------- dlls/winealsa.drv/winealsa.drv.spec | 1 - 2 files changed, 30 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 49d649bc537..4db2a7b334d 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -68,15 +68,9 @@ static const WCHAR guidW[] = {'g','u','i','d',0}; extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; extern const IAudioClockVtbl AudioClock_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; -extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; - -extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN;
void DECLSPEC_HIDDEN sessions_lock(void) { @@ -374,29 +368,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient return S_OK; }
-/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; -} - HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index d6d566e3b13..006c0df24a8 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -6,5 +6,4 @@ # MMDevAPI driver functions @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 29 ------------------- dlls/winecoreaudio.drv/winecoreaudio.drv.spec | 1 - 2 files changed, 30 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 3aa774c9162..6c951c1d072 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -51,12 +51,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(coreaudio); extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; extern const IAudioClockVtbl AudioClock_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; -extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl;
static WCHAR drv_key_devicesW[256];
@@ -69,9 +66,6 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = }; static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 };
-extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -367,26 +361,3 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
return S_OK; } - -/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; -} diff --git a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec index 1467fc8b032..ed93b3ad180 100644 --- a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec +++ b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec @@ -6,4 +6,3 @@ # MMDevAPI driver functions @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 29 ----------------------------- dlls/wineoss.drv/wineoss.drv.spec | 1 - 2 files changed, 30 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 35ec7cc6757..fd9e6b5bb96 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -74,15 +74,9 @@ static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, extern const IAudioClient3Vtbl AudioClient3_Vtbl; extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; extern const IAudioClockVtbl AudioClock_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; -extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; - -extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN;
void DECLSPEC_HIDDEN sessions_lock(void) { @@ -357,26 +351,3 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
return S_OK; } - -/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; -} diff --git a/dlls/wineoss.drv/wineoss.drv.spec b/dlls/wineoss.drv/wineoss.drv.spec index 4506cc67ab5..9ad5ab8bdd0 100644 --- a/dlls/wineoss.drv/wineoss.drv.spec +++ b/dlls/wineoss.drv/wineoss.drv.spec @@ -7,4 +7,3 @@ # MMDevAPI driver functions @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=134560
Your paranoid android.
=== debian11 (32 bit report) ===
mmdevapi: render.c:2133: Test failed: Got wrong volume: 1.000000
=== debian11 (32 bit zh:CN report) ===
mmdevapi: capture.c:207: Test failed: GCP 17028 past ReleaseBuffer(0) initially 16522 render.c:2133: Test failed: Got wrong volume: 1.000000
=== debian11b (64 bit WoW report) ===
mmdevapi: render.c:2133: Test failed: Got wrong volume: 1.000000
On Fri Jul 7 05:54:50 2023 +0000, **** wrote:
Marvin replied on the mailing list:
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details: The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=134560 Your paranoid android. === debian11 (32 bit report) === mmdevapi: render.c:2133: Test failed: Got wrong volume: 1.000000 === debian11 (32 bit zh:CN report) === mmdevapi: capture.c:207: Test failed: GCP 17028 past ReleaseBuffer(0) initially 16522 render.c:2133: Test failed: Got wrong volume: 1.000000 === debian11b (64 bit WoW report) === mmdevapi: render.c:2133: Test failed: Got wrong volume: 1.000000
It's caused by c21fa7ea7b2fc6c336e8bfc695b4a923ba7b70e7, but I didn't figure out why yet.
On Fri Jul 7 06:41:01 2023 +0000, Davide Beatrici wrote:
It's caused by c21fa7ea7b2fc6c336e8bfc695b4a923ba7b70e7, but I didn't figure out why yet.
@huw Any ideas?
On Tue Jul 11 07:43:21 2023 +0000, Davide Beatrici wrote:
@huw Any ideas?
Maybe to isolate the issue a bit more, you could move `get_audio_session_wrapper` into `mmdevapi` first, then call it from all the `AUDDRV_GetAudioSessionWrapper` methods in separate commits (probably while also removing the vtbl definitions etc.), and then in the final commit, remove `GetAudioSessionWrapper` from the `DriverFuncs`. Right now you already do this in the first commit.
On Sun Jul 16 10:23:07 2023 +0000, Sven Baars wrote:
Maybe to isolate the issue a bit more, you could move `get_audio_session_wrapper` into `mmdevapi` first, then call it from all the `AUDDRV_GetAudioSessionWrapper` methods in separate commits (probably while also removing the vtbl definitions etc.), and then in the final commit, remove `GetAudioSessionWrapper` from the `DriverFuncs`. Right now you already do this in the first commit.
Stared at this for a bit yesterday, narrowed it down to `ASM_GetSimpleAudioVolume`, calling `get_audio_session_wrapper` through `AUDDRV_GetAudioSessionWrapper` "fixes" the tests.
For some reason, the sessions list changes address halfway through the test, and it ends up creating a new session instead. ``` 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038F110, 0, 000000000021FAC8) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038DD70, 0, 000000000021FAC8) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038DD70, 2, 0000000000383B70) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038F110, 2, 0000000000383C40) sessions 00000002EB239100 00cc:render: 21 tests executed (0 marked as todo, 0 as flaky, 0 failures), 0 skipped. ``` ``` 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038F110, 0, 000000000021FAC8) sessions 000000020F413260 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038DD70, 0, 000000000021FAC8) sessions 000000020F413260 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038DD70, 2, 0000000000383B70) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038F110, 2, 0000000000383C40) sessions 00000002EB239100 00cc:render: 21 tests executed (0 marked as todo, 0 as flaky, 1 failure), 0 skipped. ```
On Sun Jul 16 10:32:02 2023 +0000, Vladislav Timonin wrote:
Stared at this for a bit yesterday, narrowed it down to `ASM_GetSimpleAudioVolume`, calling `get_audio_session_wrapper` through `AUDDRV_GetAudioSessionWrapper` "fixes" the tests. For some reason, the sessions list changes address halfway through the test, and it ends up creating a new session instead.
00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038F110, 0, 000000000021FAC8) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038DD70, 0, 000000000021FAC8) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038DD70, 2, 0000000000383B70) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({faaab7e1-480b-4230-b5e6-8e09a3cc3adb}, 000000000038F110, 2, 0000000000383C40) sessions 00000002EB239100 00cc:render: 21 tests executed (0 marked as todo, 0 as flaky, 0 failures), 0 skipped.
00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038F110, 0, 000000000021FAC8) sessions 000000020F413260 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038DD70, 0, 000000000021FAC8) sessions 000000020F413260 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038DD70, 2, 0000000000383B70) sessions 00000002EB239100 00d0:fixme:mmdevapi:get_audio_session ({ccd800bb-46ca-418f-8020-0988753a38c4}, 000000000038F110, 2, 0000000000383C40) sessions 00000002EB239100 00cc:render: 21 tests executed (0 marked as todo, 0 as flaky, 1 failure), 0 skipped.
Thanks for investigating!
I actually added the trace message to reveal the weird behavior, by comparing the output produced by the good and the broken code.
However, the result was (and still is) confusing as I would expect other session related tests to fail as well...
On Sun Jul 16 22:42:16 2023 +0000, Davide Beatrici wrote:
Thanks for investigating! I actually added the trace message to reveal the weird behavior, by comparing the output produced by the good and the broken code. However, the result was (and still is) confusing as I would expect other session related tests to fail as well...
My suspicion is that there are two different session list instances.
`audiosessionmanager.c` and `client.c`, the only places where `get_audio_session`/`get_audio_session_wrapper` are used, end up getting their own session list. The only place in tests where both `IAudioSessionManager` and `IAudioClient` are used is `test_session_creation`. And because they should be using the same session list, and they're not, it fails.
Unfortunately I'm not good enough to know how to fix this >_>
On Mon Jul 17 09:13:57 2023 +0000, Vladislav Timonin wrote:
My suspicion is that there are two different session list instances. `audiosessionmanager.c` and `client.c`, the only places where `get_audio_session`/`get_audio_session_wrapper` are used, end up getting their own session list. The only place in tests where both `IAudioSessionManager` and `IAudioClient` are used is `test_session_creation`. And because they should be using the same session list, and they're not, it fails. Unfortunately I'm not good enough to know how to fix this >_>
Right before reading your comment I realized that every target building `session.c` ends up getting its own session list. Your suspicion is spot-on.
Also, your proposed fix is good: let's keep `AUDDRV_GetAudioSessionWrapper` until we move `GetAudioEndpoint` into `mmdevapi`.