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