Skip to content

Commit dc6ff06

Browse files
committed
Audio: Up_down_mixer: Process with circular wrap
The previous processing function processed entire source and sink circular size. It avoids wrap check but is more inefficient when buffer is larger than period. WIP, not cleaned up. Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
1 parent ca1bf06 commit dc6ff06

File tree

1 file changed

+44
-12
lines changed

1 file changed

+44
-12
lines changed

src/audio/up_down_mixer/up_down_mixer.c

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)