diff --git a/topology/m4/mixercontrol.m4 b/topology/m4/mixercontrol.m4 index a3423c3..e73c941 100644 --- a/topology/m4/mixercontrol.m4 +++ b/topology/m4/mixercontrol.m4 @@ -28,6 +28,79 @@ define(`CONTROLMIXER_OPS', ` put STR($4)' ` }') +dnl KCONTROL_MONO_CHANNEL(reg) +define(`KCONTROL_MONO_CHANNEL', +`KCONTROL_CHANNEL(MONO, $1, 0)') + +dnl KCONTROL_STEREO_CHANNELS(reg) +define(`KCONTROL_STEREO_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1)') + +dnl KCONTROL_THREE_CHANNELS(reg) +define(`KCONTROL_THREE_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(FC, $1, 2)') + +dnl KCONTROL_FOUR_CHANNELS(reg) +define(`KCONTROL_FOUR_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(RL, $1, 2),' +`KCONTROL_CHANNEL(RR, $1, 3)') + +dnl KCONTROL_FIVE_CHANNELS(reg) +define(`KCONTROL_FIVE_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(RL, $1, 2),' +`KCONTROL_CHANNEL(RR, $1, 3),' +`KCONTROL_CHANNEL(FC, $1, 4)') + +dnl KCONTROL_SIX_CHANNELS(reg) +define(`KCONTROL_SIX_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(RL, $1, 2),' +`KCONTROL_CHANNEL(RR, $1, 3),' +`KCONTROL_CHANNEL(FC, $1, 4),' +`KCONTROL_CHANNEL(LFE, $1, 5)') + +KCONTROL_SEVEN_CHANNELS(reg) +define(`KCONTROL_SEVEN_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(RL, $1, 2),' +`KCONTROL_CHANNEL(RR, $1, 3),' +`KCONTROL_CHANNEL(FC, $1, 4),' +`KCONTROL_CHANNEL(SL, $1, 5),' +`KCONTROL_CHANNEL(SR, $1, 6)') + +dnl KCONTROL_EIGHT_CHANNELS(reg) +define(`KCONTROL_EIGHT_CHANNELS', +`KCONTROL_CHANNEL(FL, $1, 0),' +`KCONTROL_CHANNEL(FR, $1, 1),' +`KCONTROL_CHANNEL(RL, $1, 2),' +`KCONTROL_CHANNEL(RR, $1, 3),' +`KCONTROL_CHANNEL(FC, $1, 4),' +`KCONTROL_CHANNEL(LFE, $1, 5),' +`KCONTROL_CHANNEL(SL, $1, 6),' +`KCONTROL_CHANNEL(SR, $1, 7)') + +dnl KCONTROL_CHANNEL_ARRAY(size, reg) +define(`KCONTROL_CHANNEL_ARRAY', +`ifelse( + $1, `1', `KCONTROL_MONO_CHANNEL($2)', + $1, `2', `KCONTROL_STEREO_CHANNELS($2)', + $1, `3', `KCONTROL_THREE_CHANNELS($2)', + $1, `4', `KCONTROL_FOUR_CHANNELS($2)', + $1, `5', `KCONTROL_FIVE_CHANNELS($2)', + $1, `6', `KCONTROL_SIX_CHANNELS($2)', + $1, `7', `KCONTROL_SEVEN_CHANNELS($2)', + $1, `8', `KCONTROL_EIGHT_CHANNELS($2)', + `KCONTROL_STEREO_CHANNELS($2)')') + dnl C_CONTROLMIXER(name, index, ops, max, invert, tlv, KCONTROL_CHANNELS) define(`C_CONTROLMIXER', `SectionControlMixer."$1 PIPELINE_ID" {' diff --git a/topology/sof/pipe-multi-channels-volume-capture.m4 b/topology/sof/pipe-multi-channels-volume-capture.m4 new file mode 100644 index 0000000..73dc352 --- /dev/null +++ b/topology/sof/pipe-multi-channels-volume-capture.m4 @@ -0,0 +1,70 @@ +# Passthrough with multi-channels volume Pipeline and PCM +# +# Pipeline Endpoints for connection are :- +# +# host PCM_C <-- B0 <-- Volume 0 <-- B1 <-- source DAI0 + +# Include topology builder +include(`utils.m4') +include(`buffer.m4') +include(`pcm.m4') +include(`pga.m4') +include(`dai.m4') +include(`mixercontrol.m4') +include(`pipeline.m4') + +# +# Controls +# +# Volume Mixer control with max value of 32 +C_CONTROLMIXER(Master Capture Volume, PIPELINE_ID, + CONTROLMIXER_OPS(volsw, volsw binds the mixer control to volume get/put handlers, 1, 1), + CONTROLMIXER_MAX(, 32), + false, + CONTROLMIXER_TLV(TLV 32 steps from -90dB to +6dB for 3dB, vtlv_m90s3), + Channel register and shift for Front Left/Right, + LIST(` ', KCONTROL_CHANNEL_ARRAY(PIPELINE_CHANNELS, 1))) + +# +# Components and Buffers +# + +# Host "Passthrough Capture" PCM +# with 0 sink and 2 source periods +W_PCM_CAPTURE(PCM_ID, Passthrough Capture, 0, 2, 2) + +# "Volume" has 2 source and 2 sink periods +W_PGA(0, PIPELINE_FORMAT, 2, 2, 2, LIST(` ', "Master Capture Volume PIPELINE_ID")) + +# Capture Buffers +W_BUFFER(0, COMP_BUFFER_SIZE(2, + COMP_SAMPLE_SIZE(PIPELINE_FORMAT), PIPELINE_CHANNELS, SCHEDULE_FRAMES), + PLATFORM_HOST_MEM_CAP) +W_BUFFER(1, COMP_BUFFER_SIZE(2, + COMP_SAMPLE_SIZE(DAI_FORMAT), PIPELINE_CHANNELS, SCHEDULE_FRAMES), + PLATFORM_DAI_MEM_CAP) + +# +# Pipeline Graph +# +# host PCM_P <-- B0 <-- Volume 0 <-- B1 <-- sink DAI0 + +P_GRAPH(pipe-pass-vol-capture-PIPELINE_ID, PIPELINE_ID, + LIST(` ', + `dapm(Passthrough Capture PCM_ID, N_PCMC(PCM_ID))', + `dapm(N_PCMC(PCM_ID), N_BUFFER(0))', + `dapm(N_BUFFER(0), N_PGA(0))', + `dapm(N_PGA(0), N_BUFFER(1))')) + +# +# Pipeline Source and Sinks +# +indir(`define', concat(`PIPELINE_SINK_', PIPELINE_ID), N_BUFFER(1)) +indir(`define', concat(`PIPELINE_PCM_', PIPELINE_ID), Passthrough Capture PCM_ID) + +# +# PCM Configuration +# + +PCM_CAPABILITIES(Passthrough Capture PCM_ID, `S32_LE,S24_LE,S16_LE', 48000, 48000, 2, 8, 2, 16, 192, 16384, 65536, 65536) + diff --git a/topology/sof/pipe-multi-channels-volume-playback.m4 b/topology/sof/pipe-multi-channels-volume-playback.m4 new file mode 100644 index 0000000..0c78790 --- /dev/null +++ b/topology/sof/pipe-multi-channels-volume-playback.m4 @@ -0,0 +1,71 @@ +# Low Latency Passthrough with multi-channels volume Pipeline and PCM +# +# Pipeline Endpoints for connection are :- +# +# host PCM_P --> B0 --> Volume 0 --> B1 --> sink DAI0 + +# Include topology builder +include(`utils.m4') +include(`buffer.m4') +include(`pcm.m4') +include(`pga.m4') +include(`dai.m4') +include(`mixercontrol.m4') +include(`pipeline.m4') + +# +# Controls +# +# Volume Mixer control with max value of 32 +C_CONTROLMIXER(Master Playback Volume, PIPELINE_ID, + CONTROLMIXER_OPS(volsw, volsw binds the mixer control to volume get/put handlers, 1, 1), + CONTROLMIXER_MAX(, 32), + false, + CONTROLMIXER_TLV(TLV 32 steps from -90dB to +6dB for 3dB, vtlv_m90s3), + Channel register and shift for Front Left/Right, + LIST(` ', KCONTROL_CHANNEL_ARRAY(PIPELINE_CHANNELS, 1))) + +# +# Components and Buffers +# + +# Host "Passthrough Playback" PCM +# with 2 sink and 0 source periods +W_PCM_PLAYBACK(PCM_ID, Passthrough Playback, 2, 0, 2) + +# "Volume" has 2 source and 2 sink periods +W_PGA(0, PIPELINE_FORMAT, 2, 2, 2, LIST(` ', "Master Playback Volume PIPELINE_ID")) + +# Playback Buffers +W_BUFFER(0, COMP_BUFFER_SIZE(2, + COMP_SAMPLE_SIZE(PIPELINE_FORMAT), PIPELINE_CHANNELS, SCHEDULE_FRAMES), + PLATFORM_HOST_MEM_CAP) +W_BUFFER(1, COMP_BUFFER_SIZE(2, + COMP_SAMPLE_SIZE(DAI_FORMAT), PIPELINE_CHANNELS, SCHEDULE_FRAMES), + PLATFORM_DAI_MEM_CAP) + +# +# Pipeline Graph +# +# host PCM_P --> B0 --> Volume 0 --> B1 --> sink DAI0 + +P_GRAPH(pipe-pass-vol-playback-PIPELINE_ID, PIPELINE_ID, + LIST(` ', + `dapm(N_PCMP(PCM_ID), Passthrough Playback PCM_ID)', + `dapm(N_BUFFER(0), N_PCMP(PCM_ID))', + `dapm(N_PGA(0), N_BUFFER(0))', + `dapm(N_BUFFER(1), N_PGA(0))')) + +# +# Pipeline Source and Sinks +# +indir(`define', concat(`PIPELINE_SOURCE_', PIPELINE_ID), N_BUFFER(1)) +indir(`define', concat(`PIPELINE_PCM_', PIPELINE_ID), Passthrough Playback PCM_ID) + + +# +# PCM Configuration + +# +PCM_CAPABILITIES(Passthrough Playback PCM_ID, `S32_LE,S24_LE,S16_LE', 48000, 48000, 2, 8, 2, 16, 192, 16384, 65536, 65536) +