[PATCH 1/8] winealsa: Explicitly store the name and channel count in the audio client.

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


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

On Wed, Feb 16, 2022 at 09:34:47AM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/winealsa.drv/mmdevdrv.c | 27 ++++++++++++++++++---------
>  1 file changed, 18 insertions(+), 9 deletions(-)
> 
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index 516bba1e5fc..abec9dc969a 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -119,6 +119,7 @@ struct ACImpl {
>      AUDCLNT_SHAREMODE share;
>      HANDLE event;
>      float *vols;
> +    UINT32 channel_count;
>  
>      BOOL need_remapping;
>      int alsa_channels;
> @@ -145,6 +146,9 @@ struct ACImpl {
>      AudioSessionWrapper *session_wrapper;
>  
>      struct list entry;
> +
> +    /* Keep at end */
> +    char alsa_name[1];
>  };
>  
>  typedef struct _SessionMgr {
> @@ -472,6 +476,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
>      char alsa_name[256];
>      EDataFlow dataflow;
>      HRESULT hr;
> +    int len;
>  
>      TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
>  
> @@ -481,7 +486,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
>      if(dataflow != eRender && dataflow != eCapture)
>          return E_UNEXPECTED;
>  
> -    This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACImpl));
> +    len = strlen(alsa_name);
> +    This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, alsa_name[len + 1]));
>      if(!This)
>          return E_OUTOFMEMORY;
>  
> @@ -499,6 +505,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
>      }
>  
>      This->dataflow = dataflow;
> +    memcpy(This->alsa_name, alsa_name, len + 1);
> +
>      err = snd_pcm_open(&This->pcm_handle, alsa_name, alsa_get_direction(dataflow), SND_PCM_NONBLOCK);
>      if(err < 0){
>          HeapFree(GetProcessHeap(), 0, This);
> @@ -1159,19 +1167,20 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>      }
>      silence_buffer(This, This->silence_buf, This->alsa_period_frames);
>  
> -    This->vols = HeapAlloc(GetProcessHeap(), 0, fmt->nChannels * sizeof(float));
> +    This->channel_count = fmt->nChannels;
> +    This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float));
>      if(!This->vols){
>          hr = E_OUTOFMEMORY;
>          goto exit;
>      }
>  
> -    for(i = 0; i < fmt->nChannels; ++i)
> +    for(i = 0; i < This->channel_count; ++i)
>          This->vols[i] = 1.f;
>  
>      This->share = mode;
>      This->flags = flags;
>  
> -    hr = get_audio_session(sessionguid, This->parent, fmt->nChannels,
> +    hr = get_audio_session(sessionguid, This->parent, This->channel_count,
>              &This->session);
>      if(FAILED(hr))
>          goto exit;
> @@ -3385,7 +3394,7 @@ static HRESULT WINAPI AudioStreamVolume_GetChannelCount(
>      if(!out)
>          return E_POINTER;
>  
> -    *out = This->fmt->nChannels;
> +    *out = This->channel_count;
>  
>      return S_OK;
>  }
> @@ -3400,7 +3409,7 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume(
>      if(level < 0.f || level > 1.f)
>          return E_INVALIDARG;
>  
> -    if(index >= This->fmt->nChannels)
> +    if(index >= This->channel_count)
>          return E_INVALIDARG;
>  
>      TRACE("ALSA does not support volume control\n");
> @@ -3424,7 +3433,7 @@ static HRESULT WINAPI AudioStreamVolume_GetChannelVolume(
>      if(!level)
>          return E_POINTER;
>  
> -    if(index >= This->fmt->nChannels)
> +    if(index >= This->channel_count)
>          return E_INVALIDARG;
>  
>      *level = This->vols[index];
> @@ -3443,7 +3452,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
>      if(!levels)
>          return E_POINTER;
>  
> -    if(count != This->fmt->nChannels)
> +    if(count != This->channel_count)
>          return E_INVALIDARG;
>  
>      TRACE("ALSA does not support volume control\n");
> @@ -3469,7 +3478,7 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes(
>      if(!levels)
>          return E_POINTER;
>  
> -    if(count != This->fmt->nChannels)
> +    if(count != This->channel_count)
>          return E_INVALIDARG;
>  
>      EnterCriticalSection(&This->lock);
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list