1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-01 07:14:31 +00:00

mmdevapi: Implement get_audio_session.

This commit is contained in:
Davide Beatrici 2023-07-19 16:20:54 +02:00 committed by Alexandre Julliard
parent ebd3fa86ba
commit 024189aecd
7 changed files with 51 additions and 169 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)