@@ -98,8 +98,8 @@ static int mixer_process(struct processing_module *mod,
9898 for (i = 0 ; i < num_input_buffers ; i ++ ) {
9999 uint32_t avail_frames ;
100100
101- avail_frames = audio_stream_avail_frames (mod -> input_buffers [i ].data ,
102- mod -> output_buffers [0 ].data );
101+ avail_frames = audio_stream_avail_frames_aligned (mod -> input_buffers [i ].data ,
102+ mod -> output_buffers [0 ].data );
103103 frames = MIN (frames , avail_frames );
104104 }
105105
@@ -179,6 +179,32 @@ static int mixer_reset(struct processing_module *mod)
179179 return 0 ;
180180}
181181
182+ /* init and calculate the aligned setting for available frames and free frames retrieve*/
183+ static inline void mixer_set_frame_alignment (struct audio_stream __sparse_cache * source )
184+ {
185+ #if XCHAL_HAVE_HIFI3 || XCHAL_HAVE_HIFI4
186+
187+ /* Xtensa intrinsics ask for 8-byte aligned. 5.1 format SSE audio
188+ * requires 16-byte aligned.
189+ */
190+ const uint32_t byte_align = source -> channels == 6 ? 16 : 8 ;
191+
192+ /*There is no limit for frame number, so set it as 1*/
193+ const uint32_t frame_align_req = 1 ;
194+
195+ #else
196+
197+ /* Since the generic version process signal sample by sample, so there is no
198+ * limit for it, then set the byte_align and frame_align_req to be 1.
199+ */
200+ const uint32_t byte_align = 1 ;
201+ const uint32_t frame_align_req = 1 ;
202+
203+ #endif
204+
205+ audio_stream_init_alignment_constants (byte_align , frame_align_req , source );
206+ }
207+
182208static int mixer_prepare (struct processing_module * mod )
183209{
184210 struct mixer_data * md = module_get_private_data (mod );
@@ -191,6 +217,7 @@ static int mixer_prepare(struct processing_module *mod)
191217 source_list );
192218 sink_c = buffer_acquire (sink );
193219 md -> mix_func = mixer_get_processing_function (dev , sink_c );
220+ mixer_set_frame_alignment (& sink_c -> stream );
194221 buffer_release (sink_c );
195222
196223 /* check each mixer source state */
@@ -209,6 +236,7 @@ static int mixer_prepare(struct processing_module *mod)
209236 */
210237 source = container_of (blist , struct comp_buffer , sink_list );
211238 source_c = buffer_acquire (source );
239+ mixer_set_frame_alignment (& source_c -> stream );
212240 stop = source_c -> source && (source_c -> source -> state == COMP_STATE_PAUSED ||
213241 source_c -> source -> state == COMP_STATE_ACTIVE );
214242 buffer_release (source_c );
0 commit comments