Skip to content

Commit e6869c8

Browse files
committed
mixer: factor out mix_one_voice
1 parent 8b61333 commit e6869c8

File tree

1 file changed

+82
-77
lines changed

1 file changed

+82
-77
lines changed

shared-module/audiomixer/Mixer.c

Lines changed: 82 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,87 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
295295
#endif
296296
}
297297

298+
static void mix_one_voice(audiomixer_mixer_obj_t* self,
299+
audiomixer_mixervoice_obj_t* voice, bool voices_active,
300+
uint32_t* word_buffer, uint32_t length) {
301+
uint32_t j = 0;
302+
bool voice_done = voice->sample == NULL;
303+
for (uint32_t i = 0; i < length; i++) {
304+
if (!voice_done && j >= voice->buffer_length) {
305+
if (!voice->more_data) {
306+
if (voice->loop) {
307+
audiosample_reset_buffer(voice->sample, false, 0);
308+
} else {
309+
voice->sample = NULL;
310+
voice_done = true;
311+
}
312+
}
313+
if (!voice_done) {
314+
// Load another buffer
315+
audioio_get_buffer_result_t result = audiosample_get_buffer(voice->sample, false, 0, (uint8_t**) &voice->remaining_buffer, &voice->buffer_length);
316+
// Track length in terms of words.
317+
voice->buffer_length /= sizeof(uint32_t);
318+
voice->more_data = result == GET_BUFFER_MORE_DATA;
319+
j = 0;
320+
}
321+
}
322+
// First active voice gets copied over verbatim.
323+
uint32_t sample_value;
324+
if (voice_done) {
325+
// Exit early if another voice already set all samples once.
326+
if (voices_active) {
327+
continue;
328+
}
329+
sample_value = 0;
330+
if (!self->samples_signed) {
331+
if (self->bits_per_sample == 8) {
332+
sample_value = 0x7f7f7f7f;
333+
} else {
334+
sample_value = 0x7fff7fff;
335+
}
336+
}
337+
} else {
338+
sample_value = voice->remaining_buffer[j];
339+
}
340+
341+
// apply the mixer level
342+
if (!self->samples_signed) {
343+
if (self->bits_per_sample == 8) {
344+
sample_value = mult8unsigned(sample_value, voice->level);
345+
} else {
346+
sample_value = mult16unsigned(sample_value, voice->level);
347+
}
348+
} else {
349+
if (self->bits_per_sample == 8) {
350+
sample_value = mult8signed(sample_value, voice->level);
351+
} else {
352+
sample_value = mult16signed(sample_value, voice->level);
353+
}
354+
}
355+
356+
if (!voices_active) {
357+
word_buffer[i] = sample_value;
358+
} else {
359+
if (self->bits_per_sample == 8) {
360+
if (self->samples_signed) {
361+
word_buffer[i] = add8signed(word_buffer[i], sample_value);
362+
} else {
363+
word_buffer[i] = add8unsigned(word_buffer[i], sample_value);
364+
}
365+
} else {
366+
if (self->samples_signed) {
367+
word_buffer[i] = add16signed(word_buffer[i], sample_value);
368+
} else {
369+
word_buffer[i] = add16unsigned(word_buffer[i], sample_value);
370+
}
371+
}
372+
}
373+
j++;
374+
}
375+
voice->buffer_length -= j;
376+
voice->remaining_buffer += j;
377+
}
378+
298379
audioio_get_buffer_result_t audiomixer_mixer_get_buffer(audiomixer_mixer_obj_t* self,
299380
bool single_channel,
300381
uint8_t channel,
@@ -325,83 +406,7 @@ audioio_get_buffer_result_t audiomixer_mixer_get_buffer(audiomixer_mixer_obj_t*
325406
for (int32_t v = 0; v < self->voice_count; v++) {
326407
audiomixer_mixervoice_obj_t* voice = MP_OBJ_TO_PTR(self->voice[v]);
327408

328-
uint32_t j = 0;
329-
bool voice_done = voice->sample == NULL;
330-
for (uint32_t i = 0; i < self->len / sizeof(uint32_t); i++) {
331-
if (!voice_done && j >= voice->buffer_length) {
332-
if (!voice->more_data) {
333-
if (voice->loop) {
334-
audiosample_reset_buffer(voice->sample, false, 0);
335-
} else {
336-
voice->sample = NULL;
337-
voice_done = true;
338-
}
339-
}
340-
if (!voice_done) {
341-
// Load another buffer
342-
audioio_get_buffer_result_t result = audiosample_get_buffer(voice->sample, false, 0, (uint8_t**) &voice->remaining_buffer, &voice->buffer_length);
343-
// Track length in terms of words.
344-
voice->buffer_length /= sizeof(uint32_t);
345-
voice->more_data = result == GET_BUFFER_MORE_DATA;
346-
j = 0;
347-
}
348-
}
349-
// First active voice gets copied over verbatim.
350-
uint32_t sample_value;
351-
if (voice_done) {
352-
// Exit early if another voice already set all samples once.
353-
if (voices_active) {
354-
continue;
355-
}
356-
sample_value = 0;
357-
if (!self->samples_signed) {
358-
if (self->bits_per_sample == 8) {
359-
sample_value = 0x7f7f7f7f;
360-
} else {
361-
sample_value = 0x7fff7fff;
362-
}
363-
}
364-
} else {
365-
sample_value = voice->remaining_buffer[j];
366-
}
367-
368-
// apply the mixer level
369-
if (!self->samples_signed) {
370-
if (self->bits_per_sample == 8) {
371-
sample_value = mult8unsigned(sample_value, voice->level);
372-
} else {
373-
sample_value = mult16unsigned(sample_value, voice->level);
374-
}
375-
} else {
376-
if (self->bits_per_sample == 8) {
377-
sample_value = mult8signed(sample_value, voice->level);
378-
} else {
379-
sample_value = mult16signed(sample_value, voice->level);
380-
}
381-
}
382-
383-
if (!voices_active) {
384-
word_buffer[i] = sample_value;
385-
} else {
386-
if (self->bits_per_sample == 8) {
387-
if (self->samples_signed) {
388-
word_buffer[i] = add8signed(word_buffer[i], sample_value);
389-
} else {
390-
word_buffer[i] = add8unsigned(word_buffer[i], sample_value);
391-
}
392-
} else {
393-
if (self->samples_signed) {
394-
word_buffer[i] = add16signed(word_buffer[i], sample_value);
395-
} else {
396-
word_buffer[i] = add16unsigned(word_buffer[i], sample_value);
397-
}
398-
}
399-
}
400-
j++;
401-
}
402-
voice->buffer_length -= j;
403-
voice->remaining_buffer += j;
404-
409+
mix_one_voice(self, voice, voices_active, word_buffer, self->len / sizeof(uint32_t));
405410
voices_active = true;
406411
}
407412

0 commit comments

Comments
 (0)