[PATCH 4/8] winealsa: Move the pcm device opening to a helper.

Andrew Eikum aeikum at codeweavers.com
Thu Feb 17 09:25:41 CST 2022


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Wed, Feb 16, 2022 at 09:34:50AM +0000, Huw Davies wrote:
> This will allow GetMixFormat and IsFormatSupported to share
> this code without needing a stream.
> 
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/winealsa.drv/mmdevdrv.c | 50 ++++++++++++++++++++++--------------
>  1 file changed, 31 insertions(+), 19 deletions(-)
> 
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index f1bc2fd0247..ecd74d373aa 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -442,10 +442,37 @@ static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EData
>      return FALSE;
>  }
>  
> +static HRESULT alsa_open_device(const char *alsa_name, EDataFlow flow, snd_pcm_t **pcm_handle,
> +                                snd_pcm_hw_params_t **hw_params)
> +{
> +    int err;
> +
> +    if(flow != eRender && flow != eCapture)
> +        return E_UNEXPECTED;
> +
> +    err = snd_pcm_open(pcm_handle, alsa_name, alsa_get_direction(flow), SND_PCM_NONBLOCK);
> +    if(err < 0){
> +        WARN("Unable to open PCM \"%s\": %d (%s)\n", alsa_name, err, snd_strerror(err));
> +        switch(err){
> +        case -EBUSY:
> +            return AUDCLNT_E_DEVICE_IN_USE;
> +        default:
> +            return AUDCLNT_E_ENDPOINT_CREATE_FAILED;
> +        }
> +    }
> +
> +    *hw_params = HeapAlloc(GetProcessHeap(), 0, snd_pcm_hw_params_sizeof());
> +    if(!*hw_params){
> +        snd_pcm_close(*pcm_handle);
> +        return E_OUTOFMEMORY;
> +    }
> +
> +    return S_OK;
> +}
> +
>  HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out)
>  {
>      ACImpl *This;
> -    int err;
>      char alsa_name[256];
>      EDataFlow dataflow;
>      HRESULT hr;
> @@ -486,26 +513,11 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
>          return E_OUTOFMEMORY;
>      }
>  
> -    err = snd_pcm_open(&This->stream->pcm_handle, alsa_name, alsa_get_direction(dataflow), SND_PCM_NONBLOCK);
> -    if(err < 0){
> -        HeapFree(GetProcessHeap(), 0, This->stream);
> -        HeapFree(GetProcessHeap(), 0, This);
> -        WARN("Unable to open PCM \"%s\": %d (%s)\n", alsa_name, err, snd_strerror(err));
> -        switch(err){
> -        case -EBUSY:
> -            return AUDCLNT_E_DEVICE_IN_USE;
> -        default:
> -            return AUDCLNT_E_ENDPOINT_CREATE_FAILED;
> -        }
> -    }
> -
> -    This->stream->hw_params = HeapAlloc(GetProcessHeap(), 0,
> -            snd_pcm_hw_params_sizeof());
> -    if(!This->stream->hw_params){
> -        snd_pcm_close(This->stream->pcm_handle);
> +    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 E_OUTOFMEMORY;
> +        return hr;
>      }
>  
>      InitializeCriticalSection(&This->lock);
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list