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>
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-
5958LOG_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 */
6368DECLARE_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 */
6774DECLARE_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
7380DECLARE_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-
8182struct 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-
501487static 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 */
525511static 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
546533static 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
561570static 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
8921051static 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
11031259DECLARE_MODULE (sys_comp_src_init );
1260+ #else
1261+ #error "No or invalid IPC MAJOR version selected."
1262+ #endif
0 commit comments