-- v3: wineoss: Use mmdevapi's AudioClient's Initialize. winecoreaudio: Use mmdevapi's AudioClient's Initialize. winealsa: Use mmdevapi's AudioClient's Initialize. winepulse: Move AudioClient's Initialize into mmdevapi. winepulse: Refactor AudioClient's Initialize to match other drivers. wineoss: Use create_stream's channel count in AudioClient's Initialize. winecoreaudio: Use create_stream's channel count in AudioClient's Initialize. winealsa: Use create_stream's channel count in AudioClient's Initialize.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index d8596c9371c..43a44b0569d 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -85,6 +85,8 @@ extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
extern WCHAR *get_application_name(void);
+extern void set_stream_volumes(struct audio_client *This); + void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -201,18 +203,6 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid) RegCloseKey(key); }
-static void set_stream_volumes(ACImpl *This) -{ - struct set_volumes_params params; - - params.stream = This->stream; - params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol); - params.volumes = This->vols; - params.session_volumes = This->session->channel_vols; - - ALSA_CALL(set_volumes, ¶ms); -} - HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out, UINT *num, UINT *def_index) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 683e22e35a2..fc011021d68 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -79,6 +79,8 @@ extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
extern WCHAR *get_application_name(void);
+extern void set_stream_volumes(struct audio_client *This); + void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -198,18 +200,6 @@ static void get_device_guid(EDataFlow flow, const char *dev, GUID *guid) RegCloseKey(key); }
-static void set_stream_volumes(ACImpl *This) -{ - struct set_volumes_params params; - - params.stream = This->stream; - params.master_volume = This->session->mute ? 0.0f : This->session->master_vol; - params.volumes = This->vols; - params.session_volumes = This->session->channel_vols; - - UNIX_CALL(set_volumes, ¶ms); -} - HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out, UINT *num, UINT *def_index) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 950b711bad0..bacf22a9029 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -91,6 +91,8 @@ extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
extern WCHAR *get_application_name(void);
+extern void set_stream_volumes(struct audio_client *This); + void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -215,17 +217,6 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid) RegCloseKey(key); }
-static void set_stream_volumes(ACImpl *This) -{ - struct set_volumes_params params; - - params.stream = This->stream; - params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol); - params.volumes = This->vols; - params.session_volumes = This->session->channel_vols; - OSS_CALL(set_volumes, ¶ms); -} - static const OSSDevice *get_ossdevice_from_guid(const GUID *guid) { OSSDevice *dev_item;
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 4efc75dc5a5..c932652f2e9 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -137,6 +137,8 @@ extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
extern WCHAR *get_application_name(void);
+extern void set_stream_volumes(struct audio_client *This); + static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -149,16 +151,6 @@ static void pulse_call(enum unix_funcs code, void *params) assert(!status); }
-static void set_stream_volumes(ACImpl *This) -{ - struct set_volumes_params params; - params.stream = This->stream; - params.master_volume = This->session->mute ? 0.0f : This->session->master_vol; - params.volumes = This->vols; - params.session_volumes = This->session->channel_vols; - pulse_call(set_volumes, ¶ms); -} - static void get_device_guid(HKEY drv_key, EDataFlow flow, const char *pulse_name, GUID *guid) { WCHAR key_name[MAX_PULSE_NAME_LEN + 2];
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/alsa.c | 1 + dlls/winealsa.drv/mmdevdrv.c | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index 4930850e9dc..0f2211d77e7 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -1050,6 +1050,7 @@ exit: free(stream->vols); free(stream); }else{ + *params->channel_count = params->fmt->nChannels; *params->stream = (stream_handle)(UINT_PTR)stream; }
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 43a44b0569d..497ea04cecb 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -550,7 +550,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ACImpl *This = impl_from_IAudioClient3(iface); struct create_stream_params params; stream_handle stream; - unsigned int i; + unsigned int i, channel_count; WCHAR *name;
TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, @@ -598,7 +598,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, params.duration = duration; params.period = period; params.fmt = fmt; - params.channel_count = NULL; + params.channel_count = &channel_count; params.stream = &stream;
ALSA_CALL(create_stream, ¶ms); @@ -610,17 +610,15 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return params.result; }
- This->channel_count = fmt->nChannels; - This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float)); + This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); if(!This->vols){ params.result = E_OUTOFMEMORY; goto exit; } - for(i = 0; i < This->channel_count; ++i) + for(i = 0; i < channel_count; ++i) This->vols[i] = 1.f;
- params.result = get_audio_session(sessionguid, This->parent, This->channel_count, - &This->session); + params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); if(FAILED(params.result)) goto exit;
@@ -633,6 +631,7 @@ exit: This->vols = NULL; }else{ This->stream = stream; + This->channel_count = channel_count; set_stream_volumes(This); }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 4 +++- dlls/winecoreaudio.drv/mmdevdrv.c | 13 ++++++------- 2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index f41118e62f5..1e712a624cb 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -776,8 +776,10 @@ end: if(stream->unit) AudioComponentInstanceDispose(stream->unit); free(stream->fmt); free(stream); - } else + } else { + *params->channel_count = params->fmt->nChannels; *params->stream = (stream_handle)(UINT_PTR)stream; + }
return STATUS_SUCCESS; } diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index fc011021d68..f7f72f43d83 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -545,7 +545,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ACImpl *This = impl_from_IAudioClient3(iface); struct create_stream_params params; stream_handle stream; - UINT32 i; + UINT32 i, channel_count; WCHAR *name;
TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, @@ -593,7 +593,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, params.duration = duration; params.period = period; params.fmt = fmt; - params.channel_count = NULL; + params.channel_count = &channel_count; params.stream = &stream;
UNIX_CALL(create_stream, ¶ms); @@ -605,18 +605,16 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return params.result; }
- This->channel_count = fmt->nChannels; - - This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float)); + This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); if(!This->vols){ params.result = E_OUTOFMEMORY; goto end; }
- for(i = 0; i < This->channel_count; ++i) + for(i = 0; i < channel_count; ++i) This->vols[i] = 1.f;
- params.result = get_audio_session(sessionguid, This->parent, fmt->nChannels, &This->session); + params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); if(FAILED(params.result)) goto end;
list_add_tail(&This->session->clients, &This->entry); @@ -628,6 +626,7 @@ end: This->vols = NULL; }else{ This->stream = stream; + This->channel_count = channel_count; set_stream_volumes(This); }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 13 ++++++------- dlls/wineoss.drv/oss.c | 1 + 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index bacf22a9029..5f2236ce63e 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -527,7 +527,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ACImpl *This = impl_from_IAudioClient3(iface); struct create_stream_params params; stream_handle stream; - unsigned int i; + unsigned int i, channel_count; WCHAR *name;
TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, @@ -575,7 +575,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, params.duration = duration; params.period = period; params.fmt = fmt; - params.channel_count = NULL; + params.channel_count = &channel_count; params.stream = &stream;
OSS_CALL(create_stream, ¶ms); @@ -587,17 +587,15 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return params.result; }
- This->channel_count = fmt->nChannels; - This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float)); + This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); if(!This->vols){ params.result = E_OUTOFMEMORY; goto exit; } - for(i = 0; i < This->channel_count; ++i) + for(i = 0; i < channel_count; ++i) This->vols[i] = 1.f;
- params.result = get_audio_session(sessionguid, This->parent, This->channel_count, - &This->session); + params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session);
exit: if(FAILED(params.result)){ @@ -607,6 +605,7 @@ exit: } else { list_add_tail(&This->session->clients, &This->entry); This->stream = stream; + This->channel_count = channel_count; set_stream_volumes(This); }
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 5049c711e98..2097137f749 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -674,6 +674,7 @@ exit: free(stream->fmt); free(stream); }else{ + *params->channel_count = params->fmt->nChannels; *params->stream = (stream_handle)(UINT_PTR)stream; }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index c932652f2e9..ee0668e1ea2 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -563,10 +563,9 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, { ACImpl *This = impl_from_IAudioClient3(iface); struct create_stream_params params; - unsigned int i, channel_count; + UINT32 i, channel_count; stream_handle stream; WCHAR *name; - HRESULT hr;
TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); @@ -599,12 +598,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
- if (FAILED(hr = main_loop_start())) + if (FAILED(params.result = main_loop_start())) { sessions_unlock(); - return hr; + return params.result; }
+ channel_count = fmt->nChannels; + params.name = name = get_application_name(); params.device = This->device_name; params.flow = This->dataflow; @@ -617,38 +618,37 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, params.channel_count = &channel_count; pulse_call(create_stream, ¶ms); free(name); - if (FAILED(hr = params.result)) + if (FAILED(params.result)) { sessions_unlock(); - return hr; + return params.result; }
if (!(This->vols = malloc(channel_count * sizeof(*This->vols)))) { - stream_release(stream, NULL); - sessions_unlock(); - return E_OUTOFMEMORY; + params.result = E_OUTOFMEMORY; + goto exit; } for (i = 0; i < channel_count; i++) This->vols[i] = 1.f;
- hr = get_audio_session(sessionguid, This->parent, channel_count, &This->session); - if (FAILED(hr)) - { + params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); + +exit: + if (FAILED(params.result)) { + stream_release(stream, NULL); free(This->vols); This->vols = NULL; - sessions_unlock(); - stream_release(stream, NULL); - return E_OUTOFMEMORY; + } else { + list_add_tail(&This->session->clients, &This->entry); + This->stream = stream; + This->channel_count = channel_count; + set_stream_volumes(This); }
- This->stream = stream; - This->channel_count = channel_count; - list_add_tail(&This->session->clients, &This->entry); - set_stream_volumes(This); - sessions_unlock(); - return S_OK; + + return params.result; }
extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/audiosessionmanager.c | 6 ++ dlls/mmdevapi/client.c | 97 +++++++++++++++++++ dlls/winealsa.drv/mmdevdrv.c | 2 +- dlls/winecoreaudio.drv/mmdevdrv.c | 2 +- dlls/wineoss.drv/mmdevdrv.c | 2 +- dlls/winepulse.drv/mmdevdrv.c | 138 +--------------------------- 6 files changed, 110 insertions(+), 137 deletions(-)
diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index 71799590e5e..dc0c5f609b7 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -47,6 +47,12 @@ 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/client.c b/dlls/mmdevapi/client.c index 5d807776ff0..9ef508d8c47 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -44,6 +44,8 @@ typedef struct tagLANGANDCODEPAGE extern void sessions_lock(void) DECLSPEC_HIDDEN; extern void sessions_unlock(void) DECLSPEC_HIDDEN;
+extern HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, + struct audio_session **out) DECLSPEC_HIDDEN; extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client) DECLSPEC_HIDDEN;
static HANDLE main_loop_thread; @@ -404,6 +406,101 @@ const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = capture_GetNextPacketSize };
+HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, + REFERENCE_TIME duration, REFERENCE_TIME period, + const WAVEFORMATEX *fmt, const GUID *sessionguid) +{ + struct audio_client *This = impl_from_IAudioClient3(iface); + struct create_stream_params params; + UINT32 i, channel_count; + stream_handle stream; + WCHAR *name; + + TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, wine_dbgstr_longlong(duration), + wine_dbgstr_longlong(period), fmt, + debugstr_guid(sessionguid)); + + if (!fmt) + return E_POINTER; + + dump_fmt(fmt); + + if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) + return E_INVALIDARG; + + if (flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS | + AUDCLNT_STREAMFLAGS_LOOPBACK | + AUDCLNT_STREAMFLAGS_EVENTCALLBACK | + AUDCLNT_STREAMFLAGS_NOPERSIST | + AUDCLNT_STREAMFLAGS_RATEADJUST | + AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED | + AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE | + AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED | + AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | + AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)) { + FIXME("Unknown flags: %08lx\n", flags); + return E_INVALIDARG; + } + + sessions_lock(); + + if (This->stream) { + sessions_unlock(); + return AUDCLNT_E_ALREADY_INITIALIZED; + } + + if (FAILED(params.result = main_loop_start())) { + sessions_unlock(); + return params.result; + } + + params.name = name = get_application_name(); + params.device = This->device_name; + params.flow = This->dataflow; + params.share = mode; + params.flags = flags; + params.duration = duration; + params.period = period; + params.fmt = fmt; + params.channel_count = &channel_count; + params.stream = &stream; + + WINE_UNIX_CALL(create_stream, ¶ms); + + free(name); + + if (FAILED(params.result)) { + sessions_unlock(); + return params.result; + } + + if (!(This->vols = malloc(channel_count * sizeof(*This->vols)))) { + params.result = E_OUTOFMEMORY; + goto exit; + } + + for (i = 0; i < channel_count; i++) + This->vols[i] = 1.f; + + params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); + +exit: + if (FAILED(params.result)) { + stream_release(stream, NULL); + free(This->vols); + This->vols = NULL; + } else { + list_add_tail(&This->session->clients, &This->entry); + This->stream = stream; + This->channel_count = channel_count; + set_stream_volumes(This); + } + + sessions_unlock(); + + return params.result; +} + HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) { struct audio_client *This = impl_from_IAudioClient3(iface); diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 497ea04cecb..559a6b3d877 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -510,7 +510,7 @@ static AudioSession *create_session(const GUID *guid, IMMDevice *device,
/* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -static HRESULT get_audio_session(const GUID *sessionguid, +HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, AudioSession **out) { AudioSession *session; diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index f7f72f43d83..95570435976 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -505,7 +505,7 @@ static AudioSession *create_session(const GUID *guid, IMMDevice *device,
/* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -static HRESULT get_audio_session(const GUID *sessionguid, +HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, AudioSession **out) { AudioSession *session; diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 5f2236ce63e..01df44e7149 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -487,7 +487,7 @@ static AudioSession *create_session(const GUID *guid, IMMDevice *device,
/* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -static HRESULT get_audio_session(const GUID *sessionguid, +HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, AudioSession **out) { AudioSession *session; diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index ee0668e1ea2..4631c5ab60e 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -128,17 +128,11 @@ extern const IAudioClockVtbl AudioClock_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl;
-extern HRESULT main_loop_start(void) DECLSPEC_HIDDEN; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
-extern WCHAR *get_application_name(void); - -extern void set_stream_volumes(struct audio_client *This); - static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -443,40 +437,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) return ref; }
-static void dump_fmt(const WAVEFORMATEX *fmt) -{ - TRACE("wFormatTag: 0x%x (", fmt->wFormatTag); - switch(fmt->wFormatTag) { - case WAVE_FORMAT_PCM: - TRACE("WAVE_FORMAT_PCM"); - break; - case WAVE_FORMAT_IEEE_FLOAT: - TRACE("WAVE_FORMAT_IEEE_FLOAT"); - break; - case WAVE_FORMAT_EXTENSIBLE: - TRACE("WAVE_FORMAT_EXTENSIBLE"); - break; - default: - TRACE("Unknown"); - break; - } - TRACE(")\n"); - - TRACE("nChannels: %u\n", fmt->nChannels); - TRACE("nSamplesPerSec: %lu\n", fmt->nSamplesPerSec); - TRACE("nAvgBytesPerSec: %lu\n", fmt->nAvgBytesPerSec); - TRACE("nBlockAlign: %u\n", fmt->nBlockAlign); - TRACE("wBitsPerSample: %u\n", fmt->wBitsPerSample); - TRACE("cbSize: %u\n", fmt->cbSize); - - if (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { - WAVEFORMATEXTENSIBLE *fmtex = (void*)fmt; - TRACE("dwChannelMask: %08lx\n", fmtex->dwChannelMask); - TRACE("Samples: %04x\n", fmtex->Samples.wReserved); - TRACE("SubFormat: %s\n", wine_dbgstr_guid(&fmtex->SubFormat)); - } -} - static void session_init_vols(AudioSession *session, UINT channels) { if (session->channel_count < channels) { @@ -524,7 +484,7 @@ static AudioSession *create_session(const GUID *guid, IMMDevice *device,
/* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ -static HRESULT get_audio_session(const GUID *sessionguid, +HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, AudioSession **out) { AudioSession *session; @@ -556,100 +516,10 @@ static HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, +extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - struct create_stream_params params; - UINT32 i, channel_count; - stream_handle stream; - WCHAR *name; - - TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, - wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); - - if (!fmt) - return E_POINTER; - dump_fmt(fmt); - - if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) - return E_INVALIDARG; - - if (flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS | - AUDCLNT_STREAMFLAGS_LOOPBACK | - AUDCLNT_STREAMFLAGS_EVENTCALLBACK | - AUDCLNT_STREAMFLAGS_NOPERSIST | - AUDCLNT_STREAMFLAGS_RATEADJUST | - AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED | - AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | - AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)) { - FIXME("Unknown flags: %08lx\n", flags); - return E_INVALIDARG; - } - - sessions_lock(); - - if (This->stream) { - sessions_unlock(); - return AUDCLNT_E_ALREADY_INITIALIZED; - } - - if (FAILED(params.result = main_loop_start())) - { - sessions_unlock(); - return params.result; - } - - channel_count = fmt->nChannels; - - params.name = name = get_application_name(); - params.device = This->device_name; - params.flow = This->dataflow; - params.share = mode; - params.flags = flags; - params.duration = duration; - params.period = period; - params.fmt = fmt; - params.stream = &stream; - params.channel_count = &channel_count; - pulse_call(create_stream, ¶ms); - free(name); - if (FAILED(params.result)) - { - sessions_unlock(); - return params.result; - } - - if (!(This->vols = malloc(channel_count * sizeof(*This->vols)))) - { - params.result = E_OUTOFMEMORY; - goto exit; - } - for (i = 0; i < channel_count; i++) - This->vols[i] = 1.f; - - params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); - -exit: - if (FAILED(params.result)) { - stream_release(stream, NULL); - free(This->vols); - This->vols = NULL; - } else { - list_add_tail(&This->session->clients, &This->entry); - This->stream = stream; - This->channel_count = channel_count; - set_stream_volumes(This); - } - - sessions_unlock(); - - return params.result; -} + const GUID *sessionguid);
extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out); @@ -708,7 +578,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_QueryInterface, AudioClient_AddRef, AudioClient_Release, - AudioClient_Initialize, + client_Initialize, client_GetBufferSize, client_GetStreamLatency, client_GetCurrentPadding,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 139 +---------------------------------- 1 file changed, 3 insertions(+), 136 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 559a6b3d877..eb507340630 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -76,17 +76,11 @@ extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl;
-extern HRESULT main_loop_start(void) DECLSPEC_HIDDEN; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
-extern WCHAR *get_application_name(void); - -extern void set_stream_volumes(struct audio_client *This); - void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -429,40 +423,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) return ref; }
-static void dump_fmt(const WAVEFORMATEX *fmt) -{ - TRACE("wFormatTag: 0x%x (", fmt->wFormatTag); - switch(fmt->wFormatTag){ - case WAVE_FORMAT_PCM: - TRACE("WAVE_FORMAT_PCM"); - break; - case WAVE_FORMAT_IEEE_FLOAT: - TRACE("WAVE_FORMAT_IEEE_FLOAT"); - break; - case WAVE_FORMAT_EXTENSIBLE: - TRACE("WAVE_FORMAT_EXTENSIBLE"); - break; - default: - TRACE("Unknown"); - break; - } - TRACE(")\n"); - - TRACE("nChannels: %u\n", fmt->nChannels); - TRACE("nSamplesPerSec: %lu\n", fmt->nSamplesPerSec); - TRACE("nAvgBytesPerSec: %lu\n", fmt->nAvgBytesPerSec); - TRACE("nBlockAlign: %u\n", fmt->nBlockAlign); - TRACE("wBitsPerSample: %u\n", fmt->wBitsPerSample); - TRACE("cbSize: %u\n", fmt->cbSize); - - if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){ - WAVEFORMATEXTENSIBLE *fmtex = (void*)fmt; - TRACE("dwChannelMask: %08lx\n", fmtex->dwChannelMask); - TRACE("Samples: %04x\n", fmtex->Samples.wReserved); - TRACE("SubFormat: %s\n", wine_dbgstr_guid(&fmtex->SubFormat)); - } -} - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -542,103 +502,10 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, +extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - struct create_stream_params params; - stream_handle stream; - unsigned int i, channel_count; - WCHAR *name; - - TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, - wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); - - if(!fmt) - return E_POINTER; - - if(mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) - return E_INVALIDARG; - - if(flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS | - AUDCLNT_STREAMFLAGS_LOOPBACK | - AUDCLNT_STREAMFLAGS_EVENTCALLBACK | - AUDCLNT_STREAMFLAGS_NOPERSIST | - AUDCLNT_STREAMFLAGS_RATEADJUST | - AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED | - AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | - AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)){ - FIXME("Unknown flags: %08lx\n", flags); - return E_INVALIDARG; - } - - sessions_lock(); - - if(This->stream){ - sessions_unlock(); - return AUDCLNT_E_ALREADY_INITIALIZED; - } - - if(FAILED(params.result = main_loop_start())){ - sessions_unlock(); - return params.result; - } - - dump_fmt(fmt); - - params.name = name = get_application_name(); - params.device = This->device_name; - params.flow = This->dataflow; - params.share = mode; - params.flags = flags; - params.duration = duration; - params.period = period; - params.fmt = fmt; - params.channel_count = &channel_count; - params.stream = &stream; - - ALSA_CALL(create_stream, ¶ms); - - free(name); - - if(FAILED(params.result)){ - sessions_unlock(); - return params.result; - } - - This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); - if(!This->vols){ - params.result = E_OUTOFMEMORY; - goto exit; - } - for(i = 0; i < channel_count; ++i) - This->vols[i] = 1.f; - - params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); - if(FAILED(params.result)) - goto exit; - - list_add_tail(&This->session->clients, &This->entry); - -exit: - if(FAILED(params.result)){ - stream_release(stream, NULL); - HeapFree(GetProcessHeap(), 0, This->vols); - This->vols = NULL; - }else{ - This->stream = stream; - This->channel_count = channel_count; - set_stream_volumes(This); - } - - sessions_unlock(); - - return params.result; -} + const GUID *sessionguid);
extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out); @@ -697,7 +564,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_QueryInterface, AudioClient_AddRef, AudioClient_Release, - AudioClient_Initialize, + client_Initialize, client_GetBufferSize, client_GetStreamLatency, client_GetCurrentPadding,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 139 +----------------------------- 1 file changed, 3 insertions(+), 136 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 95570435976..a7a29c1d58b 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -70,17 +70,11 @@ 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);
-extern HRESULT main_loop_start(void) DECLSPEC_HIDDEN; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
-extern WCHAR *get_application_name(void); - -extern void set_stream_volumes(struct audio_client *This); - void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -424,40 +418,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) return ref; }
-static void dump_fmt(const WAVEFORMATEX *fmt) -{ - TRACE("wFormatTag: 0x%x (", fmt->wFormatTag); - switch(fmt->wFormatTag){ - case WAVE_FORMAT_PCM: - TRACE("WAVE_FORMAT_PCM"); - break; - case WAVE_FORMAT_IEEE_FLOAT: - TRACE("WAVE_FORMAT_IEEE_FLOAT"); - break; - case WAVE_FORMAT_EXTENSIBLE: - TRACE("WAVE_FORMAT_EXTENSIBLE"); - break; - default: - TRACE("Unknown"); - break; - } - TRACE(")\n"); - - TRACE("nChannels: %u\n", fmt->nChannels); - TRACE("nSamplesPerSec: %lu\n", fmt->nSamplesPerSec); - TRACE("nAvgBytesPerSec: %lu\n", fmt->nAvgBytesPerSec); - TRACE("nBlockAlign: %u\n", fmt->nBlockAlign); - TRACE("wBitsPerSample: %u\n", fmt->wBitsPerSample); - TRACE("cbSize: %u\n", fmt->cbSize); - - if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){ - WAVEFORMATEXTENSIBLE *fmtex = (void*)fmt; - TRACE("dwChannelMask: %08lx\n", fmtex->dwChannelMask); - TRACE("Samples: %04x\n", fmtex->Samples.wReserved); - TRACE("SubFormat: %s\n", wine_dbgstr_guid(&fmtex->SubFormat)); - } -} - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -537,103 +497,10 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, +extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - struct create_stream_params params; - stream_handle stream; - UINT32 i, channel_count; - WCHAR *name; - - TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, - wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); - - if(!fmt) - return E_POINTER; - - dump_fmt(fmt); - - if(mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) - return E_INVALIDARG; - - if(flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS | - AUDCLNT_STREAMFLAGS_LOOPBACK | - AUDCLNT_STREAMFLAGS_EVENTCALLBACK | - AUDCLNT_STREAMFLAGS_NOPERSIST | - AUDCLNT_STREAMFLAGS_RATEADJUST | - AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED | - AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | - AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)){ - FIXME("Unknown flags: %08lx\n", flags); - return E_INVALIDARG; - } - - sessions_lock(); - - if(This->stream){ - sessions_unlock(); - return AUDCLNT_E_ALREADY_INITIALIZED; - } - - if(FAILED(params.result = main_loop_start())){ - sessions_unlock(); - return params.result; - } - - params.name = name = get_application_name(); - params.device = This->device_name; - params.flow = This->dataflow; - params.share = mode; - params.flags = flags; - params.duration = duration; - params.period = period; - params.fmt = fmt; - params.channel_count = &channel_count; - params.stream = &stream; - - UNIX_CALL(create_stream, ¶ms); - - free(name); - - if(FAILED(params.result)){ - sessions_unlock(); - return params.result; - } - - This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); - if(!This->vols){ - params.result = E_OUTOFMEMORY; - goto end; - } - - for(i = 0; i < channel_count; ++i) - This->vols[i] = 1.f; - - params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); - if(FAILED(params.result)) goto end; - - list_add_tail(&This->session->clients, &This->entry); - -end: - if(FAILED(params.result)){ - stream_release(stream, NULL); - HeapFree(GetProcessHeap(), 0, This->vols); - This->vols = NULL; - }else{ - This->stream = stream; - This->channel_count = channel_count; - set_stream_volumes(This); - } - - sessions_unlock(); - - return params.result; -} + const GUID *sessionguid);
extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *frames); @@ -692,7 +559,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_QueryInterface, AudioClient_AddRef, AudioClient_Release, - AudioClient_Initialize, + client_Initialize, client_GetBufferSize, client_GetStreamLatency, client_GetCurrentPadding,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 136 +----------------------------------- 1 file changed, 3 insertions(+), 133 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 01df44e7149..cfb5c1c2ea9 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -82,17 +82,11 @@ extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; extern const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl;
-extern HRESULT main_loop_start(void) DECLSPEC_HIDDEN; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
extern HRESULT stream_release(stream_handle stream, HANDLE timer_thread);
-extern WCHAR *get_application_name(void); - -extern void set_stream_volumes(struct audio_client *This); - void DECLSPEC_HIDDEN sessions_lock(void) { EnterCriticalSection(&g_sessions_lock); @@ -406,40 +400,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) return ref; }
-static void dump_fmt(const WAVEFORMATEX *fmt) -{ - TRACE("wFormatTag: 0x%x (", fmt->wFormatTag); - switch(fmt->wFormatTag){ - case WAVE_FORMAT_PCM: - TRACE("WAVE_FORMAT_PCM"); - break; - case WAVE_FORMAT_IEEE_FLOAT: - TRACE("WAVE_FORMAT_IEEE_FLOAT"); - break; - case WAVE_FORMAT_EXTENSIBLE: - TRACE("WAVE_FORMAT_EXTENSIBLE"); - break; - default: - TRACE("Unknown"); - break; - } - TRACE(")\n"); - - TRACE("nChannels: %u\n", fmt->nChannels); - TRACE("nSamplesPerSec: %lu\n", fmt->nSamplesPerSec); - TRACE("nAvgBytesPerSec: %lu\n", fmt->nAvgBytesPerSec); - TRACE("nBlockAlign: %u\n", fmt->nBlockAlign); - TRACE("wBitsPerSample: %u\n", fmt->wBitsPerSample); - TRACE("cbSize: %u\n", fmt->cbSize); - - if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){ - WAVEFORMATEXTENSIBLE *fmtex = (void*)fmt; - TRACE("dwChannelMask: %08lx\n", fmtex->dwChannelMask); - TRACE("Samples: %04x\n", fmtex->Samples.wReserved); - TRACE("SubFormat: %s\n", wine_dbgstr_guid(&fmtex->SubFormat)); - } -} - static void session_init_vols(AudioSession *session, UINT channels) { if(session->channel_count < channels){ @@ -519,100 +479,10 @@ HRESULT get_audio_session(const GUID *sessionguid, return S_OK; }
-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, +extern HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, REFERENCE_TIME period, const WAVEFORMATEX *fmt, - const GUID *sessionguid) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - struct create_stream_params params; - stream_handle stream; - unsigned int i, channel_count; - WCHAR *name; - - TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, - wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); - - if(!fmt) - return E_POINTER; - - dump_fmt(fmt); - - if(mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) - return E_INVALIDARG; - - if(flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS | - AUDCLNT_STREAMFLAGS_LOOPBACK | - AUDCLNT_STREAMFLAGS_EVENTCALLBACK | - AUDCLNT_STREAMFLAGS_NOPERSIST | - AUDCLNT_STREAMFLAGS_RATEADJUST | - AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE | - AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED | - AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | - AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)){ - FIXME("Unknown flags: %08lx\n", flags); - return E_INVALIDARG; - } - - sessions_lock(); - - if(This->stream){ - sessions_unlock(); - return AUDCLNT_E_ALREADY_INITIALIZED; - } - - if(FAILED(params.result = main_loop_start())){ - sessions_unlock(); - return params.result; - } - - params.name = name = get_application_name(); - params.device = This->device_name; - params.flow = This->dataflow; - params.share = mode; - params.flags = flags; - params.duration = duration; - params.period = period; - params.fmt = fmt; - params.channel_count = &channel_count; - params.stream = &stream; - - OSS_CALL(create_stream, ¶ms); - - free(name); - - if(FAILED(params.result)){ - sessions_unlock(); - return params.result; - } - - This->vols = HeapAlloc(GetProcessHeap(), 0, channel_count * sizeof(float)); - if(!This->vols){ - params.result = E_OUTOFMEMORY; - goto exit; - } - for(i = 0; i < channel_count; ++i) - This->vols[i] = 1.f; - - params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session); - -exit: - if(FAILED(params.result)){ - stream_release(stream, NULL); - HeapFree(GetProcessHeap(), 0, This->vols); - This->vols = NULL; - } else { - list_add_tail(&This->session->clients, &This->entry); - This->stream = stream; - This->channel_count = channel_count; - set_stream_volumes(This); - } - - sessions_unlock(); - - return params.result; -} + const GUID *sessionguid);
extern HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *frames); @@ -671,7 +541,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_QueryInterface, AudioClient_AddRef, AudioClient_Release, - AudioClient_Initialize, + client_Initialize, client_GetBufferSize, client_GetStreamLatency, client_GetCurrentPadding,
Huw Davies (@huw) commented about dlls/winepulse.drv/mmdevdrv.c:
return AUDCLNT_E_ALREADY_INITIALIZED; }
- if (FAILED(hr = main_loop_start()))
- if (FAILED(params.result = main_loop_start())) { sessions_unlock();
return hr;
return params.result;
}
channel_count = fmt->nChannels;
Not sure what this is doing here, since it's getting removed in the next commit.
On Thu Jun 22 09:26:06 2023 +0000, Huw Davies wrote:
Not sure what this is doing here, since it's getting removed in the next commit.
Mistake of mine, I copied the code from `winealsa` before removing the line.