[Sound-open-firmware] [PATCH] topology: Allow multiple kcontrols for volume widget
This patch adds support for multiple kcontrols for the volume widget and adds a mute switch kcontrol to the volume playback pipeline.
Signed-off-by: Ranjani Sridharan ranjani.sridharan@linux.intel.com
--- Tested with: Minnowboard Turbot rt5651 SOF master: fad6f2e8490e8a1b21668a783204006e180725b5 SOF-Tool master: 58079d09994c2b243990bd23e5aff481bfd0f6c7 https://github.com/plbossart/sound/tree/topic/sof-v4.14: 6fa721a8b7c6567eea0a2181bf9a3d2a12c31b00 --- --- topology/m4/local.m4 | 21 ++++++++++++++------- topology/sof/pipe-low-latency-capture.m4 | 2 +- topology/sof/pipe-low-latency-playback.m4 | 4 ++-- topology/sof/pipe-pcm-media.m4 | 2 +- topology/sof/pipe-tone.m4 | 2 +- topology/sof/pipe-volume-capture.m4 | 2 +- topology/sof/pipe-volume-playback.m4 | 28 +++++++++++++++++++++++++++- 7 files changed, 47 insertions(+), 14 deletions(-)
diff --git a/topology/m4/local.m4 b/topology/m4/local.m4 index ad72a11..02d79a5 100644 --- a/topology/m4/local.m4 +++ b/topology/m4/local.m4 @@ -4,6 +4,13 @@ define(`concat',`$1$2')
define(`STR', `"'$1`"')
+define(`argn', `ifelse(`$1', 1, ``$2'', + `argn(decr(`$1'), shift(shift($@)))')') + +define(`KCONTROLS', `pushdef(`i', $#) pushdef(`j', `1') KCONTROL_LOOP($@)') +define(`KCONTROL_LOOP', `argn(j,$@) + ifelse(i,`1', `', `define(`i', decr(i)) define(`j', incr(j)) $0($@)')') + dnl create direct DAPM/pipeline link between 2 widgets) define(`dapm', `"$1, , $2"')
@@ -143,14 +150,14 @@ define(`W_PCM_CAPTURE', dnl PGA name) define(`N_PGA', `PGA'PIPELINE_ID`.'$1)
-dnl W_PGA(name, kcontrol, format, periods_sink, periods_source, preload) +dnl W_PGA(name, format, periods_sink, periods_source, preload, kcontrol0. kcontrol1...etc) define(`W_PGA', -`SectionVendorTuples."'N_PGA($1)`_tuples_w" {' +`pushdef(`args',`eval($#-6)')SectionVendorTuples."'N_PGA($1)`_tuples_w" {' ` tokens "sof_comp_tokens"' ` tuples."word" {' -` SOF_TKN_COMP_PERIOD_SINK_COUNT' STR($4) -` SOF_TKN_COMP_PERIOD_SOURCE_COUNT' STR($5) -` SOF_TKN_COMP_PRELOAD_COUNT' STR($6) +` SOF_TKN_COMP_PERIOD_SINK_COUNT' STR($3) +` SOF_TKN_COMP_PERIOD_SOURCE_COUNT' STR($4) +` SOF_TKN_COMP_PRELOAD_COUNT' STR($5) ` }' `}' `SectionData."'N_PGA($1)`_data_w" {' @@ -159,7 +166,7 @@ define(`W_PGA', `SectionVendorTuples."'N_PGA($1)`_tuples_str" {' ` tokens "sof_comp_tokens"' ` tuples."string" {' -` SOF_TKN_COMP_FORMAT' STR($3) +` SOF_TKN_COMP_FORMAT' STR($2) ` }' `}' `SectionData."'N_PGA($1)`_data_str" {' @@ -174,7 +181,7 @@ define(`W_PGA', ` "'N_PGA($1)`_data_str"' ` ]' ` mixer [' -` "'$2`"' + $6 ` ]' `}')
diff --git a/topology/sof/pipe-low-latency-capture.m4 b/topology/sof/pipe-low-latency-capture.m4 index 0c989a7..2602ebd 100644 --- a/topology/sof/pipe-low-latency-capture.m4 +++ b/topology/sof/pipe-low-latency-capture.m4 @@ -48,7 +48,7 @@ SectionControlMixer.STR(PCM PCM_ID Capture Volume) { W_PCM_CAPTURE(Low Latency Capture, PIPELINE_DMAC, PIPELINE_DMAC_CHAN, 0, 2, 0)
# "Capture Volume" has 2 sink and source periods for host and DAI ping-pong -W_PGA(0, PCM PCM_ID Capture Volume, PIPELINE_FORMAT, 2, 2, 0) +W_PGA(0, PIPELINE_FORMAT, 2, 2, 0, KCONTROLS("PCM PCM_ID Capture Volume"))
# Capture Buffers W_BUFFER(0, COMP_BUFFER_SIZE(2, diff --git a/topology/sof/pipe-low-latency-playback.m4 b/topology/sof/pipe-low-latency-playback.m4 index cd04ccf..ebb14ec 100644 --- a/topology/sof/pipe-low-latency-playback.m4 +++ b/topology/sof/pipe-low-latency-playback.m4 @@ -91,10 +91,10 @@ SectionControlMixer.STR(Master Playback Volume) { W_PCM_PLAYBACK(Low Latency Playback, PIPELINE_DMAC, PIPELINE_DMAC_CHAN, 2, 0, 2)
# "Playback Volume" has 1 sink period and 2 source periods for host ping-pong -W_PGA(0, PCM PCM_ID Playback Volume, PIPELINE_FORMAT, 1, 2, 1) +W_PGA(0, PIPELINE_FORMAT, 1, 2, 1, KCONTROLS("PCM PCM_ID Playback Volume"))
# "Master Playback Volume" has 1 source and 2 sink periods for DAI ping-pong -W_PGA(1, Master Playback Volume, PIPELINE_FORMAT, 2, 1, 1) +W_PGA(1, PIPELINE_FORMAT, 2, 1, 1, KCONTROLS("Master Playback Volume"))
# Mixer 0 has 1 sink and source periods. W_MIXER(0, PIPELINE_FORMAT, 1, 1, 1) diff --git a/topology/sof/pipe-pcm-media.m4 b/topology/sof/pipe-pcm-media.m4 index 7bfb35a..526ae35 100644 --- a/topology/sof/pipe-pcm-media.m4 +++ b/topology/sof/pipe-pcm-media.m4 @@ -68,7 +68,7 @@ SectionData."media_src_conf" { W_PCM_PLAYBACK(Media Playback, PIPELINE_DMAC, PIPELINE_DMAC_CHAN, 2, 0, 2)
# "Playback Volume" has 2 sink period and 2 source periods for host ping-pong -W_PGA(0, PCM PCM_ID Playback Volume, PIPELINE_FORMAT, 2, 2, 2) +W_PGA(0, PIPELINE_FORMAT, 2, 2, 2, KCONTROLS("PCM PCM_ID Playback Volume"))
# "SRC 0" has 2 sink and source periods. W_SRC(0, PIPELINE_FORMAT, 2, 2, media_src_conf, 2) diff --git a/topology/sof/pipe-tone.m4 b/topology/sof/pipe-tone.m4 index ccead10..e04a1b9 100644 --- a/topology/sof/pipe-tone.m4 +++ b/topology/sof/pipe-tone.m4 @@ -50,7 +50,7 @@ SectionControlMixer.STR(Tone Volume PIPELINE_ID) { W_TONE(0, PIPELINE_FORMAT, 2, 0, 0)
# "Tone Volume" has 2 sink period and 2 source periods -W_PGA(0, Tone Volume PIPELINE_ID, PIPELINE_FORMAT, 2, 2, 0) +W_PGA(0, PIPELINE_FORMAT, 2, 2, 0, KCONTROLS("Tone Volume PIPELINE_ID"))
# Low Latency Buffers W_BUFFER(0,COMP_BUFFER_SIZE(2, diff --git a/topology/sof/pipe-volume-capture.m4 b/topology/sof/pipe-volume-capture.m4 index 3030907..58e5393 100644 --- a/topology/sof/pipe-volume-capture.m4 +++ b/topology/sof/pipe-volume-capture.m4 @@ -47,7 +47,7 @@ SectionControlMixer.STR(Master Capture Volume) { W_PCM_CAPTURE(Passthrough Capture, PIPELINE_DMAC, PIPELINE_DMAC_CHAN, 0, 2, 2)
# "Volume" has 2 source and 2 sink periods -W_PGA(0, Master Capture Volume, PIPELINE_FORMAT, 2, 2, 2) +W_PGA(0, PIPELINE_FORMAT, 2, 2, 2, KCONTROLS("Master Capture Volume"))
# Capture Buffers W_BUFFER(0, COMP_BUFFER_SIZE(2, diff --git a/topology/sof/pipe-volume-playback.m4 b/topology/sof/pipe-volume-playback.m4 index 54bc13d..8aa02fb 100644 --- a/topology/sof/pipe-volume-playback.m4 +++ b/topology/sof/pipe-volume-playback.m4 @@ -38,6 +38,32 @@ SectionControlMixer.STR(Master Playback Volume) { tlv "vtlv_m90s3" }
+SectionControlMixer.STR(Master Playback Volume Switch) { + + # control belongs to this index group + index STR(PIPELINE_ID) + + # Channel register and shift for Front Left/Right + channel."FL" { + reg "1" + shift "0" + } + channel."FR" { + reg "1" + shift "1" + } + + # control uses bespoke driver get/put/info ID 0 + ops."ctl" { + info "volsw" + get "256" + put "256" + } + + # Volume mute on/off + max "1" + invert "false" +} # # Components and Buffers # @@ -47,7 +73,7 @@ SectionControlMixer.STR(Master Playback Volume) { W_PCM_PLAYBACK(Passthrough Playback, PIPELINE_DMAC, PIPELINE_DMAC_CHAN, 2, 0, 2)
# "Volume" has 2 source and 2 sink periods -W_PGA(0, Master Playback Volume, PIPELINE_FORMAT, 2, 2, 2) +W_PGA(0, PIPELINE_FORMAT, 2, 2, 2, KCONTROLS("Master Playback Volume Switch", "Master Playback Volume"))
# Playback Buffers W_BUFFER(0, COMP_BUFFER_SIZE(2,
On Fri, 2018-02-09 at 23:49 -0800, Ranjani Sridharan wrote:
This patch adds support for multiple kcontrols for the volume widget and adds a mute switch kcontrol to the volume playback pipeline.
Signed-off-by: Ranjani Sridharan ranjani.sridharan@linux.intel.com
I like the M4 looping, very nice.
Applied.
Thanks
Liam --------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
participants (2)
-
Liam Girdwood
-
Ranjani Sridharan