@@ -753,28 +753,47 @@ static int waves_codec_init_process(struct processing_module *mod)
753753 return 0 ;
754754}
755755
756- static int
757- waves_codec_process (struct processing_module * mod ,
758- struct input_stream_buffer * input_buffers , int num_input_buffers ,
759- struct output_stream_buffer * output_buffers , int num_output_buffers )
756+ static int waves_codec_process (struct processing_module * mod ,
757+ struct sof_source * * sources , int num_of_sources ,
758+ struct sof_sink * * sinks , int num_of_sinks )
760759{
761760 int ret ;
762761 struct comp_dev * dev = mod -> dev ;
763762 struct module_data * codec = & mod -> priv ;
764763 struct waves_codec_data * waves_codec = codec -> private ;
764+ const void * src_ptr ;
765+ void * src_buf_start ;
766+ size_t src_buf_size ;
767+ void * snk_ptr ;
768+ void * snk_buf_start ;
769+ size_t snk_buf_size ;
770+ size_t n_bytes = codec -> mpd .in_buff_size ;
771+ size_t size_to_wrap ;
765772
766773 /* Proceed only if we have enough data to fill the module buffer completely */
767- if (input_buffers [0 ]. size < codec -> mpd . in_buff_size ) {
774+ if (source_get_data_available ( sources [0 ]) < n_bytes ) {
768775 comp_dbg (dev , "not enough data to process" );
769776 return - ENODATA ;
770777 }
771778
772779 if (!codec -> mpd .init_done )
773780 waves_codec_init_process (mod );
774781
775- memcpy_s (codec -> mpd .in_buff , codec -> mpd .in_buff_size ,
776- input_buffers [0 ].data , codec -> mpd .in_buff_size );
777- codec -> mpd .avail = codec -> mpd .in_buff_size ;
782+ ret = source_get_data (sources [0 ], n_bytes , & src_ptr , & src_buf_start , & src_buf_size );
783+ if (ret )
784+ return ret ;
785+
786+ /* src_buf_size is the total ring buffer size; handle wrap when copying to in_buff */
787+ size_to_wrap = (const uint8_t * )src_buf_start + src_buf_size - (const uint8_t * )src_ptr ;
788+ if (n_bytes <= size_to_wrap ) {
789+ memcpy_s (codec -> mpd .in_buff , n_bytes , src_ptr , n_bytes );
790+ } else {
791+ memcpy_s (codec -> mpd .in_buff , n_bytes , src_ptr , size_to_wrap );
792+ memcpy_s ((uint8_t * )codec -> mpd .in_buff + size_to_wrap , n_bytes - size_to_wrap ,
793+ src_buf_start , n_bytes - size_to_wrap );
794+ }
795+ source_release_data (sources [0 ], n_bytes );
796+ codec -> mpd .avail = n_bytes ;
778797
779798 comp_dbg (dev , "start" );
780799
@@ -812,12 +831,24 @@ waves_codec_process(struct processing_module *mod,
812831 codec -> mpd .produced = waves_codec -> o_stream .numAvailableSamples *
813832 waves_codec -> o_format .numChannels * waves_codec -> sample_size_in_bytes ;
814833 codec -> mpd .consumed = codec -> mpd .produced ;
815- input_buffers [0 ].consumed = codec -> mpd .consumed ;
816- ret = 0 ;
817- /* copy the produced samples into the output buffer */
818- memcpy_s (output_buffers [0 ].data , codec -> mpd .produced , codec -> mpd .out_buff ,
819- codec -> mpd .produced );
820- output_buffers [0 ].size = codec -> mpd .produced ;
834+ ret = sink_get_buffer (sinks [0 ], codec -> mpd .produced ,
835+ & snk_ptr , & snk_buf_start , & snk_buf_size );
836+ if (!ret ) {
837+ /* snk_buf_size is the total ring buffer size; handle wrap */
838+ size_to_wrap = (uint8_t * )snk_buf_start + snk_buf_size -
839+ (uint8_t * )snk_ptr ;
840+ if (codec -> mpd .produced <= size_to_wrap ) {
841+ memcpy_s (snk_ptr , codec -> mpd .produced ,
842+ codec -> mpd .out_buff , codec -> mpd .produced );
843+ } else {
844+ memcpy_s (snk_ptr , codec -> mpd .produced ,
845+ codec -> mpd .out_buff , size_to_wrap );
846+ memcpy_s (snk_buf_start , codec -> mpd .produced - size_to_wrap ,
847+ (const uint8_t * )codec -> mpd .out_buff + size_to_wrap ,
848+ codec -> mpd .produced - size_to_wrap );
849+ }
850+ sink_commit_buffer (sinks [0 ], codec -> mpd .produced );
851+ }
821852 }
822853
823854 if (ret )
@@ -899,7 +930,7 @@ waves_codec_set_configuration(struct processing_module *mod, uint32_t config_id,
899930static const struct module_interface waves_interface = {
900931 .init = waves_codec_init ,
901932 .prepare = waves_codec_prepare ,
902- .process_raw_data = waves_codec_process ,
933+ .process = waves_codec_process ,
903934 .set_configuration = waves_codec_set_configuration ,
904935 .reset = waves_codec_reset ,
905936 .free = waves_codec_free
0 commit comments