diff --git a/app/overlays/mt8196/waves_ctc_overlay.conf b/app/overlays/mt8196/waves_ctc_overlay.conf new file mode 100644 index 000000000000..fcd9e1e5730b --- /dev/null +++ b/app/overlays/mt8196/waves_ctc_overlay.conf @@ -0,0 +1,3 @@ +CONFIG_COMP_MODULE_ADAPTER=y +CONFIG_WAVES_CODEC=y +CONFIG_COMP_GOOGLE_CTC_AUDIO_PROCESSING=y diff --git a/tools/topology/topology1/CMakeLists.txt b/tools/topology/topology1/CMakeLists.txt index af6b5dc63a35..45bbf0de7361 100644 --- a/tools/topology/topology1/CMakeLists.txt +++ b/tools/topology/topology1/CMakeLists.txt @@ -101,6 +101,8 @@ set(TPLGS "sof-mt8196-mt6681\;sof-mt8196" "sof-mt8196-mt6681\;sof-mt8196-waves\;-DWAVES=1" "sof-mt8196-mt6681\;sof-mt8196-dts\;-DDTS=`DTS'" + "sof-mt8196-mt6681\;sof-mt8196-google-ctc\;-DGOOGLE_CTC=1" + "sof-mt8196-mt6681\;sof-mt8196-waves-google-ctc\;-DWAVES=1\;-DGOOGLE_CTC=1" "sof-acp-renoir\;sof-acp" "sof-rn-rt5682-rt1019\;sof-rn-rt5682-rt1019" diff --git a/tools/topology/topology1/m4/google_ctc_audio_processing.m4 b/tools/topology/topology1/m4/google_ctc_audio_processing.m4 index fd4e6a72145c..d5823814e862 100644 --- a/tools/topology/topology1/m4/google_ctc_audio_processing.m4 +++ b/tools/topology/topology1/m4/google_ctc_audio_processing.m4 @@ -60,6 +60,9 @@ define(`W_GOOGLE_CTC_AUDIO_PROCESSING', ` bytes [' $6 ` ]' +` mixer [' + $7 +` ]' `}') divert(0)dnl diff --git a/tools/topology/topology1/sof-mt8196-mt6681.m4 b/tools/topology/topology1/sof-mt8196-mt6681.m4 index fb8b6662314e..c406c6d387c8 100644 --- a/tools/topology/topology1/sof-mt8196-mt6681.m4 +++ b/tools/topology/topology1/sof-mt8196-mt6681.m4 @@ -37,7 +37,12 @@ dnl time_domain, sched_comp) define(`ENDPOINT_NAME', `Speakers') # Low Latency playback pipeline 1 on PCM 16 using max 2 channels of s16le # Set 1000us deadline with priority 0 on core 0 -PIPELINE_PCM_ADD(ifdef(`DTS', sof/pipe-eq-iir-dts-codec-playback.m4, ifdef(`WAVES', sof/pipe-waves-codec-playback.m4, sof/pipe-passthrough-playback.m4)), +PIPELINE_PCM_ADD( + ifdef(`DTS', sof/pipe-eq-iir-dts-codec-playback.m4, + ifdef(`WAVES', ifdef(`GOOGLE_CTC', sof/pipe-waves-codec-ctc-playback.m4, + sof/pipe-waves-codec-playback.m4), + ifdef(`GOOGLE_CTC', sof/pipe-ctc-playback.m4, + sof/pipe-passthrough-playback.m4))), 1, 0, 2, s16le, 1000, 0, 0, 48000, 48000, 48000) diff --git a/tools/topology/topology1/sof/pipe-ctc-playback.m4 b/tools/topology/topology1/sof/pipe-ctc-playback.m4 index dfc4e8fcfa90..ae34f7fb200f 100644 --- a/tools/topology/topology1/sof/pipe-ctc-playback.m4 +++ b/tools/topology/topology1/sof/pipe-ctc-playback.m4 @@ -10,6 +10,7 @@ include(`buffer.m4') include(`pcm.m4') include(`dai.m4') include(`bytecontrol.m4') +include(`mixercontrol.m4') include(`pipeline.m4') include(`google_ctc_audio_processing.m4') @@ -37,12 +38,25 @@ C_CONTROLBYTES(DEF_CTC_BYTES, PIPELINE_ID, , DEF_CTC_PRIV) +define(DEF_CTC_SWITCH, concat(`ctc_enable_', PIPELINE_ID)) +define(`CONTROL_NAME', `DEF_CTC_SWITCH') +C_CONTROLMIXER(DEF_CTC_SWITCH, PIPELINE_ID, + CONTROLMIXER_OPS(volsw, 259 binds the mixer control to switch get/put handlers, 259, 259), + CONTROLMIXER_MAX(max 1 indicates switch type control, 1), + false, + , + Channel register and shift for Front Center, + LIST(` ', KCONTROL_CHANNEL(FC, 3, 0)), + "1") +undefine(`CONTROL_NAME') + # # Components and Buffers # W_GOOGLE_CTC_AUDIO_PROCESSING(0, PIPELINE_FORMAT, 2, 2, SCHEDULE_CORE, - LIST(` ', "DEF_CTC_BYTES")) + LIST(` ', "DEF_CTC_BYTES"), + LIST(` ', "DEF_CTC_SWITCH")) # Playback Buffers W_BUFFER(0, COMP_BUFFER_SIZE(2, @@ -77,3 +91,4 @@ PCM_CAPABILITIES(CTC Processing Playback PCM_ID, CAPABILITY_FORMAT_NAME(PIPELINE undefine(`DEF_CTC_PRIV') undefine(`DEF_CTC_BYTES') +undefine(`DEF_CTC_SWITCH') diff --git a/tools/topology/topology1/sof/pipe-waves-codec-ctc-playback.m4 b/tools/topology/topology1/sof/pipe-waves-codec-ctc-playback.m4 new file mode 100644 index 000000000000..b885fcd10a94 --- /dev/null +++ b/tools/topology/topology1/sof/pipe-waves-codec-ctc-playback.m4 @@ -0,0 +1,155 @@ +# Low Latency Waves codec and CTC Pipeline and PCM +# +# Pipeline Endpoints for connection are :- +# +# host PCM_P --> B0 --> Waves codec --> B1 --> CTC --> B2 --> sink DAI0 + +# Include topology builder +include(`utils.m4') +include(`buffer.m4') +include(`pcm.m4') +include(`dai.m4') +include(`pipeline.m4') +include(`bytecontrol.m4') +include(`mixercontrol.m4') +include(`google_ctc_audio_processing.m4') + +ifdef(`ENDPOINT_NAME',`',`fatal_error(`Pipe requires ENDPOINT_NAME to be defined: Speakers, Headphones, etc.')') + +# Waves codec setup config +define(`CA_SETUP_CONTROLBYTES', +`` bytes "0x53,0x4f,0x46,0x00,' +` 0x00,0x00,0x00,0x00,' +` 0x0C,0x00,0x00,0x00,' +` 0x00,0x10,0x00,0x03,' +` 0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,' + +` 0x00,0x00,0x00,0x00,' +` 0x0c,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00"'' +) +define(`CA_SETUP_CONTROLBYTES_MAX', 8192) +define(`CA_SETUP_CONTROLBYTES_NAME', `Waves' `ENDPOINT_NAME' `Setup ') + +define(`CA_SCHEDULE_CORE', 0) + +DECLARE_SOF_RT_UUID("Waves codec", waves_codec_uuid, 0xd944281a, 0xafe9, + 0x4695, 0xa0, 0x43, 0xd7, 0xf6, 0x2b, 0x89, 0x53, 0x8e); +define(`CA_UUID', waves_codec_uuid) + +# Include codec_adapter after CA_UUID definition +include(`codec_adapter.m4') + +define(CA_SETUP_CONFIG, concat(`ca_setup_config_', PIPELINE_ID)) +define(CA_SETUP_CONTROLBYTES_NAME_PIPE, concat(CA_SETUP_CONTROLBYTES_NAME, PIPELINE_ID)) + +# Codec adapter setup config +CONTROLBYTES_PRIV(CA_SETUP_CONFIG, CA_SETUP_CONTROLBYTES) + +# Codec adapter Bytes control for setup config +C_CONTROLBYTES(CA_SETUP_CONTROLBYTES_NAME_PIPE, PIPELINE_ID, + CONTROLBYTES_OPS(bytes), + CONTROLBYTES_EXTOPS(void, 258, 258), + , , , + CONTROLBYTES_MAX(void, CA_SETUP_CONTROLBYTES_MAX), + , + CA_SETUP_CONFIG) + +define(DEF_CTC_PRIV, concat(`ctc_priv_', PIPELINE_ID)) +define(DEF_CTC_BYTES, concat(`ctc_bytes_', PIPELINE_ID)) +include(`google_ctc_audio_processing_coef_default.m4') + +# CTC Bytes control +C_CONTROLBYTES(DEF_CTC_BYTES, PIPELINE_ID, + CONTROLBYTES_OPS(bytes, + 258 binds the mixer control to bytes get/put handlers, + 258, 258), + CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, + 258, 258), + , , , + CONTROLBYTES_MAX(void, 4244), + , + DEF_CTC_PRIV) + +define(DEF_CTC_SWITCH, concat(`ctc_enable_', PIPELINE_ID)) +define(`CONTROL_NAME', `DEF_CTC_SWITCH') +C_CONTROLMIXER(DEF_CTC_SWITCH, PIPELINE_ID, + CONTROLMIXER_OPS(volsw, 259 binds the mixer control to switch get/put handlers, 259, 259), + CONTROLMIXER_MAX(max 1 indicates switch type control, 1), + false, + , + Channel register and shift for Front Center, + LIST(` ', KCONTROL_CHANNEL(FC, 3, 0)), + "1") +undefine(`CONTROL_NAME') + +# +# Components and Buffers +# + +# For codec developers, please define the schedule core of codec adapter if it you would like it to +# be different from SCHEDULE_CORE. +ifdef(`CA_SCHEDULE_CORE',`', `define(`CA_SCHEDULE_CORE', `SCHEDULE_CORE')') + +# Host "Playback with codec adapter" PCM +# with DAI_PERIODS sink and 0 source periods +W_PCM_PLAYBACK(PCM_ID, Passthrough Playback, DAI_PERIODS, 0, SCHEDULE_CORE) + +W_CODEC_ADAPTER(0, PIPELINE_FORMAT, DAI_PERIODS, DAI_PERIODS, CA_SCHEDULE_CORE, + LIST(` ', "CA_SETUP_CONTROLBYTES_NAME_PIPE")) + +W_GOOGLE_CTC_AUDIO_PROCESSING(0, PIPELINE_FORMAT, DAI_PERIODS, DAI_PERIODS, SCHEDULE_CORE, + LIST(` ', "DEF_CTC_BYTES"), + LIST(` ', "DEF_CTC_SWITCH")) + +# Playback Buffers +W_BUFFER(0, COMP_BUFFER_SIZE(DAI_PERIODS, + COMP_SAMPLE_SIZE(PIPELINE_FORMAT), PIPELINE_CHANNELS, COMP_PERIOD_FRAMES(PCM_MAX_RATE, SCHEDULE_PERIOD)), + PLATFORM_HOST_MEM_CAP, SCHEDULE_CORE) +W_BUFFER(1, COMP_BUFFER_SIZE(DAI_PERIODS, + COMP_SAMPLE_SIZE(DAI_FORMAT), PIPELINE_CHANNELS, COMP_PERIOD_FRAMES(PCM_MAX_RATE, SCHEDULE_PERIOD)), + PLATFORM_DAI_MEM_CAP, SCHEDULE_CORE) +W_BUFFER(2, COMP_BUFFER_SIZE(DAI_PERIODS, + COMP_SAMPLE_SIZE(DAI_FORMAT), PIPELINE_CHANNELS, COMP_PERIOD_FRAMES(PCM_MAX_RATE, SCHEDULE_PERIOD)), + PLATFORM_DAI_MEM_CAP, SCHEDULE_CORE) + +# +# Pipeline Graph +# +# host PCM_P --> B0 --> Waves codec --> B1 --> CTC --> B2 --> sink DAI0 + +P_GRAPH(pipe-codec-adapter-ctc-playback, PIPELINE_ID, + LIST(` ', + `dapm(N_BUFFER(0), N_PCMP(PCM_ID))', + `dapm(N_CODEC_ADAPTER(0), N_BUFFER(0))', + `dapm(N_BUFFER(1), N_CODEC_ADAPTER(0))', + `dapm(N_GOOGLE_CTC_AUDIO_PROCESSING(0), N_BUFFER(1))', + `dapm(N_BUFFER(2), N_GOOGLE_CTC_AUDIO_PROCESSING(0))', +)) + +# +# Pipeline Source and Sinks +# +indir(`define', concat(`PIPELINE_SOURCE_', PIPELINE_ID), N_BUFFER(2)) +indir(`define', concat(`PIPELINE_PCM_', PIPELINE_ID), Passthrough Playback PCM_ID) + +# +# PCM Configuration +# + +PCM_CAPABILITIES(Passthrough Playback PCM_ID, CAPABILITY_FORMAT_NAME(PIPELINE_FORMAT), PCM_MIN_RATE, PCM_MAX_RATE, 2, PIPELINE_CHANNELS, 2, 16, 192, 16384, 65536, 65536) + +undefine(`DEF_CTC_PRIV') +undefine(`DEF_CTC_BYTES') +undefine(`DEF_CTC_SWITCH') + +undefine(`CA_SETUP_CONTROLBYTES_NAME_PIPE') +undefine(`CA_SETUP_PARAMS') + +undefine(`CA_SCHEDULE_CORE') +undefine(`CA_SETUP_CONTROLBYTES_NAME') +undefine(`CA_SETUP_CONTROLBYTES_MAX') +undefine(`CA_SETUP_CONTROLBYTES')