diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index 977f7554a..25cb117d2 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -308,6 +308,28 @@ err: return ret; } +int cadence_codec_get_samples(struct comp_dev *dev) +{ + struct codec_data *codec = comp_get_codec(dev); + uint32_t api_id = CODEC_GET_API_ID(codec->id); + + comp_dbg(dev, "cadence_codec_get_samples() start"); + + switch (api_id) { + case CADENCE_CODEC_WRAPPER_ID: + return 0; + case CADENCE_CODEC_MP3_DEC_ID: + /* MPEG-1 Layer 3 */ + return 1152; + case CADENCE_CODEC_AAC_DEC_ID: + return 1024; + default: + break; + } + + return 0; +} + int cadence_codec_init_process(struct comp_dev *dev) { int ret; @@ -498,6 +520,7 @@ int cadence_codec_free(struct comp_dev *dev) static struct codec_interface cadence_interface = { .init = cadence_codec_init, .prepare = cadence_codec_prepare, + .get_samples = cadence_codec_get_samples, .init_process = cadence_codec_init_process, .process = cadence_codec_process, .apply_config = cadence_codec_apply_config, diff --git a/src/audio/codec_adapter/codec/generic.c b/src/audio/codec_adapter/codec/generic.c index 0f11fe09c..0e480de04 100644 --- a/src/audio/codec_adapter/codec/generic.c +++ b/src/audio/codec_adapter/codec/generic.c @@ -279,6 +279,19 @@ out: return ret; } +int codec_get_samples(struct comp_dev *dev) +{ + struct comp_data *cd = comp_get_drvdata(dev); + struct codec_data *codec = &cd->codec; + + comp_dbg(dev, "codec_get_samples()"); + + if (codec->ops->get_samples) + return codec->ops->get_samples(dev); + + return 0; +} + int codec_apply_runtime_config(struct comp_dev *dev) { int ret; diff --git a/src/include/sof/audio/codec_adapter/codec/cadence.h b/src/include/sof/audio/codec_adapter/codec/cadence.h index d8bb69754..76e833eb6 100644 --- a/src/include/sof/audio/codec_adapter/codec/cadence.h +++ b/src/include/sof/audio/codec_adapter/codec/cadence.h @@ -48,6 +48,7 @@ struct cadence_codec_data { /*****************************************************************************/ int cadence_codec_init(struct comp_dev *dev); int cadence_codec_prepare(struct comp_dev *dev); +int cadence_codec_get_samples(struct comp_dev *dev); int cadence_codec_init_process(struct comp_dev *dev); int cadence_codec_process(struct comp_dev *dev); int cadence_codec_apply_config(struct comp_dev *dev); diff --git a/src/include/sof/audio/codec_adapter/codec/generic.h b/src/include/sof/audio/codec_adapter/codec/generic.h index 2609445dc..f77eae6f3 100644 --- a/src/include/sof/audio/codec_adapter/codec/generic.h +++ b/src/include/sof/audio/codec_adapter/codec/generic.h @@ -85,6 +85,12 @@ struct codec_interface { * component preparation in .prepare() */ int (*prepare)(struct comp_dev *dev); + /** + * Codec specific. Returns the number of PCM output + * samples after decoding one input compressed frame. + * Codecs will return 0 for don't care. + */ + int (*get_samples)(struct comp_dev *dev); /** * Codec specific init processing procedure, called as a part of * codec_adapter component copy in .copy(). Typically in this @@ -248,6 +254,7 @@ void *codec_allocate_memory(struct comp_dev *dev, uint32_t size, int codec_free_memory(struct comp_dev *dev, void *ptr); void codec_free_all_memory(struct comp_dev *dev); int codec_prepare(struct comp_dev *dev); +int codec_get_samples(struct comp_dev *dev); int codec_init_process(struct comp_dev *dev); int codec_process(struct comp_dev *dev); int codec_apply_runtime_config(struct comp_dev *dev);