Module: wine Branch: master Commit: 1ad8978f4068ad91b43d35345297f2c00d6710e3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=1ad8978f4068ad91b43d35345...
Author: Huw Davies huw@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@codeweavers.com Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);