[PATCH 7/8] winealsa: Move the stream creation to AudioClient_Initialize().
Andrew Eikum
aeikum at codeweavers.com
Thu Feb 17 09:26:16 CST 2022
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Wed, Feb 16, 2022 at 09:34:53AM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> 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);
> --
> 2.25.1
>
>
More information about the wine-devel
mailing list