Skip to content

Commit 671f798

Browse files
andrula-songkv2019i
authored andcommitted
Audio: Mixer: Use frame aligned API
Use frame aligned API to reduce the division calculation in mixer process function. Signed-off-by: Andrula Song <andrula.song@intel.com>
1 parent 6009c21 commit 671f798

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

src/audio/mixer/mixer.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
182208
static 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);

test/cmocka/src/audio/mixer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ cmocka_test(mixer
1919
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-schedule.c
2020
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-stream.c
2121
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-xrun.c
22+
${PROJECT_SOURCE_DIR}/src/math/numbers.c
2223
)
2324
target_link_libraries(mixer PRIVATE -lm)

0 commit comments

Comments
 (0)