[PATCH 5/5] winealsa: Move set_volumes to the unixlib.

Andrew Eikum aeikum at codeweavers.com
Fri Mar 11 07:54:04 CST 2022


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

On Thu, Mar 10, 2022 at 08:20:06AM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/winealsa.drv/alsa.c     | 50 ++++++++++++++++++++++++++++++++++++
>  dlls/winealsa.drv/mmdevdrv.c | 12 +++++----
>  dlls/winealsa.drv/unixlib.h  | 46 ++++++++-------------------------
>  3 files changed, 67 insertions(+), 41 deletions(-)
> 
> diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c
> index 365f5637b20..c199a2e603d 100644
> --- a/dlls/winealsa.drv/alsa.c
> +++ b/dlls/winealsa.drv/alsa.c
> @@ -45,6 +45,43 @@
>  
>  WINE_DEFAULT_DEBUG_CHANNEL(alsa);
>  
> +struct alsa_stream
> +{
> +    snd_pcm_t *pcm_handle;
> +    snd_pcm_uframes_t alsa_bufsize_frames, alsa_period_frames, safe_rewind_frames;
> +    snd_pcm_hw_params_t *hw_params; /* does not hold state between calls */
> +    snd_pcm_format_t alsa_format;
> +
> +    LARGE_INTEGER last_period_time;
> +
> +    WAVEFORMATEX *fmt;
> +    DWORD flags;
> +    AUDCLNT_SHAREMODE share;
> +    EDataFlow flow;
> +    HANDLE event;
> +
> +    BOOL need_remapping;
> +    int alsa_channels;
> +    int alsa_channel_map[32];
> +
> +    BOOL started, please_quit;
> +    REFERENCE_TIME mmdev_period_rt;
> +    UINT64 written_frames, last_pos_frames;
> +    UINT32 bufsize_frames, held_frames, tmp_buffer_frames, mmdev_period_frames;
> +    snd_pcm_uframes_t remapping_buf_frames;
> +    UINT32 lcl_offs_frames; /* offs into local_buffer where valid data starts */
> +    UINT32 wri_offs_frames; /* where to write fresh data in local_buffer */
> +    UINT32 hidden_frames;   /* ALSA reserve to ensure continuous rendering */
> +    UINT32 vol_adjusted_frames; /* Frames we've already adjusted the volume of but didn't write yet */
> +    UINT32 data_in_alsa_frames;
> +
> +    BYTE *local_buffer, *tmp_buffer, *remapping_buf, *silence_buf;
> +    LONG32 getbuf_last; /* <0 when using tmp_buffer */
> +    float *vols;
> +
> +    pthread_mutex_t lock;
> +};
> +
>  #define                     EXTRA_SAFE_RT   40000
>  
>  static const WCHAR drv_keyW[] = {'S','o','f','t','w','a','r','e','\\',
> @@ -2162,6 +2199,18 @@ static NTSTATUS get_position(void *args)
>      return alsa_unlock_result(stream, &params->result, S_OK);
>  }
>  
> +static NTSTATUS set_volumes(void *args)
> +{
> +    struct set_volumes_params *params = args;
> +    struct alsa_stream *stream = params->stream;
> +    unsigned int i;
> +
> +    for(i = 0; i < stream->fmt->nChannels; i++)
> +        stream->vols[i] = params->volumes[i] * params->session_volumes[i] * params->master_volume;
> +
> +    return STATUS_SUCCESS;
> +}
> +
>  static NTSTATUS set_event_handle(void *args)
>  {
>      struct set_event_handle_params *params = args;
> @@ -2213,6 +2262,7 @@ unixlib_entry_t __wine_unix_call_funcs[] =
>      get_next_packet_size,
>      get_frequency,
>      get_position,
> +    set_volumes,
>      set_event_handle,
>      is_started,
>  };
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index 0f6a30e0f45..c2ec3dd54af 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -334,12 +334,14 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid)
>  
>  static void set_stream_volumes(ACImpl *This)
>  {
> -    struct alsa_stream *stream = This->stream;
> -    unsigned int i;
> +    struct set_volumes_params params;
> +
> +    params.stream = This->stream;
> +    params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol);
> +    params.volumes = This->vols;
> +    params.session_volumes = This->session->channel_vols;
>  
> -    for(i = 0; i < stream->fmt->nChannels; i++)
> -        stream->vols[i] = This->session->mute ? 0.0f :
> -            This->vols[i] * This->session->channel_vols[i] * This->session->master_vol;
> +    ALSA_CALL(set_volumes, &params);
>  }
>  
>  HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out,
> diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
> index b73f40c8282..4326f79a50b 100644
> --- a/dlls/winealsa.drv/unixlib.h
> +++ b/dlls/winealsa.drv/unixlib.h
> @@ -18,42 +18,7 @@
>  
>  #include "audioclient.h"
>  
> -struct alsa_stream
> -{
> -    snd_pcm_t *pcm_handle;
> -    snd_pcm_uframes_t alsa_bufsize_frames, alsa_period_frames, safe_rewind_frames;
> -    snd_pcm_hw_params_t *hw_params; /* does not hold state between calls */
> -    snd_pcm_format_t alsa_format;
> -
> -    LARGE_INTEGER last_period_time;
> -
> -    WAVEFORMATEX *fmt;
> -    DWORD flags;
> -    AUDCLNT_SHAREMODE share;
> -    EDataFlow flow;
> -    HANDLE event;
> -
> -    BOOL need_remapping;
> -    int alsa_channels;
> -    int alsa_channel_map[32];
> -
> -    BOOL started, please_quit;
> -    REFERENCE_TIME mmdev_period_rt;
> -    UINT64 written_frames, last_pos_frames;
> -    UINT32 bufsize_frames, held_frames, tmp_buffer_frames, mmdev_period_frames;
> -    snd_pcm_uframes_t remapping_buf_frames;
> -    UINT32 lcl_offs_frames; /* offs into local_buffer where valid data starts */
> -    UINT32 wri_offs_frames; /* where to write fresh data in local_buffer */
> -    UINT32 hidden_frames;   /* ALSA reserve to ensure continuous rendering */
> -    UINT32 vol_adjusted_frames; /* Frames we've already adjusted the volume of but didn't write yet */
> -    UINT32 data_in_alsa_frames;
> -
> -    BYTE *local_buffer, *tmp_buffer, *remapping_buf, *silence_buf;
> -    LONG32 getbuf_last; /* <0 when using tmp_buffer */
> -    float *vols;
> -
> -    pthread_mutex_t lock;
> -};
> +struct alsa_stream;
>  
>  struct endpoint
>  {
> @@ -209,6 +174,14 @@ struct get_position_params
>      UINT64 *qpctime;
>  };
>  
> +struct set_volumes_params
> +{
> +    struct alsa_stream *stream;
> +    float master_volume;
> +    const float *volumes;
> +    const float *session_volumes;
> +};
> +
>  struct set_event_handle_params
>  {
>      struct alsa_stream *stream;
> @@ -243,6 +216,7 @@ enum alsa_funcs
>      alsa_get_next_packet_size,
>      alsa_get_frequency,
>      alsa_get_position,
> +    alsa_set_volumes,
>      alsa_set_event_handle,
>      alsa_is_started,
>  };
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list