[Sound-open-firmware] [PATCH 2/5] Volume: Replace SOF_CTRL_CMD_MUTE/UNMUTE with SOF_CTRL_CMD_SWITCH

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Fri Oct 20 23:38:09 CEST 2017


On 10/20/17 12:15 PM, Seppo Ingalsuo wrote:
> 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.

Mute and switch are not synonyms - the results are inverted.
ALSA switches set to 1 means enable audio (unmute), 0 means mute.
we've had this confusion in the past with inverted logic for the SST 
driver.
We should also treat switch as a boolean, it's zero or one so we can 
test with switch or !switch.

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



More information about the Sound-open-firmware mailing list