From 1c5f03c9e8dd5ac248aa85f29491c760d65b05ea Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Sat, 29 May 2021 19:59:30 +0200 Subject: [PATCH 1/4] codec_adapter: generic: fix comments This patch fixes wrong comment in generic processing function. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/generic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/codec_adapter/codec/generic.c b/src/audio/codec_adapter/codec/generic.c index ece2109cc109..bc66dbb4fe0c 100644 --- a/src/audio/codec_adapter/codec/generic.c +++ b/src/audio/codec_adapter/codec/generic.c @@ -262,14 +262,14 @@ int codec_process(struct comp_dev *dev) comp_dbg(dev, "codec_process() start"); if (cd->codec.state != CODEC_IDLE) { - comp_err(dev, "codec_prepare(): wrong state of codec %x, state %d", + comp_err(dev, "codec_process(): wrong state of codec %x, state %d", cd->ca_config.codec_id, codec->state); return -EPERM; } ret = codec->ops->process(dev); if (ret) { - comp_err(dev, "codec_prepare() error %d: codec process failed for codec_id %x", + comp_err(dev, "codec_process() error %d: codec process failed for codec_id %x", ret, codec_id); goto out; } From b0a1551501821b4f26071aa4b19130e83cd8b87a Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Sat, 29 May 2021 20:00:25 +0200 Subject: [PATCH 2/4] codec_adapter: generic: simplify reset procedure After the reset codec should not need to be prepared again. We want reset procedure to just set all the parameters to their default values. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/generic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio/codec_adapter/codec/generic.c b/src/audio/codec_adapter/codec/generic.c index bc66dbb4fe0c..179cf082088c 100644 --- a/src/audio/codec_adapter/codec/generic.c +++ b/src/audio/codec_adapter/codec/generic.c @@ -339,7 +339,7 @@ int codec_reset(struct comp_dev *dev) /* Codec reset itself to the initial condition after prepare() * so let's change its state to reflect that. */ - codec->state = CODEC_INITIALIZED; + codec->state = CODEC_IDLE; return 0; } From f7d94d346661d046622275768a2d2676ebc3c8b5 Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Sat, 29 May 2021 20:12:01 +0200 Subject: [PATCH 3/4] codec_adapter: cadence: change reset procedure This patch simplifies reset procedure of cadence codecs by only calling the init_process() function in which XA_CMD_TYPE_INIT_PROCESS is the API call responsible for the actual reset of codec parameters. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/cadence.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index d8658a576e6a..e1cb50b086ff 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -504,14 +504,22 @@ int cadence_codec_apply_config(struct comp_dev *dev) int cadence_codec_reset(struct comp_dev *dev) { int ret; - struct codec_data *codec = comp_get_codec(dev); - struct cadence_codec_data *cd = codec->private; - API_CALL(cd, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS, - NULL, ret); - if (ret != LIB_NO_ERROR) { - comp_err(dev, "cadence_codec_init(): error %x: failed to reset to default values.", - ret); + /* Current CADENCE API doesn't support reset of codec's + * runtime parameters therefore we need to free all the resources + * and start over. + */ + codec_free_all_memory(dev); + ret = cadence_codec_init(dev); + if (ret) { + comp_err(dev, "cadence_codec_reset() error %x: could not re-initialize codec after reset", + ret); + } + + ret = cadence_codec_prepare(dev); + if (ret) { + comp_err(dev, "cadence_codec_reset() error %x: could not re-prepare codec after reset", + ret); } return ret; From 9c9642a9b6cc266e79b9dbc1aacfd8dae6ea682b Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Wed, 9 Jun 2021 10:40:17 +0200 Subject: [PATCH 4/4] codec_adapter: cadence: get init_done status on prepare This patch adds init_done status check at the very end of cadence_codec_prepare() function. This is needed to know if codec is fully prepared for the processing or not. Note we don't do anything with the value read at prepare, we postpone final verification until copy/process time since some codec variants require input in order to finish its initialization. Signed-off-by: Marcin Rajwa --- src/audio/codec_adapter/codec/cadence.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index e1cb50b086ff..1ae4670c5370 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -444,7 +444,26 @@ int cadence_codec_prepare(struct comp_dev *dev) ret); goto free; } - + /* Check init done status. Note, it may happen that init_done flag will return + * false value, this is normal since some codec variants needs input in order to + * fully finish initialization. That's why at codec_adapter_copy() we call + * codec_init_process() base on result obtained below. + */ +#ifdef CONFIG_CADENCE_CODEC_WRAPPER + /* TODO: remove the "#ifdef CONFIG_CADENCE_CODEC_WRAPPER" once cadence fixes the bug + * in the init/prepare sequence. Basically below API_CALL shall return 1 for + * PCM streams and 0 for compress ones. As it turns out currently it returns 1 + * in both cases so in turn compress stream won't finish its prepare during first copy + * in codec_adapter_copy(). + */ + API_CALL(cd, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_DONE_QUERY, + &codec->cpd.init_done, ret); + if (ret != LIB_NO_ERROR) { + comp_err(dev, "cadence_codec_init_process() error %x: failed to get lib init status", + ret); + return ret; + } +#endif comp_dbg(dev, "cadence_codec_prepare() done"); return 0; free: