Due to previous patch the volume mute is updated to be controlled with SOF_CTRL_CMD_SWITCH that maps to ALSA switch style control. Mute for a channel is set with an (unsigned) value larger than zero. Zero value unmutes the channel.
In both mute and volume set code the if statement to compare component channel map is changed to compare to chanv[j].channel instead of used chanv[j].value that looks incorrect.
Signed-off-by: Seppo Ingalsuo seppo.ingalsuo@linux.intel.com --- src/audio/volume.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/src/audio/volume.c b/src/audio/volume.c index 137be3c..28d3225 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -449,36 +449,35 @@ static int volume_ctrl_set_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *c
switch (cdata->cmd) { case SOF_CTRL_CMD_VOLUME: - + trace_volume("vst"); for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) { for (j = 0; j < cdata->num_elems; j++) { - if (cdata->chanv[j].value == cd->chan[i]) + tracev_value(cdata->chanv[j].channel); + tracev_value(cdata->chanv[j].value); + if (cdata->chanv[j].channel == cd->chan[i]) volume_set_chan(dev, i, cdata->chanv[j].value); } } - work_schedule_default(&cd->volwork, VOL_RAMP_US); break; - case SOF_CTRL_CMD_MUTE:
+ case SOF_CTRL_CMD_SWITCH: + trace_volume("mst"); for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) { for (j = 0; j < cdata->num_elems; j++) { - if (cdata->chanv[j].value == cd->chan[i]) - volume_set_chan_mute(dev, i); + tracev_value(cdata->chanv[j].channel); + tracev_value(cdata->chanv[j].value); + if (cdata->chanv[j].channel == cd->chan[i]) { + if (cdata->chanv[j].value > 0) + volume_set_chan_mute(dev, i); + else + volume_set_chan_unmute(dev, i); + } } } work_schedule_default(&cd->volwork, VOL_RAMP_US); break; - case SOF_CTRL_CMD_UNMUTE:
- for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) { - for (j = 0; j < cdata->num_elems; j++) { - if (cdata->chanv[j].value == cd->chan[i]) - volume_set_chan_unmute(dev, i); - } - } - work_schedule_default(&cd->volwork, VOL_RAMP_US); - break; default: trace_volume_error("gs1"); return -EINVAL;