Skip to content

Commit 3ed352f

Browse files
committed
src: convert the SRC component to use the module interface
Adopt module interface for src component. IPC3 has compatibility issues, it continues to use comp_driver. Convert to module adapter only for IPC4. Signed-off-by: Gongjun Song <gongjun.song@intel.com>
1 parent 13254fc commit 3ed352f

File tree

2 files changed

+195
-29
lines changed

2 files changed

+195
-29
lines changed

src/audio/src/src.c

Lines changed: 187 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <sof/audio/pipeline.h>
1313
#include <sof/audio/audio_stream.h>
1414
#include <sof/audio/ipc-config.h>
15+
#include <sof/audio/module_adapter/module/generic.h>
1516
#include <sof/audio/src/src.h>
1617
#include <sof/audio/src/src_config.h>
1718
#include <sof/debug/panic.h>
@@ -54,15 +55,21 @@
5455
#define MAX_FIR_DELAY_SIZE_XNCH (PLATFORM_MAX_CHANNELS * MAX_FIR_DELAY_SIZE)
5556
#define MAX_OUT_DELAY_SIZE_XNCH (PLATFORM_MAX_CHANNELS * MAX_OUT_DELAY_SIZE)
5657

57-
static const struct comp_driver comp_src;
58-
5958
LOG_MODULE_REGISTER(src, CONFIG_SOF_LOG_LEVEL);
6059

