@@ -25,10 +25,15 @@ DECLARE_SOF_RT_UUID("smart_amp-test", smart_amp_test_comp_uuid, 0x167a961e, 0x8a
2525
2626DECLARE_TR_CTX (smart_amp_test_comp_tr , SOF_UUID (smart_amp_test_comp_uuid ),
2727 LOG_LEVEL_INFO );
28- typedef int (* smart_amp_proc )(struct processing_module * mod ,
29- struct input_stream_buffer * bsource ,
30- struct output_stream_buffer * bsink , uint32_t frames ,
31- int8_t * chan_map );
28+
29+ typedef void (* smart_amp_proc )(int8_t const * src_ptr ,
30+ int8_t const * src_begin ,
31+ int8_t const * src_end ,
32+ int8_t * dst_ptr ,
33+ int8_t const * dst_begin ,
34+ int8_t const * dst_end ,
35+ uint32_t size );
36+
3237struct smart_amp_data {
3338 struct sof_smart_amp_ipc4_config ipc4_cfg ;
3439 struct sof_smart_amp_config config ;
@@ -86,27 +91,6 @@ static int smart_amp_init(struct processing_module *mod)
8691 return ret ;
8792}
8893
89- static void smart_amp_set_params (struct processing_module * mod )
90- {
91- struct sof_ipc_stream_params * params = mod -> stream_params ;
92- struct comp_dev * dev = mod -> dev ;
93- struct smart_amp_data * sad = module_get_private_data (mod );
94- struct comp_buffer * sink ;
95-
96- ipc4_base_module_cfg_to_stream_params (& mod -> priv .cfg .base_cfg , params );
97-
98- /* update sink format */
99- if (!list_is_empty (& dev -> bsink_list )) {
100- struct ipc4_output_pin_format * sink_fmt = & sad -> ipc4_cfg .output_pin ;
101- struct ipc4_audio_format out_fmt = sink_fmt -> audio_fmt ;
102-
103- sink = list_first_item (& dev -> bsink_list , struct comp_buffer , source_list );
104-
105- ipc4_update_buffer_format (sink , & out_fmt );
106- params -> frame_fmt = audio_stream_get_frm_fmt (& sink -> stream );
107- }
108- }
109-
11094static int smart_amp_set_config (struct processing_module * mod , uint32_t config_id ,
11195 enum module_cfg_fragment_position pos , uint32_t data_offset_size ,
11296 const uint8_t * fragment , size_t fragment_size , uint8_t * response ,
@@ -171,160 +155,156 @@ static int smart_amp_free(struct processing_module *mod)
171155 return 0 ;
172156}
173157
174- static int smart_amp_params (struct processing_module * mod )
158+ static void process_s16 (int8_t const * src_ptr ,
159+ int8_t const * src_begin ,
160+ int8_t const * src_end ,
161+ int8_t * dst_ptr ,
162+ int8_t const * dst_begin ,
163+ int8_t const * dst_end ,
164+ uint32_t size )
175165{
176- struct sof_ipc_stream_params * params = mod -> stream_params ;
177- struct comp_dev * dev = mod -> dev ;
178- int ret ;
166+ int16_t const * src_addr = (int16_t const * )src_ptr ;
167+ int16_t * dst_addr = (int16_t * )dst_ptr ;
168+ int count = size >> 1 ;
169+ int i ;
179170
180- comp_dbg (dev , "smart_amp_params()" );
181- smart_amp_set_params (mod );
182- ret = comp_verify_params (dev , BUFF_PARAMS_CHANNELS , params );
183- if (ret < 0 ) {
184- comp_err (dev , "smart_amp_params(): pcm params verification failed." );
185- return - EINVAL ;
171+ for (i = 0 ; i < count ; i ++ ) {
172+ if (src_addr >= (int16_t const * )src_end )
173+ src_addr = (int16_t const * )src_begin ;
174+
175+ if (dst_addr >= (int16_t * )dst_end )
176+ dst_addr = (int16_t * )dst_begin ;
177+
178+ * dst_addr = * src_addr ;
179+ src_addr ++ ;
180+ dst_addr ++ ;
186181 }
187- return 0 ;
188182}
189183
190- static int smart_amp_process_s16 (struct processing_module * mod ,
191- struct input_stream_buffer * bsource ,
192- struct output_stream_buffer * bsink ,
193- uint32_t frames , int8_t * chan_map )
184+ static void process_s32 (int8_t const * src_ptr ,
185+ int8_t const * src_begin ,
186+ int8_t const * src_end ,
187+ int8_t * dst_ptr ,
188+ int8_t const * dst_begin ,
189+ int8_t const * dst_end ,
190+ uint32_t size )
194191{
195- struct smart_amp_data * sad = module_get_private_data (mod );
196- struct audio_stream * source = bsource -> data ;
197- struct audio_stream * sink = bsink -> data ;
198- int16_t * src ;
199- int16_t * dest ;
200- uint32_t in_frag = 0 ;
201- uint32_t out_frag = 0 ;
192+ int32_t const * src_addr = (int32_t const * )src_ptr ;
193+ int32_t * dst_addr = (int32_t * )dst_ptr ;
194+ int count = size >> 2 ;
202195 int i ;
203- int j ;
204-
205- bsource -> consumed += frames * audio_stream_get_channels (source ) * sizeof (int16_t );
206- for (i = 0 ; i < frames ; i ++ ) {
207- for (j = 0 ; j < sad -> out_channels ; j ++ ) {
208- if (chan_map [j ] != -1 ) {
209- src = audio_stream_read_frag_s16 (source ,
210- in_frag +
211- chan_map [j ]);
212- dest = audio_stream_write_frag_s16 (sink ,
213- out_frag );
214- * dest = * src ;
215- }
216- out_frag ++ ;
217- }
218- in_frag += audio_stream_get_channels (source );
196+
197+ for (i = 0 ; i < count ; i ++ ) {
198+ if (src_addr >= (int32_t const * )src_end )
199+ src_addr = (int32_t const * )src_begin ;
200+
201+ if (dst_addr >= (int32_t * )dst_end )
202+ dst_addr = (int32_t * )dst_begin ;
203+
204+ * dst_addr = * src_addr ;
205+ src_addr ++ ;
206+ dst_addr ++ ;
219207 }
220- return 0 ;
221208}
222209
223- static int smart_amp_process_s32 (struct processing_module * mod ,
224- struct input_stream_buffer * bsource ,
225- struct output_stream_buffer * bsink ,
226- uint32_t frames , int8_t * chan_map )
210+ static int smart_amp_process_data (struct processing_module * mod ,
211+ struct sof_source * source ,
212+ struct sof_source * feedback ,
213+ struct sof_sink * sink ,
214+ size_t size )
227215{
228216 struct smart_amp_data * sad = module_get_private_data (mod );
229- struct audio_stream * source = bsource -> data ;
230- struct audio_stream * sink = bsink -> data ;
231- int32_t * src ;
232- int32_t * dest ;
233- uint32_t in_frag = 0 ;
234- uint32_t out_frag = 0 ;
235- int i ;
236- int j ;
237-
238- bsource -> consumed += frames * audio_stream_get_channels (source ) * sizeof (int32_t );
239- for (i = 0 ; i < frames ; i ++ ) {
240- for (j = 0 ; j < sad -> out_channels ; j ++ ) {
241- if (chan_map [j ] != -1 ) {
242- src = audio_stream_read_frag_s32 (source ,
243- in_frag +
244- chan_map [j ]);
245- dest = audio_stream_write_frag_s32 (sink ,
246- out_frag );
247- * dest = * src ;
248- }
249- out_frag ++ ;
250- }
251- in_frag += audio_stream_get_channels (source );
252- }
217+ int8_t const * src_ptr ;
218+ int8_t const * src_begin ;
219+ int8_t const * src_end ;
220+ int8_t * dst_ptr ;
221+ int8_t const * dst_begin ;
222+ int8_t const * dst_end ;
223+ size_t src_size ;
224+ size_t dst_size ;
225+ int ret ;
253226
254- return 0 ;
255- }
227+ ret = sink_get_buffer (sink , size ,
228+ (void * * )& dst_ptr ,
229+ (void * * )& dst_begin ,
230+ & dst_size );
231+ if (ret )
232+ return ret ;
256233
257- static smart_amp_proc get_smart_amp_process ( struct comp_dev * dev ,
258- struct comp_buffer * buf )
259- {
260- switch ( audio_stream_get_frm_fmt ( & buf -> stream )) {
261- case SOF_IPC_FRAME_S16_LE :
262- return smart_amp_process_s16 ;
263- case SOF_IPC_FRAME_S24_4LE :
264- case SOF_IPC_FRAME_S32_LE :
265- return smart_amp_process_s32 ;
266- default :
267- comp_err ( dev , "smart_amp_process() error: not supported frame format" );
268- return NULL ;
234+ if (! feedback || ! source_get_data_available ( feedback ))
235+ goto source ;
236+
237+ ret = source_get_data ( feedback , size ,
238+ ( void const * * ) & src_ptr ,
239+ ( void const * * ) & src_begin ,
240+ & src_size );
241+ if ( ret ) {
242+ if ( ret == - EBUSY )
243+ return 0 ;
244+ else
245+ return ret ;
269246 }
247+
248+ src_end = src_begin + src_size ;
249+ dst_end = dst_begin + dst_size ;
250+ sad -> process (src_ptr , src_begin , src_end , dst_ptr , dst_begin , dst_end , size );
251+ source_release_data (feedback , size );
252+
253+ source :
254+ ret = source_get_data (source , size ,
255+ (void const * * )& src_ptr ,
256+ (void const * * )& src_begin ,
257+ & src_size );
258+ if (ret )
259+ return ret ;
260+
261+ src_end = src_begin + src_size ;
262+ dst_end = dst_begin + dst_size ;
263+ sad -> process (src_ptr , src_begin , src_end , dst_ptr , dst_begin , dst_end , size );
264+ source_release_data (source , size );
265+ sink_commit_buffer (sink , size );
266+ return 0 ;
270267}
271268
272269static int smart_amp_process (struct processing_module * mod ,
273- struct input_stream_buffer * input_buffers , int num_input_buffers ,
274- struct output_stream_buffer * output_buffers , int num_output_buffers )
270+ struct sof_source * * sources , int num_of_sources ,
271+ struct sof_sink * * sinks , int num_of_sinks )
275272{
276273 struct smart_amp_data * sad = module_get_private_data (mod );
277274 struct comp_dev * dev = mod -> dev ;
278- struct comp_buffer * fb_buf_c ;
279- struct comp_buffer * buf ;
280- struct input_stream_buffer * fb_input = NULL ;
275+ struct sof_source * fb_input = NULL ;
281276 /* if there is only one input stream, it should be the source input */
282- struct input_stream_buffer * src_input = & input_buffers [0 ];
283- uint32_t avail_passthrough_frames ;
284- uint32_t avail_frames = 0 ;
285- uint32_t sink_bytes ;
277+ struct sof_source * src_input = sources [0 ];
278+ uint32_t avail_passthrough ;
279+ uint32_t avail = 0 ;
286280 uint32_t i ;
281+ int ret ;
287282
288- if (num_input_buffers == SMART_AMP_NUM_IN_PINS )
289- for (i = 0 ; i < num_input_buffers ; i ++ ) {
290- buf = container_of (input_buffers [i ].data , struct comp_buffer , stream );
291-
292- if (IPC4_SINK_QUEUE_ID (buf_get_id (buf )) ==
293- SOF_SMART_AMP_FEEDBACK_QUEUE_ID ) {
294- fb_input = & input_buffers [i ];
295- fb_buf_c = buf ;
283+ if (num_of_sources == SMART_AMP_NUM_IN_PINS ) {
284+ for (i = 0 ; i < num_of_sources ; i ++ ) {
285+ if (IPC4_SINK_QUEUE_ID (source_get_id (sources [i ])) ==
286+ SOF_SMART_AMP_FEEDBACK_QUEUE_ID ) {
287+ fb_input = sources [i ];
296288 } else {
297- src_input = & input_buffers [i ];
289+ src_input = sources [i ];
298290 }
299291 }
300-
301- avail_passthrough_frames = src_input -> size ;
302-
303- if (fb_input ) {
304- if (fb_buf_c -> source && comp_get_state (dev , fb_buf_c -> source ) == dev -> state ) {
305- /* feedback */
306- avail_frames = MIN (avail_passthrough_frames ,
307- fb_input -> size );
308-
309- sad -> process (mod , fb_input , & output_buffers [0 ],
310- avail_frames , sad -> config .feedback_ch_map );
311- }
312292 }
313293
314- if (!avail_frames )
315- avail_frames = avail_passthrough_frames ;
294+ avail_passthrough = source_get_data_available (src_input );
316295
317- /* bytes calculation */
318- sink_bytes = avail_frames *
319- audio_stream_frame_bytes (output_buffers [0 ].data );
296+ if (fb_input && source_get_data_available (fb_input )) {
297+ /* feedback */
298+ avail = MIN (avail_passthrough , source_get_data_available (fb_input ));
299+ avail = MIN (avail , sink_get_free_size (sinks [0 ]));
300+ } else {
301+ avail = MIN (avail_passthrough , sink_get_free_size (sinks [0 ]));
302+ }
320303
321304 /* process data */
322- sad -> process (mod , src_input , & output_buffers [0 ],
323- avail_frames , sad -> config .source_ch_map );
324-
325- output_buffers [0 ].size = sink_bytes ;
305+ ret = smart_amp_process_data (mod , src_input , fb_input , sinks [0 ], avail );
326306
327- return 0 ;
307+ return ret ;
328308}
329309
330310static int smart_amp_reset (struct processing_module * mod )
@@ -336,6 +316,19 @@ static int smart_amp_reset(struct processing_module *mod)
336316 return 0 ;
337317}
338318
319+ static smart_amp_proc get_smart_amp_process (struct sof_sink * sink )
320+ {
321+ switch (sink_get_frm_fmt (sink )) {
322+ case SOF_IPC_FRAME_S16_LE :
323+ return process_s16 ;
324+ case SOF_IPC_FRAME_S24_4LE :
325+ case SOF_IPC_FRAME_S32_LE :
326+ return process_s32 ;
327+ default :
328+ return NULL ;
329+ }
330+ }
331+
339332static int smart_amp_prepare (struct processing_module * mod ,
340333 struct sof_source * * sources , int num_of_sources ,
341334 struct sof_sink * * sinks , int num_of_sinks )
@@ -346,42 +339,21 @@ static int smart_amp_prepare(struct processing_module *mod,
346339 struct comp_buffer * sink_buffer ;
347340 struct list_item * blist ;
348341 int ret ;
342+ int i ;
349343
350- ret = smart_amp_params (mod );
351- if (ret < 0 )
352- return ret ;
353-
354- comp_dbg (dev , "smart_amp_prepare()" );
355- /* searching for stream and feedback source buffers */
356- list_for_item (blist , & dev -> bsource_list ) {
357- source_buffer = container_of (blist , struct comp_buffer ,
358- sink_list );
359- audio_stream_init_alignment_constants (1 , 1 , & source_buffer -> stream );
360- if (IPC4_SINK_QUEUE_ID (buf_get_id (source_buffer )) ==
361- SOF_SMART_AMP_FEEDBACK_QUEUE_ID ) {
362- audio_stream_set_channels (& source_buffer -> stream ,
363- sad -> config .feedback_channels );
364- audio_stream_set_rate (& source_buffer -> stream ,
365- mod -> priv .cfg .base_cfg .audio_fmt .sampling_frequency );
366- }
367- }
368-
369- sink_buffer = list_first_item (& dev -> bsink_list , struct comp_buffer , source_list );
370- sad -> out_channels = audio_stream_get_channels (& sink_buffer -> stream );
371- audio_stream_init_alignment_constants (1 , 1 , & sink_buffer -> stream );
372- sad -> process = get_smart_amp_process (dev , sink_buffer );
344+ sad -> process = get_smart_amp_process (sinks [0 ]);
373345
374346 if (!sad -> process ) {
375347 comp_err (dev , "smart_amp_prepare(): get_smart_amp_process failed" );
376- ret = - EINVAL ;
348+ return - EINVAL ;
377349 }
378- return ret ;
350+ return 0 ;
379351}
380352
381353static const struct module_interface smart_amp_test_interface = {
382354 .init = smart_amp_init ,
383355 .prepare = smart_amp_prepare ,
384- .process_audio_stream = smart_amp_process ,
356+ .process = smart_amp_process ,
385357 .set_configuration = smart_amp_set_config ,
386358 .get_configuration = smart_amp_get_config ,
387359 .reset = smart_amp_reset ,
0 commit comments