[PATCH 1/7] winealsa: Store the channel volumes in the stream.
Andrew Eikum
aeikum at codeweavers.com
Mon Feb 21 10:29:25 CST 2022
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Fri, Feb 18, 2022 at 08:29:27AM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> dlls/winealsa.drv/mmdevdrv.c | 24 +++++++++++++++++++++++-
> dlls/winealsa.drv/unixlib.h | 1 +
> 2 files changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index 48694710719..d1f9a1d35a4 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -321,6 +321,15 @@ static snd_pcm_stream_t alsa_get_direction(EDataFlow flow)
> return (flow == eRender) ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE;
> }
>
> +static void set_stream_volumes(ACImpl *This)
> +{
> + struct alsa_stream *stream = This->stream;
> + unsigned int i;
> +
> + for(i = 0; i < stream->fmt->nChannels; i++)
> + stream->vols[i] = This->vols[i];
> +}
> +
> HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out,
> UINT *num, UINT *def_index)
> {
> @@ -591,6 +600,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
> HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
> HeapFree(GetProcessHeap(), 0, stream->hw_params);
> CoTaskMemFree(stream->fmt);
> + HeapFree(GetProcessHeap(), 0, stream->vols);
> HeapFree(GetProcessHeap(), 0, stream);
> }
> HeapFree(GetProcessHeap(), 0, This);
> @@ -1171,6 +1181,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
> for(i = 0; i < This->channel_count; ++i)
> This->vols[i] = 1.f;
>
> + stream->vols = HeapAlloc(GetProcessHeap(), 0, fmt->nChannels * sizeof(float));
> + if(!stream->vols){
> + hr = E_OUTOFMEMORY;
> + goto exit;
> + }
> + for(i = 0; i < fmt->nChannels; ++i)
> + stream->vols[i] = 1.f;
> +
> stream->share = mode;
> stream->flags = flags;
>
> @@ -1194,11 +1212,13 @@ exit:
> stream->local_buffer = NULL;
> CoTaskMemFree(stream->fmt);
> stream->fmt = NULL;
> + HeapFree(GetProcessHeap(), 0, stream->vols);
> HeapFree(GetProcessHeap(), 0, stream);
> HeapFree(GetProcessHeap(), 0, This->vols);
> This->vols = NULL;
> }else{
> This->stream = stream;
> + set_stream_volumes(This);
> }
>
> LeaveCriticalSection(&This->lock);
> @@ -1471,7 +1491,7 @@ static void adjust_buffer_volume(const ACImpl *This, BYTE *buf, snd_pcm_uframes_
>
> /* Adjust the buffer based on the volume for each channel */
> for (i = 0; i < channels; i++)
> - vol[i] = This->vols[i] * This->session->master_vol;
> + vol[i] = stream->vols[i] * This->session->master_vol;
> for (i = 0; i < min(channels, This->session->channel_count); i++)
> {
> vol[i] *= This->session->channel_vols[i];
> @@ -3214,6 +3234,7 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume(
> EnterCriticalSection(&This->lock);
>
> This->vols[index] = level;
> + set_stream_volumes(This);
>
> LeaveCriticalSection(&This->lock);
>
> @@ -3258,6 +3279,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
>
> for(i = 0; i < count; ++i)
> This->vols[i] = levels[i];
> + set_stream_volumes(This);
>
> LeaveCriticalSection(&This->lock);
>
> diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
> index cd8d303b5d3..f121763952c 100644
> --- a/dlls/winealsa.drv/unixlib.h
> +++ b/dlls/winealsa.drv/unixlib.h
> @@ -49,6 +49,7 @@ struct alsa_stream
>
> BYTE *local_buffer, *tmp_buffer, *remapping_buf, *silence_buf;
> LONG32 getbuf_last; /* <0 when using tmp_buffer */
> + float *vols;
> };
>
> struct endpoint
> --
> 2.25.1
>
>
More information about the wine-devel
mailing list