Huw Davies : winealsa: Store the channel volumes in the stream.

Alexandre Julliard julliard at winehq.org
Mon Feb 21 16:15:14 CST 2022


Module: wine
Branch: master
Commit: f608d78910894de739d4f7bba08f03f179b270e5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f608d78910894de739d4f7bba08f03f179b270e5

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Feb 18 08:29:27 2022 +0000

winealsa: Store the channel volumes in the stream.

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 | 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




More information about the wine-cvs mailing list