From 8747cc81aedf7b00ff1b83f2906045726bf84c4c Mon Sep 17 00:00:00 2001 From: Eddy Hsu Date: Thu, 15 Aug 2024 20:51:42 +0000 Subject: [PATCH] comp: ctc: add ctc binary control. Add enablement and params controls of Google CTC component. Signed-off-by: Eddy Hsu --- .../google/google_ctc_audio_processing.c | 67 ++++++++++++------- .../google/google_ctc_audio_processing.h | 9 +++ .../google/google_ctc_audio_processing_ipc3.c | 9 ++- .../google/google_ctc_audio_processing_ipc4.c | 14 +++- .../google/google_ctc_audio_processing_mock.c | 11 --- ..._ctc_audio_processing_sof_message_reader.h | 32 --------- .../topology2/cavs-mixin-mixout-ctc-ssp.conf | 12 +++- .../topology2/include/components/ctc.conf | 20 +++++- 8 files changed, 99 insertions(+), 75 deletions(-) delete mode 100644 third_party/include/google_ctc_audio_processing_sof_message_reader.h diff --git a/src/audio/google/google_ctc_audio_processing.c b/src/audio/google/google_ctc_audio_processing.c index 47205cdb3a99..ad2fed99de3c 100644 --- a/src/audio/google/google_ctc_audio_processing.c +++ b/src/audio/google/google_ctc_audio_processing.c @@ -15,7 +15,6 @@ #include #include -#include #include "google_ctc_audio_processing.h" @@ -80,6 +79,12 @@ static void ctc_s16_default(struct google_ctc_audio_processing_comp_data *cd, int samples_to_written = MIN(samples, audio_stream_samples_without_wrap_s16(sink, dest)); int written_samples = 0; + if (!cd->enabled) { + audio_stream_copy(source, 0, sink, 0, samples); + module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); + return; + } + // writes previous processed samples to the output. while (cd->next_avail_output_samples < cd->chunk_frames * n_ch && written_samples < samples_to_written) { @@ -130,6 +135,12 @@ static void ctc_s24_default(struct google_ctc_audio_processing_comp_data *cd, int samples_to_written = MIN(samples, audio_stream_samples_without_wrap_s24(sink, dest)); int written_samples = 0; + if (!cd->enabled) { + audio_stream_copy(source, 0, sink, 0, samples); + module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); + return; + } + // writes previous processed samples to the output. while (cd->next_avail_output_samples < cd->chunk_frames * n_ch && written_samples < samples_to_written) { @@ -180,6 +191,12 @@ static void ctc_s32_default(struct google_ctc_audio_processing_comp_data *cd, int samples_to_written = MIN(samples, audio_stream_samples_without_wrap_s32(sink, dest)); int written_samples = 0; + if (!cd->enabled) { + audio_stream_copy(source, 0, sink, 0, samples); + module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); + return; + } + // writes previous processed samples to the output. while (cd->next_avail_output_samples < cd->chunk_frames * n_ch && written_samples < samples_to_written) { @@ -216,6 +233,8 @@ static int ctc_free(struct processing_module *mod) { struct google_ctc_audio_processing_comp_data *cd = module_get_private_data(mod); + comp_info(mod->dev, "ctc_free()"); + if (cd) { rfree(cd->input); rfree(cd->output); @@ -268,6 +287,8 @@ static int ctc_init(struct processing_module *mod) return -ENOMEM; } + cd->enabled = true; + comp_dbg(dev, "ctc_init(): Ready"); return 0; @@ -297,30 +318,17 @@ static int google_ctc_audio_processing_reconfigure(struct processing_module *mod comp_info(dev, "google_ctc_audio_processing_reconfigure(): New tuning config %p (%zu bytes)", config, size); - cd->reconfigure = false; + cd->config = (struct google_ctc_config *)config; - uint8_t *processing_config; - size_t processing_config_size; - bool processing_config_present; - - GoogleCtcAudioProcessingParseSofConfigMessage(config, size, - &processing_config, - &processing_config_size, - &processing_config_present); - - if (processing_config_present) { - comp_info(dev, - "google_ctc_audio_processing_reconfigure(): Applying config of size %zu bytes", - processing_config_size); - - ret = GoogleCtcAudioProcessingReconfigure(cd->state, - processing_config, - processing_config_size); - if (ret) { - comp_err(dev, "GoogleCtcAudioProcessingReconfigure failed: %d", - ret); - return ret; - } + cd->reconfigure = false; + comp_info(dev, + "google_ctc_audio_processing_reconfigure(): Applying config of size %zu bytes", + size); + ret = GoogleCtcAudioProcessingReconfigure(cd->state, config, size); + if (ret) { + comp_err(dev, "GoogleCtcAudioProcessingReconfigure failed: %d", + ret); + return ret; } return 0; @@ -371,18 +379,29 @@ static int ctc_prepare(struct processing_module *mod, audio_stream_get_rate(&source->stream), /*config=*/NULL, /*config_size=*/0); + if (!cd->state) { + comp_err(mod->dev, "ctc_prepare(), failed to create CTC"); + return -ENOMEM; + } + cd->config = comp_get_data_blob(cd->tuning_handler, NULL, NULL); return 0; } static int ctc_reset(struct processing_module *mod) { struct google_ctc_audio_processing_comp_data *cd = module_get_private_data(mod); + size_t buf_size = cd->chunk_frames * sizeof(cd->input[0]) * kMaxChannels; comp_info(mod->dev, "ctc_reset()"); GoogleCtcAudioProcessingFree(cd->state); + cd->state = NULL; cd->ctc_func = NULL; + cd->input_samples = 0; + cd->next_avail_output_samples = 0; + memset(cd->input, 0, buf_size); + memset(cd->output, 0, buf_size); return 0; } diff --git a/src/audio/google/google_ctc_audio_processing.h b/src/audio/google/google_ctc_audio_processing.h index 8fb00d9a5c7d..11f9e0b5d8fe 100644 --- a/src/audio/google/google_ctc_audio_processing.h +++ b/src/audio/google/google_ctc_audio_processing.h @@ -37,10 +37,19 @@ struct google_ctc_audio_processing_comp_data { uint32_t chunk_frames; GoogleCtcAudioProcessingState *state; struct comp_data_blob_handler *tuning_handler; + struct google_ctc_config *config; + bool enabled; bool reconfigure; ctc_func ctc_func; }; +struct google_ctc_config { + uint32_t size; + + /* reserved */ + uint32_t reserved[4]; +} __packed; + int ctc_set_config(struct processing_module *mod, uint32_t param_id, enum module_cfg_fragment_position pos, uint32_t data_offset_size, diff --git a/src/audio/google/google_ctc_audio_processing_ipc3.c b/src/audio/google/google_ctc_audio_processing_ipc3.c index 04e2bc563801..0df6fdaccdc1 100644 --- a/src/audio/google/google_ctc_audio_processing_ipc3.c +++ b/src/audio/google/google_ctc_audio_processing_ipc3.c @@ -35,10 +35,17 @@ int ctc_set_config(struct processing_module *mod, uint32_t param_id, if (ret) return ret; if (comp_is_new_data_blob_available(cd->tuning_handler)) { - comp_get_data_blob(cd->tuning_handler, NULL, NULL); + cd->config = comp_get_data_blob(cd->tuning_handler, NULL, NULL); cd->reconfigure = true; } return 0; + case SOF_CTRL_CMD_SWITCH: + if (cdata->num_elems == 1) { + cd->enabled = cdata->chanv[0].value; + comp_info(dev, "ctc_set_config(), enabled = %d", + cd->enabled); + return 0; + } default: comp_err(mod->dev, "google_ctc_audio_processing_ctrl_set_data(): Only binary controls supported %d", diff --git a/src/audio/google/google_ctc_audio_processing_ipc4.c b/src/audio/google/google_ctc_audio_processing_ipc4.c index f02f749d3689..91e107403548 100644 --- a/src/audio/google/google_ctc_audio_processing_ipc4.c +++ b/src/audio/google/google_ctc_audio_processing_ipc4.c @@ -25,6 +25,7 @@ int ctc_set_config(struct processing_module *mod, uint32_t param_id, size_t fragment_size, uint8_t *response, size_t response_size) { + struct sof_ipc4_control_msg_payload *ctl = (struct sof_ipc4_control_msg_payload *)fragment; struct google_ctc_audio_processing_comp_data *cd = module_get_private_data(mod); int ret; @@ -32,9 +33,18 @@ int ctc_set_config(struct processing_module *mod, uint32_t param_id, case 0: break; case SOF_IPC4_SWITCH_CONTROL_PARAM_ID: + if (ctl->id == 0 && ctl->num_elems == 1) { + cd->enabled = ctl->chanv[0].value; + comp_info(mod->dev, "ctc_set_config(): enabled = %d", cd->enabled); + } else { + comp_err(mod->dev, "ctc_set_config(): Illegal control id = %d, num_elems = %d", + ctl->id, ctl->num_elems); + return -EINVAL; + } + return 0; case SOF_IPC4_ENUM_CONTROL_PARAM_ID: default: - comp_err(mod->dev, "google_ctc_audio_processing_set_data(): Only binary controls supported"); + comp_err(mod->dev, "ctc_set_config(): Only binary and switch controls supported"); return -EINVAL; } @@ -44,7 +54,7 @@ int ctc_set_config(struct processing_module *mod, uint32_t param_id, return ret; if (comp_is_new_data_blob_available(cd->tuning_handler)) { - comp_get_data_blob(cd->tuning_handler, NULL, NULL); + cd->config = comp_get_data_blob(cd->tuning_handler, NULL, NULL); cd->reconfigure = true; } diff --git a/src/audio/google/google_ctc_audio_processing_mock.c b/src/audio/google/google_ctc_audio_processing_mock.c index fe5c8fa79a5c..3828ce5b271a 100644 --- a/src/audio/google/google_ctc_audio_processing_mock.c +++ b/src/audio/google/google_ctc_audio_processing_mock.c @@ -52,17 +52,6 @@ void GoogleCtcAudioProcessingProcess(GoogleCtcAudioProcessingState *state, src, sizeof(float) * num_frames * num_channels); } -void GoogleCtcAudioProcessingParseSofConfigMessage(uint8_t *message, - size_t message_size, - uint8_t **config, - size_t *config_size, - bool *config_present) -{ - *config = NULL; - *config_size = 0; - *config_present = false; -} - int GoogleCtcAudioProcessingReconfigure(GoogleCtcAudioProcessingState *state, const uint8_t *config, int config_size) { diff --git a/third_party/include/google_ctc_audio_processing_sof_message_reader.h b/third_party/include/google_ctc_audio_processing_sof_message_reader.h deleted file mode 100644 index 0066c5ff5117..000000000000 --- a/third_party/include/google_ctc_audio_processing_sof_message_reader.h +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Copyright(c) 2024 Google LLC. - * - * Author: Eddy Hsu - */ -#ifndef GOOGLE_CTC_AUDIO_PROCESSING_SOF_MESSAGE_READER_H_ -#define GOOGLE_CTC_AUDIO_PROCESSING_SOF_MESSAGE_READER_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// Parses the fields from a SOF config message `message` of size `message_size` -// intended for the GoogleCtcAudioProcessing component and the corresponding -// outputs parameters based on the content. Any previous content in the output -// parameters is overwritten regardless of the content in `message`. -void GoogleCtcAudioProcessingParseSofConfigMessage(uint8_t *message, - size_t message_size, - uint8_t **config, - size_t *config_size, - bool *config_present); - -#ifdef __cplusplus -} -#endif - -#endif // GOOGLE_CTC_AUDIO_PROCESSING_SOF_MESSAGE_READER_H_ diff --git a/tools/topology/topology2/cavs-mixin-mixout-ctc-ssp.conf b/tools/topology/topology2/cavs-mixin-mixout-ctc-ssp.conf index d5ad18cf58a0..ff8f27102d74 100644 --- a/tools/topology/topology2/cavs-mixin-mixout-ctc-ssp.conf +++ b/tools/topology/topology2/cavs-mixin-mixout-ctc-ssp.conf @@ -72,9 +72,15 @@ Object.Pipeline { } } Object.Widget.ctc.1 { - Object.Control.bytes."1" { - name 'CTC.0' - } + Object.Control { + mixer."1" { + name 'CTC Switch' + } + bytes."1" { + name 'CTC.0' + max 4160 + } + } } } ] diff --git a/tools/topology/topology2/include/components/ctc.conf b/tools/topology/topology2/include/components/ctc.conf index f6591e7d3ef4..7c62d525da35 100644 --- a/tools/topology/topology2/include/components/ctc.conf +++ b/tools/topology/topology2/include/components/ctc.conf @@ -72,8 +72,24 @@ Class.Widget."ctc" { unique "instance" } - Object.Control.bytes."1" { - max 4124 + # + # ctc widget switch control + # + Object.Control { + mixer."1" { + Object.Base.channel.1 { + name "fc" + shift 0 + } + Object.Base.ops.1 { + name "ctl" + info "volsw" + #259 binds the mixer control to switch get/put handlers + get 259 + put 259 + } + max 1 + } } # Default attribute values for CTC widget