-- v4: mmdevapi: Implement get_audio_session. mmdevapi: Don't link to uuid.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/mmdevapi/Makefile.in b/dlls/mmdevapi/Makefile.in index 027854ea97b..d9ec97b87e5 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 \
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/audiosessionmanager.c | 6 ---- dlls/mmdevapi/devenum.c | 2 ++ dlls/mmdevapi/session.c | 47 +++++++++++++++++++++++++---- dlls/winealsa.drv/mmdevdrv.c | 42 ++------------------------ dlls/winecoreaudio.drv/mmdevdrv.c | 41 ++----------------------- dlls/wineoss.drv/mmdevdrv.c | 41 ++----------------------- dlls/winepulse.drv/mmdevdrv.c | 41 ++----------------------- 7 files changed, 51 insertions(+), 169 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/devenum.c b/dlls/mmdevapi/devenum.c index 2b7833edd08..206fe810b12 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -42,6 +42,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); + static HKEY key_render; static HKEY key_capture;
diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 32718739f03..24188ad7658 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) { @@ -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, @@ -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,38 @@ 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)) { + *out = session_create(&GUID_NULL, device, channels); + if (!*out) + 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) { + *out = session_create(guid, device, channels); + if (!*out) + return E_OUTOFMEMORY; + } + + return S_OK; +} diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index a27916b37a5..c4de829f152 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}; @@ -69,12 +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; @@ -375,44 +371,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..aee06e5a7f7 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];
@@ -68,7 +65,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 +365,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..549cd66b6bd 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -70,17 +70,13 @@ 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; 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; @@ -359,43 +355,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..15e1538f330 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 { @@ -121,9 +120,6 @@ 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; @@ -399,43 +395,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)
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=135007
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: xinput1_3:xinput crashed (c0000005)
On Wed Jul 19 14:21:26 2023 +0000, Davide Beatrici wrote:
changed this line in [version 4 of the diff](/wine/wine/-/merge_requests/3260/diffs?diff_id=58283&start_sha=8c9fa0daf849953dc4ae613a4360adee8367aef0#93e6661c548f95d6c2ae8340ba18809196820745_641_641)
Sorry, I didn't notice both statements could sit in the same line without exceeding 100 characters.
Jeffrey Smith (@whydoubt) commented about dlls/winealsa.drv/mmdevdrv.c:
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 */
I think it would be better to only have one copy of this comment, where the function is defined. (same comment for pulse, coreaudio, oss)
On Wed Jul 19 16:25:05 2023 +0000, Jeffrey Smith wrote:
I think it would be better to only have one copy of this comment, where the function is defined. (same comment for pulse, coreaudio, oss)
It's going to be removed very soon though.
On Wed Jul 19 19:06:10 2023 +0000, Davide Beatrici wrote:
It's going to be removed very soon though.
_What_ is going to be removed? And how does that relate to removing duplicate comments now?
On Wed Jul 19 19:20:03 2023 +0000, Jeffrey Smith wrote:
_What_ is going to be removed? And how does that relate to removing duplicate comments now?
The function declaration. For that reason I believe it's not worth removing the comment, as it's only going to increase the amount of changes in the commit/MR.
This merge request was approved by Huw Davies.