@@ -435,40 +435,72 @@ up_down_mixer_process(struct processing_module *mod,
435435 struct comp_dev * dev = mod -> dev ;
436436
437437 size_t output_frames , input_frames , ret , input_cirbuf_size , output_cirbuf_size ;
438- const uint8_t * input0_pos , * input0_start ;
439- uint8_t * output_pos , * output_start ;
438+ const uint8_t * input_pos , * input_start , * input_end ;
439+ uint8_t * output_pos , * output_start , * output_end ;
440+ int input_frames_without_wrap , output_frames_without_wrap ;
441+ int frames_without_wrap , frames , frames_remain ;
442+ uint32_t input_bytes ;
440443
441444 comp_dbg (dev , "up_down_mixer_process()" );
442445
443446 output_frames = sink_get_free_frames (output_buffers [0 ]);
444447 input_frames = source_get_data_frames_available (input_buffers [0 ]);
448+ frames = MIN (input_frames , output_frames );
449+ if (!frames )
450+ return 0 ;
445451
446452 const size_t output_frame_bytes = sink_get_frame_bytes (output_buffers [0 ]);
447453
448- ret = sink_get_buffer (output_buffers [0 ], output_frames * output_frame_bytes ,
454+ ret = sink_get_buffer (output_buffers [0 ], frames * output_frame_bytes ,
449455 (void * * )& output_pos , (void * * )& output_start , & output_cirbuf_size );
450- if (ret )
456+ if (ret ) {
457+ comp_err (dev , "failed sink_get_buffer" );
451458 return - ENODATA ;
459+ }
452460
453- const size_t input0_frame_bytes = source_get_frame_bytes (input_buffers [0 ]);
461+ const size_t input_frame_bytes = source_get_frame_bytes (input_buffers [0 ]);
454462
455- ret = source_get_data (input_buffers [0 ], input_frames * input0_frame_bytes ,
456- (const void * * )& input0_pos , (const void * * )& input0_start ,
463+ ret = source_get_data (input_buffers [0 ], frames * input_frame_bytes ,
464+ (const void * * )& input_pos , (const void * * )& input_start ,
457465 & input_cirbuf_size );
458466 if (ret ) {
459467 sink_commit_buffer (output_buffers [0 ], 0 );
468+ comp_err (dev , "failed source_get_data" );
460469 return - ENODATA ;
461470 }
462471
463- cd -> mix_routine (cd , (const void * )input0_start , input_cirbuf_size , (void * )output_start );
472+ input_end = input_start + input_cirbuf_size ;
473+ output_end = output_start + output_cirbuf_size ;
474+ frames_remain = frames ;
475+ while (frames_remain ) {
476+ input_frames_without_wrap = (input_end - input_pos ) / input_frame_bytes ;
477+ output_frames_without_wrap = (output_end - output_pos ) / output_frame_bytes ;
478+ frames_without_wrap = MIN (input_frames_without_wrap , output_frames_without_wrap );
479+ frames_without_wrap = MIN (frames_without_wrap , frames );
480+ input_bytes = input_frame_bytes * frames_without_wrap ;
481+ cd -> mix_routine (cd , (const void * )input_pos , input_bytes , (void * )output_pos );
482+
483+ input_pos += input_bytes ;
484+ output_pos += frames_without_wrap * output_frame_bytes ;
485+ input_pos = (input_pos > input_end ) ?
486+ input_pos - input_cirbuf_size : input_pos ;
487+ output_pos = (output_pos > output_end ) ?
488+ output_pos - output_cirbuf_size : output_pos ;
489+ frames_remain -= frames_without_wrap ;
490+ }
464491
465- ret = sink_commit_buffer (output_buffers [0 ], output_frames * output_frame_bytes );
466- if (ret )
492+ ret = sink_commit_buffer (output_buffers [0 ], frames * output_frame_bytes );
493+ if (ret ) {
494+ comp_err (dev , "failed sink_commit_buffer" );
467495 return ret ;
496+ }
468497
469- ret = source_release_data (input_buffers [0 ], input_frames * input0_frame_bytes );
470- if (ret )
498+ ret = source_release_data (input_buffers [0 ], frames * input_frame_bytes );
499+ if (ret ) {
500+ comp_err (dev , "failed source_release_data" );
471501 return ret ;
502+ }
503+
472504 return 0 ;
473505}
474506
0 commit comments