Huw Davies : winealsa: Move the stream creation to AudioClient_Initialize().
Alexandre Julliard
julliard at winehq.org
Thu Feb 17 15:33:59 CST 2022
Module: wine
Branch: master
Commit: 1ad8978f4068ad91b43d35345297f2c00d6710e3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1ad8978f4068ad91b43d35345297f2c00d6710e3
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Feb 16 09:34:53 2022 +0000
winealsa: Move the stream creation to AudioClient_Initialize().
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winealsa.drv/mmdevdrv.c | 56 ++++++++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 25 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 8a80acd871a..10f2951a0e6 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -507,19 +507,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
This->dataflow = dataflow;
memcpy(This->alsa_name, alsa_name, len + 1);
- This->stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
- if(!This->stream){
- HeapFree(GetProcessHeap(), 0, This);
- return E_OUTOFMEMORY;
- }
-
- hr = alsa_open_device(alsa_name, dataflow, &This->stream->pcm_handle, &This->stream->hw_params);
- if(FAILED(hr)){
- HeapFree(GetProcessHeap(), 0, This->stream);
- HeapFree(GetProcessHeap(), 0, This);
- return hr;
- }
-
InitializeCriticalSection(&This->lock);
This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ACImpl.lock");
@@ -591,21 +578,23 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
IUnknown_Release(This->pUnkFTMarshal);
This->lock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->lock);
- snd_pcm_drop(stream->pcm_handle);
- snd_pcm_close(stream->pcm_handle);
if(This->initted){
EnterCriticalSection(&g_sessions_lock);
list_remove(&This->entry);
LeaveCriticalSection(&g_sessions_lock);
}
HeapFree(GetProcessHeap(), 0, This->vols);
- HeapFree(GetProcessHeap(), 0, stream->local_buffer);
- HeapFree(GetProcessHeap(), 0, stream->remapping_buf);
- HeapFree(GetProcessHeap(), 0, stream->silence_buf);
- HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
- HeapFree(GetProcessHeap(), 0, stream->hw_params);
- CoTaskMemFree(stream->fmt);
- HeapFree(GetProcessHeap(), 0, stream);
+ if (stream){
+ snd_pcm_drop(stream->pcm_handle);
+ snd_pcm_close(stream->pcm_handle);
+ HeapFree(GetProcessHeap(), 0, stream->local_buffer);
+ HeapFree(GetProcessHeap(), 0, stream->remapping_buf);
+ HeapFree(GetProcessHeap(), 0, stream->silence_buf);
+ HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
+ HeapFree(GetProcessHeap(), 0, stream->hw_params);
+ CoTaskMemFree(stream->fmt);
+ HeapFree(GetProcessHeap(), 0, stream);
+ }
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -919,7 +908,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
const GUID *sessionguid)
{
ACImpl *This = impl_from_IAudioClient3(iface);
- struct alsa_stream *stream = This->stream;
+ struct alsa_stream *stream;
snd_pcm_sw_params_t *sw_params = NULL;
snd_pcm_format_t format;
unsigned int rate, alsa_period_us;
@@ -988,6 +977,20 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
dump_fmt(fmt);
+ stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
+ if(!stream){
+ LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
+ return E_OUTOFMEMORY;
+ }
+
+ hr = alsa_open_device(This->alsa_name, This->dataflow, &stream->pcm_handle, &stream->hw_params);
+ if(FAILED(hr)){
+ LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
+ return hr;
+ }
+
stream->need_remapping = map_channels(This, fmt, &stream->alsa_channels, stream->alsa_channel_map) == S_OK;
if((err = snd_pcm_hw_params_any(stream->pcm_handle, stream->hw_params)) < 0){
@@ -1180,8 +1183,6 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
list_add_tail(&This->session->clients, &This->entry);
- This->initted = TRUE;
-
TRACE("ALSA period: %lu frames\n", stream->alsa_period_frames);
TRACE("ALSA buffer: %lu frames\n", stream->alsa_bufsize_frames);
TRACE("MMDevice period: %u frames\n", stream->mmdev_period_frames);
@@ -1190,12 +1191,17 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
exit:
HeapFree(GetProcessHeap(), 0, sw_params);
if(FAILED(hr)){
+ snd_pcm_close(stream->pcm_handle);
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
stream->local_buffer = NULL;
CoTaskMemFree(stream->fmt);
stream->fmt = NULL;
+ HeapFree(GetProcessHeap(), 0, stream);
HeapFree(GetProcessHeap(), 0, This->vols);
This->vols = NULL;
+ }else{
+ This->stream = stream;
+ This->initted = TRUE;
}
LeaveCriticalSection(&This->lock);
More information about the wine-cvs
mailing list