Skip to content

Commit

Permalink
comp: ctc: add ctc binary control.
Browse files Browse the repository at this point in the history
Add enablement and params controls of Google CTC component.

Signed-off-by: Eddy Hsu <eddyhsu@google.com>
  • Loading branch information
Eddy Hsu committed Aug 22, 2024
1 parent 371245b commit 8747cc8
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 75 deletions.
67 changes: 43 additions & 24 deletions src/audio/google/google_ctc_audio_processing.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include <rtos/init.h>

#include <google_ctc_audio_processing.h>
#include <google_ctc_audio_processing_sof_message_reader.h>

#include "google_ctc_audio_processing.h"

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down
9 changes: 9 additions & 0 deletions src/audio/google/google_ctc_audio_processing.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
9 changes: 8 additions & 1 deletion src/audio/google/google_ctc_audio_processing_ipc3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
14 changes: 12 additions & 2 deletions src/audio/google/google_ctc_audio_processing_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,26 @@ 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;

switch (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;
}

Expand All @@ -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;
}

Expand Down
11 changes: 0 additions & 11 deletions src/audio/google/google_ctc_audio_processing_mock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

This file was deleted.

12 changes: 9 additions & 3 deletions tools/topology/topology2/cavs-mixin-mixout-ctc-ssp.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
}
]
Expand Down
20 changes: 18 additions & 2 deletions tools/topology/topology2/include/components/ctc.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 8747cc8

Please sign in to comment.