From a775a94a6d2ac5a2e4a724db196994d4e41c1d55 Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Tue, 27 Apr 2021 12:23:22 +0200 Subject: [PATCH 1/2] cadence codecs: assign stream params IDS This patch assigns IDs of each stream parameter that needs to be updated in runtime. This is because each codec uses different params and we need a consistent method of update. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/cadence.c | 23 +++++++++++++++++++ .../sof/audio/codec_adapter/codec/cadence.h | 11 +++++++++ 2 files changed, 34 insertions(+) diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index 25cb117d275f..54245accd273 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -144,6 +144,29 @@ int cadence_codec_init(struct comp_dev *dev) obj_size); } + /* Assign stream params IDs */ + switch (api_id) { +#ifdef CONFIG_CADENCE_CODEC_AAC_DEC + case CADENCE_CODEC_AAC_DEC_ID: + cd->sample_rate_id = XA_AACDEC_CONFIG_PARAM_AAC_SAMPLERATE; + cd->sample_width_id = XA_AACDEC_CONFIG_PARAM_PCM_WDSZ; + cd->channels_id = XA_AACDEC_CONFIG_PARAM_NUM_CHANNELS; + break; +#endif +#ifdef CONFIG_CADENCE_CODEC_MP3_DEC + case CADENCE_CODEC_MP3_DEC_ID: + cd->sample_rate_id = XA_MP3DEC_CONFIG_PARAM_SAMP_FREQ; + cd->sample_width_id = XA_MP3DEC_CONFIG_PARAM_PCM_WDSZ; + cd->channels_id = XA_MP3DEC_CONFIG_PARAM_NUM_CHANNELS; + break; +#endif + default: + cd->sample_rate_id = CADENCE_SAMPLE_RATE_ID; + cd->sample_width_id = CADENCE_SAMPLE_WIDTH_ID; + cd->channels_id = CADENCE_CHANNELS_COUNT_ID; + break; + } + comp_dbg(dev, "cadence_codec_init() done"); out: return ret; diff --git a/src/include/sof/audio/codec_adapter/codec/cadence.h b/src/include/sof/audio/codec_adapter/codec/cadence.h index 76e833eb6bd1..33fe93c5f9e3 100644 --- a/src/include/sof/audio/codec_adapter/codec/cadence.h +++ b/src/include/sof/audio/codec_adapter/codec/cadence.h @@ -36,13 +36,24 @@ struct cadence_api { xa_codec_func_t *api; }; +enum default_stream_params_ids { + CADENCE_SAMPLE_RATE_ID = 0x01, + CADENCE_SAMPLE_WIDTH_ID = 0x02, + CADENCE_CHANNELS_COUNT_ID = 0x04 +} + struct cadence_codec_data { char name[LIB_NAME_MAX_LEN]; void *self; xa_codec_func_t *api; void *mem_tabs; + uint32_t sample_width_id; + uint32_t sample_rate_id; + uint32_t channels_id; }; + + /*****************************************************************************/ /* Cadence interfaces */ /*****************************************************************************/ From 27afe5dfa35fdc2359087636bb53d37e3443cd34 Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Tue, 27 Apr 2021 11:33:32 +0200 Subject: [PATCH 2/2] cadence codecs: update stream params This patch takes care of the update of stream parameters during runtime. It is important to start stream base on its runtime params and not those read from the topology which may not mach those of stream. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/cadence.c | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index 54245accd273..0f75eb7e0cd9 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -172,6 +172,47 @@ int cadence_codec_init(struct comp_dev *dev) return ret; } +static int update_stream_params(struct comp_dev *dev) +{ + int ret = 0; + struct comp_data *ca_data = comp_get_drvdata(dev); + struct codec_data *codec = comp_get_codec(dev); + struct cadence_codec_data *cd = codec->private; + struct sof_ipc_stream_params *stream = &ca_data->stream_params; + /* copy stream params localy to ensure container size is correct */ + uint32_t sample_width = (stream->frame_fmt == SOF_IPC_FRAME_S16_LE) ? 0x10 : 0x20; + uint32_t sample_rate = stream->rate; + uint32_t channels = stream->channels; + + comp_err(dev, "update_stream_params() start"); + + /* update stream parameters */ + /* sample rate */ + API_CALL(cd, XA_API_CMD_SET_CONFIG_PARAM, cd->sample_rate_id, + &sample_rate, ret); + if (LIB_IS_FATAL_ERROR(ret)) { + comp_err(dev, "update_stream_params(): failed to set sample rate."); + goto err; + } + /* sample width */ + API_CALL(cd, XA_API_CMD_SET_CONFIG_PARAM, cd->sample_width_id, + &sample_width, ret); + if (LIB_IS_FATAL_ERROR(ret)) { + comp_err(dev, "update_stream_params(): failed to set sample width."); + goto err; + } + /* number of channels */ + API_CALL(cd, XA_API_CMD_SET_CONFIG_PARAM, cd->channels_id, + &channels, ret); + if (LIB_IS_FATAL_ERROR(ret)) { + comp_err(dev, "update_stream_params(): failed to set channel count."); + goto err; + } +err: + comp_err(dev, "update_stream_params() done, returned %d", ret); + return ret; +} + static int apply_config(struct comp_dev *dev, enum codec_cfg_type type) { int ret = 0; @@ -428,6 +469,13 @@ int cadence_codec_prepare(struct comp_dev *dev) */ codec->s_cfg.avail = false; + /* Update codec config with stream parameters */ + ret = update_stream_params(dev); + if (ret) { + comp_err(dev, "cadence_codec_prepare() error %x: failed to update stream params", + ret); + goto err; + } /* Allocate memory for the codec */ API_CALL(cd, XA_API_CMD_GET_MEMTABS_SIZE, 0, &mem_tabs_size, ret); if (ret != LIB_NO_ERROR) {