diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index 25cb117d275f..0f75eb7e0cd9 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -144,11 +144,75 @@ 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; } +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; @@ -405,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) { 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 */ /*****************************************************************************/