1111#include <sof/audio/format.h>
1212#include <sof/audio/ipc-config.h>
1313#include <sof/audio/pipeline.h>
14+ #include <sof/audio/sink_source_utils.h>
1415#include <sof/ipc/msg.h>
1516#include <sof/lib/memory.h>
1617#include <sof/lib/uuid.h>
@@ -269,25 +270,31 @@ __cold static int drc_get_config(struct processing_module *mod,
269270}
270271
271272static int drc_process (struct processing_module * mod ,
272- struct input_stream_buffer * input_buffers ,
273- int num_input_buffers ,
274- struct output_stream_buffer * output_buffers ,
275- int num_output_buffers )
273+ struct sof_source * * sources ,
274+ int num_of_sources ,
275+ struct sof_sink * * sinks ,
276+ int num_of_sinks )
276277{
277278 struct drc_comp_data * cd = module_get_private_data (mod );
278279 struct comp_dev * dev = mod -> dev ;
279- struct audio_stream * source = input_buffers [0 ].data ;
280- struct audio_stream * sink = output_buffers [0 ].data ;
281- int frames = input_buffers [0 ].size ;
280+ struct sof_source * source = sources [0 ];
281+ struct sof_sink * sink = sinks [0 ];
282+ struct cir_buf_source source_buf ;
283+ struct cir_buf_sink sink_buf ;
284+ size_t source_frame_bytes = source_get_frame_bytes (source );
285+ size_t sink_frame_bytes = sink_get_frame_bytes (sink );
286+ size_t source_bytes , sink_bytes ;
287+ size_t source_buf_size , sink_buf_size ;
288+ uint32_t frames ;
282289 int ret ;
283290
284291 comp_dbg (dev , "entry" );
285292
286293 /* Check for changed configuration */
287294 if (comp_is_new_data_blob_available (cd -> model_handler )) {
288295 cd -> config = comp_get_data_blob (cd -> model_handler , NULL , NULL );
289- ret = drc_setup (mod , audio_stream_get_channels (source ),
290- audio_stream_get_rate (source ));
296+ ret = drc_setup (mod , source_get_channels (source ),
297+ source_get_rate (source ));
291298 if (ret < 0 ) {
292299 comp_err (dev , "drc_copy(), failed DRC setup" );
293300 return ret ;
@@ -309,10 +316,46 @@ static int drc_process(struct processing_module *mod,
309316 /* Control pass-though in processing function with switch control */
310317 cd -> enabled = cd -> config && cd -> config -> params .enabled && cd -> enable_switch ;
311318
312- cd -> drc_func (mod , source , sink , frames );
319+ frames = source_sink_avail_frames_aligned (source , sink );
320+ if (!frames )
321+ return 0 ;
322+
323+ source_bytes = frames * source_frame_bytes ;
324+ sink_bytes = frames * sink_frame_bytes ;
325+
326+ /* acquire source and sink circular buffers for the whole period */
327+ ret = source_get_data (source , source_bytes , & source_buf .ptr ,
328+ & source_buf .buf_start , & source_buf_size );
329+ if (ret < 0 )
330+ return ret ;
331+ if (source_buf_size < source_bytes ) {
332+ comp_err (dev , "source buffer size %zu is insufficient for %zu bytes" ,
333+ source_buf_size , source_bytes );
334+ source_release_data (source , 0 );
335+ return - EINVAL ;
336+ }
337+ source_buf .buf_end = (const char * )source_buf .buf_start + source_buf_size ;
338+
339+ ret = sink_get_buffer (sink , sink_bytes , & sink_buf .ptr , & sink_buf .buf_start ,
340+ & sink_buf_size );
341+ if (ret < 0 ) {
342+ source_release_data (source , 0 );
343+ return ret ;
344+ }
345+ if (sink_buf_size < sink_bytes ) {
346+ comp_err (dev , "sink buffer size %zu is insufficient for %zu bytes" ,
347+ sink_buf_size , sink_bytes );
348+ source_release_data (source , 0 );
349+ sink_commit_buffer (sink , 0 );
350+ return - EINVAL ;
351+ }
352+ sink_buf .buf_end = (char * )sink_buf .buf_start + sink_buf_size ;
353+
354+ cd -> drc_func (mod , & source_buf , & sink_buf , frames );
313355
314- /* calc new free and available */
315- module_update_buffer_position (& input_buffers [0 ], & output_buffers [0 ], frames );
356+ /* commit the consumed and produced data */
357+ source_release_data (source , source_bytes );
358+ sink_commit_buffer (sink , sink_bytes );
316359 return 0 ;
317360}
318361
@@ -367,6 +410,7 @@ static int drc_prepare(struct processing_module *mod,
367410 cd -> source_format = audio_stream_get_frm_fmt (& sourceb -> stream );
368411 channels = audio_stream_get_channels (& sinkb -> stream );
369412 rate = audio_stream_get_rate (& sinkb -> stream );
413+ cd -> channels = channels ;
370414
371415 /* Initialize DRC */
372416 comp_info (dev , "source_format=%d" , cd -> source_format );
@@ -414,7 +458,7 @@ static int drc_reset(struct processing_module *mod)
414458static const struct module_interface drc_interface = {
415459 .init = drc_init ,
416460 .prepare = drc_prepare ,
417- .process_audio_stream = drc_process ,
461+ .process = drc_process ,
418462 .set_configuration = drc_set_config ,
419463 .get_configuration = drc_get_config ,
420464 .reset = drc_reset ,
0 commit comments