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)