diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2018-10-05 13:00:22 -0700 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2018-10-05 15:19:08 -0700 |
| commit | 8587d8edf0a794644783e26ac243d1ba141a85ca (patch) | |
| tree | 70fb43c7ccca12fc02442a2100be8fb837839fd2 /shared-module | |
| parent | 2ec7f98c905c5b2e758be075897329eee704dcfe (diff) | |
Fix voice ending in the middle of a buffer.
Diffstat (limited to 'shared-module')
| -rw-r--r-- | shared-module/audioio/Mixer.c | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/shared-module/audioio/Mixer.c b/shared-module/audioio/Mixer.c index 85acbf0ab..c669402bd 100644 --- a/shared-module/audioio/Mixer.c +++ b/shared-module/audioio/Mixer.c @@ -244,30 +244,47 @@ audioio_get_buffer_result_t audioio_mixer_get_buffer(audioio_mixer_obj_t* self, bool voices_active = false; for (int32_t v = 0; v < self->voice_count; v++) { audioio_mixer_voice_t* voice = &self->voice[v]; - if (voice->sample == NULL) { - continue; - } uint32_t j = 0; + bool voice_done = voice->sample == NULL; for (uint32_t i = 0; i < self->len / sizeof(uint32_t); i++) { - if (j >= voice->buffer_length) { + if (!voice_done && j >= voice->buffer_length) { if (!voice->more_data) { if (voice->loop) { audiosample_reset_buffer(voice->sample, false, 0); } else { voice->sample = NULL; - break; + voice_done = true; } } - // Load another buffer - audioio_get_buffer_result_t result = audiosample_get_buffer(voice->sample, false, 0, (uint8_t**) &voice->remaining_buffer, &voice->buffer_length); - // Track length in terms of words. - voice->buffer_length /= sizeof(uint32_t); - voice->more_data = result == GET_BUFFER_MORE_DATA; - j = 0; + if (!voice_done) { + // Load another buffer + audioio_get_buffer_result_t result = audiosample_get_buffer(voice->sample, false, 0, (uint8_t**) &voice->remaining_buffer, &voice->buffer_length); + // Track length in terms of words. + voice->buffer_length /= sizeof(uint32_t); + voice->more_data = result == GET_BUFFER_MORE_DATA; + j = 0; + } } // First active voice gets copied over verbatim. - uint32_t sample_value = voice->remaining_buffer[j]; + uint32_t sample_value; + if (voice_done) { + // Exit early if another voice already set all samples once. + if (voices_active) { + continue; + } + sample_value = 0; + if (!self->samples_signed) { + if (self->bits_per_sample == 8) { + sample_value = 0x7f7f7f7f; + } else { + sample_value = 0x7fff7fff; + } + } + } else { + sample_value = voice->remaining_buffer[j]; + } + if (!voices_active) { word_buffer[i] = sample_value; } else { @@ -293,20 +310,6 @@ audioio_get_buffer_result_t audioio_mixer_get_buffer(audioio_mixer_obj_t* self, voices_active = true; } - // No voice is active so zero out the signal. - if (!voices_active) { - uint32_t zero = 0; - if (!self->samples_signed) { - if (self->bits_per_sample == 8) { - zero = 0x7f7f7f7f; - } else { - zero = 0x7fff7fff; - } - } - for (uint32_t i = 0; i < self->len / sizeof(uint32_t); i++) { - word_buffer[i] = zero; - } - } self->read_count += 1; } else if (!self->use_first_buffer) { *buffer = (uint8_t*) self->first_buffer; |
