[Sound-open-firmware] [PATCH] volume: remove unnecessary logic for mute/unmute
Ranjani
ranjani.sridharan at linux.intel.com
Wed Mar 14 22:41:00 CET 2018
On Wed, 2018-03-14 at 14:31 -0500, Pierre-Louis Bossart wrote:
>
> On 03/14/2018 02:12 PM, Ranjani Sridharan wrote:
> > This patch removes unnecessary logic for mute/unmute
> > in volume component. Mute is handled by the driver by sending 0 for
> > volume gain and unmute is handled by sending a non-zero value.
>
> So we will have two mixers on the user-space side, one for volume
> and
> one for Switch on/off.
> But you have a single IPC.
> So if alsactl restores the mixer values with the Switch on first,
> what
> is the value for the volume at the firmware level?
> Are we sure this design is rock-solid?
Pierre, the question I was trying to answer with this patch is, would
we ever have more than one mixer control for volume in user-space. I
guess you have answered the question here. In that case, we should
leave this logic in volume to handle it.
>
> >
> > Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com
> > >
> > ---
> > src/audio/volume.c | 75 ++++++++++++-----------------------------
> > -------------
> > 1 file changed, 16 insertions(+), 59 deletions(-)
> >
> > diff --git a/src/audio/volume.c b/src/audio/volume.c
> > index 0620e18..23e801c 100644
> > --- a/src/audio/volume.c
> > +++ b/src/audio/volume.c
> > @@ -74,7 +74,6 @@ struct comp_data {
> > uint32_t chan[SOF_IPC_MAX_CHANNELS];
> > uint32_t volume[SOF_IPC_MAX_CHANNELS]; /* current
> > volume */
> > uint32_t tvolume[SOF_IPC_MAX_CHANNELS]; /* target
> > volume */
> > - uint32_t mvolume[SOF_IPC_MAX_CHANNELS]; /* mute
> > volume */
> > void (*scale_vol)(struct comp_dev *dev, struct
> > comp_buffer *sink,
> > struct comp_buffer *source, uint32_t frames);
> > struct work volwork;
> > @@ -441,25 +440,6 @@ static inline void volume_set_chan(struct
> > comp_dev *dev, int chan, uint32_t vol)
> > cd->tvolume[chan] = v;
> > }
> >
> > -static inline void volume_set_chan_mute(struct comp_dev *dev, int
> > chan)
> > -{
> > - struct comp_data *cd = comp_get_drvdata(dev);
> > -
> > - /* Check if not muted already */
> > - if (cd->volume[chan] != 0)
> > - cd->mvolume[chan] = cd->volume[chan];
> > - cd->tvolume[chan] = 0;
> > -}
> > -
> > -static inline void volume_set_chan_unmute(struct comp_dev *dev,
> > int chan)
> > -{
> > - struct comp_data *cd = comp_get_drvdata(dev);
> > -
> > - /* Check if muted */
> > - if (cd->volume[chan] == 0)
> > - cd->tvolume[chan] = cd->mvolume[chan];
> > -}
> > -
> > static int volume_ctrl_set_cmd(struct comp_dev *dev, struct
> > sof_ipc_ctrl_data *cdata)
> > {
> > struct comp_data *cd = comp_get_drvdata(dev);
> > @@ -472,48 +452,25 @@ static int volume_ctrl_set_cmd(struct
> > comp_dev *dev, struct sof_ipc_ctrl_data *c
> > return -EINVAL;
> > }
> >
> > - switch (cdata->cmd) {
> > - case SOF_CTRL_CMD_VOLUME:
> > - trace_volume("vst");
> > - trace_value(cdata->comp_id);
> > - for (j = 0; j < cdata->num_elems; j++) {
> > - trace_value(cdata->chanv[j].channel);
> > - trace_value(cdata->chanv[j].value);
> > - i = cdata->chanv[j].channel;
> > - if ((i >= 0) && (i <
> > SOF_IPC_MAX_CHANNELS))
> > - volume_set_chan(dev, i, cdata-
> > >chanv[j].value);
> > - else {
> > - trace_volume_error("gs2");
> > - tracev_value(i);
> > - }
> > - }
> > - work_schedule_default(&cd->volwork, VOL_RAMP_US);
> > - break;
> > + if (cdata->cmd != SOF_CTRL_CMD_VOLUME) {
> > + trace_volume_error("ev0");
> > + return -EINVAL;
> > + }
> >
> > - case SOF_CTRL_CMD_SWITCH:
> > - trace_volume("mst");
> > - trace_value(cdata->comp_id);
> > - for (j = 0; j < cdata->num_elems; j++) {
> > - trace_value(cdata->chanv[j].channel);
> > - trace_value(cdata->chanv[j].value);
> > - i = cdata->chanv[j].channel;
> > - if ((i >= 0) && (i <
> > SOF_IPC_MAX_CHANNELS)) {
> > - if (cdata->chanv[j].value)
> > - volume_set_chan_unmute(dev
> > , i);
> > - else
> > - volume_set_chan_mute(dev,
> > i);
> > - } else {
> > - trace_volume_error("gs3");
> > - tracev_value(i);
> > - }
> > + trace_volume("vst");
> > + trace_value(cdata->comp_id);
> > + for (j = 0; j < cdata->num_elems; j++) {
> > + trace_value(cdata->chanv[j].channel);
> > + trace_value(cdata->chanv[j].value);
> > + i = cdata->chanv[j].channel;
> > + if (i >= 0 && i < SOF_IPC_MAX_CHANNELS) {
> > + volume_set_chan(dev, i, cdata-
> > >chanv[j].value);
> > + } else {
> > + trace_volume_error("gs2");
> > + tracev_value(i);
> > }
> > - work_schedule_default(&cd->volwork, VOL_RAMP_US);
> > - break;
> > -
> > - default:
> > - trace_volume_error("gs1");
> > - return -EINVAL;
> > }
> > + work_schedule_default(&cd->volwork, VOL_RAMP_US);
> >
> > return 0;
> > }
>
>
More information about the Sound-open-firmware
mailing list