summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@adafruit.com>2020-06-02 12:50:05 -0700
committerGitHub <noreply@github.com>2020-06-02 12:50:05 -0700
commitbb3f54a1cd4775358e2d1fd4c224247edc4e3149 (patch)
treedef2bd64b9394b2ae3484a23566b4f01731fddbf
parentdb04fd1725d375d7f9110c35f9346b32cb99b19e (diff)
parent0722dafc2464b414e680fab700f3f84cd54879df (diff)
Merge pull request #2996 from jepler/mixer-bugfixes
audiomixer: Fix garbled playback when voice 0 is stopped, audio pops
-rw-r--r--shared-module/audiomixer/Mixer.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/shared-module/audiomixer/Mixer.c b/shared-module/audiomixer/Mixer.c
index 4a72dab28..6c1ba1973 100644
--- a/shared-module/audiomixer/Mixer.c
+++ b/shared-module/audiomixer/Mixer.c
@@ -143,19 +143,17 @@ static inline uint32_t pack8(uint32_t val) {
static void mix_down_one_voice(audiomixer_mixer_obj_t* self,
audiomixer_mixervoice_obj_t* voice, bool voices_active,
uint32_t* word_buffer, uint32_t length) {
- bool voice_done = voice->sample == NULL;
- while (!voice_done && length != 0) {
+ while (length != 0) {
if (voice->buffer_length == 0) {
if (!voice->more_data) {
if (voice->loop) {
audiosample_reset_buffer(voice->sample, false, 0);
} else {
voice->sample = NULL;
- voice_done = true;
break;
}
}
- if (!voice_done) {
+ if (voice->sample) {
// 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.
@@ -230,10 +228,8 @@ static void mix_down_one_voice(audiomixer_mixer_obj_t* self,
}
if (length && !voices_active) {
- uint32_t sample_value = self->bits_per_sample == 8
- ? 0x80808080 : 0x80008000;
for (uint32_t i = 0; i<length; i++) {
- word_buffer[i] = sample_value;
+ word_buffer[i] = 0;
}
}
}
@@ -269,9 +265,16 @@ audioio_get_buffer_result_t audiomixer_mixer_get_buffer(audiomixer_mixer_obj_t*
for (int32_t v = 0; v < self->voice_count; v++) {
audiomixer_mixervoice_obj_t* voice = MP_OBJ_TO_PTR(self->voice[v]);
+ if(voice->sample) {
+ mix_down_one_voice(self, voice, voices_active, word_buffer, length);
+ voices_active = true;
+ }
+ }
- mix_down_one_voice(self, voice, voices_active, word_buffer, length);
- voices_active = true;
+ if (!voices_active) {
+ for (uint32_t i = 0; i<length; i++) {
+ word_buffer[i] = 0;
+ }
}
if (!self->samples_signed) {