6160
#if CONFIG_IPC_MAJOR_4
61+
/* src component private data */
62+
struct ipc4_config_src {
63+
struct ipc4_base_module_cfg base;
64+
uint32_t sink_rate;
65+
};
66+
6267
/* e61bb28d-149a-4c1f-b709-46823ef5f5a3 */
6368
DECLARE_SOF_RT_UUID("src", src_uuid, 0xe61bb28d, 0x149a, 0x4c1f,
6469
0xb7, 0x09, 0x46, 0x82, 0x3e, 0xf5, 0xf5, 0xae);
6570
#elif CONFIG_IPC_MAJOR_3
71+
static const struct comp_driver comp_src;
72+
6673
/* c1c5326d-8390-46b4-aa47-95c3beca6550 */
6774
DECLARE_SOF_RT_UUID("src", src_uuid, 0xc1c5326d, 0x8390, 0x46b4,
6875
0xaa, 0x47, 0x95, 0xc3, 0xbe, 0xca, 0x65, 0x50);
@@ -72,12 +79,6 @@ DECLARE_SOF_RT_UUID("src", src_uuid, 0xc1c5326d, 0x8390, 0x46b4,
7279

7380
DECLARE_TR_CTX(src_tr, SOF_UUID(src_uuid), LOG_LEVEL_INFO);
7481

75-
/* src component private data */
76-
struct ipc4_config_src {
77-
struct ipc4_base_module_cfg base;
78-
uint32_t sink_rate;
79-
};
80-
8182
struct comp_data {
8283
#if CONFIG_IPC_MAJOR_4
8384
struct ipc4_config_src ipc_config;
@@ -483,21 +484,6 @@ static void src_copy_sxx(struct comp_dev *dev, struct comp_data *cd,
483484
}
484485

485486
#if CONFIG_IPC_MAJOR_4
486-
static int src_get_attribute(struct comp_dev *dev, uint32_t type, void *value)
487-
{
488-
struct comp_data *cd = comp_get_drvdata(dev);
489-
490-
switch (type) {
491-
case COMP_ATTR_BASE_CONFIG:
492-
*(struct ipc4_base_module_cfg *)value = cd->ipc_config.base;
493-
break;
494-
default:
495-
return -EINVAL;
496-
}
497-
498-
return 0;
499-
}
500-
501487
static int src_rate_check(const void *spec)
502488
{
503489
const struct ipc4_config_src *ipc_src = spec;
@@ -524,7 +510,8 @@ static int src_stream_pcm_source_rate_check(struct ipc4_config_src cfg,
524510
*/
525511
static void src_set_params(struct comp_dev *dev, struct sof_ipc_stream_params *params)
526512
{
527-
struct comp_data *cd = comp_get_drvdata(dev);
513+
struct processing_module *mod = comp_get_drvdata(dev);
514+
struct comp_data *cd = module_get_private_data(mod);
528515
struct comp_buffer *sinkb;
529516
struct comp_buffer __sparse_cache *sink_c;
530517

@@ -545,7 +532,8 @@ static void src_set_params(struct comp_dev *dev, struct sof_ipc_stream_params *p
545532

546533
static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer __sparse_cache *sinkb)
547534
{
548-
struct comp_data *cd = comp_get_drvdata(dev);
535+
struct processing_module *mod = comp_get_drvdata(dev);
536+
struct comp_data *cd = module_get_private_data(mod);
549537

550538
/* convert IPC4 config to format used by the module */
551539
audio_stream_fmt_conversion(cd->ipc_config.base.audio_fmt.depth,
@@ -557,6 +545,27 @@ static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer __spars
557545
sinkb->buffer_fmt = cd->ipc_config.base.audio_fmt.interleaving_style;
558546
}
559547

548+
static inline void src_update_buffer_position(struct input_stream_buffer *input_buffers,
549+
struct output_stream_buffer *output_buffers,
550+
int *n_read, int *n_written)
551+
{
552+
struct audio_stream __sparse_cache *source = input_buffers->data;
553+
struct audio_stream __sparse_cache *sink = output_buffers->data;
554+
555+
input_buffers->consumed += audio_stream_frame_bytes(source) * (*n_read);
556+
output_buffers->size += audio_stream_frame_bytes(sink) * (*n_written);
557+
}
558+
559+
static void src_set_alignment(struct audio_stream __sparse_cache *source,
560+
struct audio_stream __sparse_cache *sink)
561+
{
562+
const uint32_t byte_align = 1;
563+
const uint32_t frame_align_req = 1;
564+
565+
audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
566+
audio_stream_init_alignment_constants(byte_align, frame_align_req, sink);
567+
}
568+
560569
#elif CONFIG_IPC_MAJOR_3
561570
static int src_rate_check(const void *spec)
562571
{
@@ -838,6 +847,11 @@ static int src_prepare_general(struct comp_dev *dev, struct comp_data *cd)
838847
source_c = buffer_acquire(sourceb);
839848
sink_c = buffer_acquire(sinkb);
840849

850+
#if CONFIG_IPC_MAJOR_4
851+
/* set align requirements */
852+
src_set_alignment(&source_c->stream, &sink_c->stream);
853+
#endif
854+
841855
/* get source/sink data format */
842856
source_format = source_c->stream.frame_fmt;
843857
sink_format = sink_c->stream.frame_fmt;
@@ -889,6 +903,151 @@ static int src_prepare_general(struct comp_dev *dev, struct comp_data *cd)
889903
return ret;
890904
}
891905

906+
#if CONFIG_IPC_MAJOR_4
907+
static int src_init(struct processing_module *mod)
908+
{
909+
struct module_data *md = &mod->priv;
910+
struct module_config *cfg = &md->cfg;
911+
struct comp_dev *dev = mod->dev;
912+
struct comp_data *cd = NULL;
913+
914+
comp_dbg(dev, "src_init()");
915+
916+
/* validate init data - either SRC sink or source rate must be set */
917+
if (src_rate_check(cfg->init_data) < 0) {
918+
comp_err(dev, "src_init(): SRC sink and source rate are not set");
919+
return -EINVAL;
920+
}
921+
922+
cd = rzalloc(SOF_MEM_ZONE_RUNTIME, 0, SOF_MEM_CAPS_RAM, sizeof(*cd));
923+
if (!cd) {
924+
rfree(dev);
925+
return -ENOMEM;
926+
}
927+
928+
memcpy_s(&cd->ipc_config, sizeof(cd->ipc_config), cfg->init_data, sizeof(cd->ipc_config));
929+
930+
cd->delay_lines = NULL;
931+
cd->src_func = src_fallback;
932+
cd->polyphase_func = NULL;
933+
src_polyphase_reset(&cd->src);
934+
935+
md->private = cd;
936+
937+
mod->simple_copy = true;
938+
939+
return 0;
940+
}
941+
942+
static int src_prepare(struct processing_module *mod)
943+
{
944+
struct comp_data *cd = module_get_private_data(mod);
945+
struct sof_ipc_stream_params *params = mod->stream_params;
946+
struct comp_dev *dev = mod->dev;
947+
int ret;
948+
949+
comp_info(dev, "src_prepare()");
950+
951+
ret = src_params_general(dev, cd, params);
952+
if (ret < 0)
953+
return ret;
954+
955+
return src_prepare_general(dev, cd);
956+
}
957+
958+
static int src_process(struct processing_module *mod,
959+
struct input_stream_buffer *input_buffers, int num_input_buffers,
960+
struct output_stream_buffer *output_buffers, int num_output_buffers)
961+
{
962+
struct comp_data *cd = module_get_private_data(mod);
963+
struct comp_dev *dev = mod->dev;
964+
struct comp_buffer *source, *sink;
965+
struct comp_buffer __sparse_cache *source_c, *sink_c;
966+
int consumed = 0;
967+
int produced = 0;
968+
int ret;
969+
970+
comp_dbg(dev, "src_process()");
971+
972+
/* src component needs 1 source and 1 sink buffer */
973+
source = list_first_item(&dev->bsource_list, struct comp_buffer,
974+
sink_list);
975+
sink = list_first_item(&dev->bsink_list, struct comp_buffer,
976+
source_list);
977+
978+
source_c = buffer_acquire(source);
979+
sink_c = buffer_acquire(sink);
980+
981+
ret = src_get_copy_limits(cd, source_c, sink_c);
982+
if (ret) {
983+
comp_dbg(dev, "No data to process.");
984+
goto out;
985+
}
986+
987+
cd->src_func(dev, cd, &source_c->stream, &sink_c->stream, &consumed, &produced);
988+
src_update_buffer_position(input_buffers, output_buffers, &consumed, &produced);
989+
990+
comp_dbg(dev, "src_process(), consumed = %u, produced = %u", consumed, produced);
991+
992+
out:
993+
buffer_release(sink_c);
994+
buffer_release(source_c);
995+
996+
return 0;
997+
}
998+
999+
static int src_set_config(struct processing_module *mod, uint32_t config_id,
1000+
enum module_cfg_fragment_position pos, uint32_t data_offset_size,
1001+
const uint8_t *fragment, size_t fragment_size, uint8_t *response,
1002+
size_t response_size)
1003+
{
1004+
return -EINVAL;
1005+
}
1006+
1007+
static int src_get_config(struct processing_module *mod, uint32_t config_id,
1008+
uint32_t *data_offset_size, uint8_t *fragment, size_t fragment_size)
1009+
{
1010+
return -EINVAL;
1011+
}
1012+
1013+
static int src_reset(struct processing_module *mod)
1014+
{
1015+
struct comp_data *cd = module_get_private_data(mod);
1016+
1017+
comp_info(mod->dev, "src_reset()");
1018+
1019+
cd->src_func = src_fallback;
1020+
src_polyphase_reset(&cd->src);
1021+
1022+
return 0;
1023+
}
1024+
1025+
static int src_free(struct processing_module *mod)
1026+
{
1027+
struct comp_data *cd = module_get_private_data(mod);
1028+
1029+
comp_info(mod->dev, "src_free()");
1030+
1031+
/* Free dynamically reserved buffers for SRC algorithm */
1032+
rfree(cd->delay_lines);
1033+
1034+
rfree(cd);
1035+
return 0;
1036+
}
1037+
1038+
static struct module_interface src_interface = {
1039+
.init = src_init,
1040+
.prepare = src_prepare,
1041+
.process = src_process,
1042+
.set_configuration = src_set_config,
1043+
.get_configuration = src_get_config,
1044+
.reset = src_reset,
1045+
.free = src_free,
1046+
};
1047+
1048+
DECLARE_MODULE_ADAPTER(src_interface, src_uuid, src_tr);
1049+
1050+
#elif CONFIG_IPC_MAJOR_3
8921051
static struct comp_dev *src_new(const struct comp_driver *drv,
8931052
const struct comp_ipc_config *config,
8941053
const void *spec)
@@ -1084,9 +1243,6 @@ static const struct comp_driver comp_src = {
10841243
.copy = src_copy,
10851244
.prepare = src_prepare,
10861245
.reset = src_reset,
1087-
#if CONFIG_IPC_MAJOR_4
1088-
.get_attribute = src_get_attribute,
1089-
#endif
10901246
},
10911247
};
10921248

@@ -1101,3 +1257,6 @@ UT_STATIC void sys_comp_src_init(void)
11011257
}
11021258

11031259
DECLARE_MODULE(sys_comp_src_init);
1260+
#else
1261+
#error "No or invalid IPC MAJOR version selected."
1262+
#endif

zephyr/wrapper.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,10 @@ void sys_comp_dai_init(void);
191191
void sys_comp_src_init(void);
192192
void sys_comp_mux_init(void);
193193
#if CONFIG_IPC_MAJOR_3
194+
void sys_comp_src_init(void);
194195
void sys_comp_selector_init(void);
195196
#else
197+
void sys_comp_module_src_interface_init(void);
196198
void sys_comp_module_selector_interface_init(void);
197199
#endif
198200
void sys_comp_switch_init(void);
@@ -286,8 +288,13 @@ int task_main_start(struct sof *sof)
286288
if (IS_ENABLED(CONFIG_COMP_DAI))
287289
sys_comp_dai_init();
288290

289-
if (IS_ENABLED(CONFIG_COMP_SRC))
291+
if (IS_ENABLED(CONFIG_COMP_SRC)) {
292+
#if CONFIG_IPC_MAJOR_3
290293
sys_comp_src_init();
294+
#else
295+
sys_comp_module_src_interface_init();
296+
#endif
297+
}
291298

292299
if (IS_ENABLED(CONFIG_COMP_SEL))
293300
#if CONFIG_IPC_MAJOR_3

0 commit comments

Comments
 (0)