Skip to content

Commit 98505e4

Browse files
authored
Merge pull request #11211 from relic-se/audiomixer-reset-buffer
Prevent `audiomixer.Mixer` from resetting all voices when played
2 parents c8cd7fe + ec5d640 commit 98505e4

3 files changed

Lines changed: 13 additions & 6 deletions

File tree

shared-bindings/audiomixer/MixerVoice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ extern const mp_obj_type_t audiomixer_mixervoice_type;
1414
void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *self);
1515
void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent);
1616
void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample, bool loop);
17+
void common_hal_audiomixer_mixervoice_reset_buffer(audiomixer_mixervoice_obj_t *self);
1718
void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self);
1819
void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self);
1920
mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self);

shared-module/audiomixer/Mixer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t *self,
6666
bool single_channel_output,
6767
uint8_t channel) {
6868
for (uint8_t i = 0; i < self->voice_count; i++) {
69-
common_hal_audiomixer_mixervoice_stop(self->voice[i]);
69+
common_hal_audiomixer_mixervoice_reset_buffer(self->voice[i]);
7070
}
7171
}
7272

shared-module/audiomixer/MixerVoice.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,17 @@ void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp
7070
self->sample = sample;
7171
self->loop = loop;
7272

73-
audiosample_reset_buffer(sample, false, 0);
74-
audioio_get_buffer_result_t result = audiosample_get_buffer(sample, false, 0, (uint8_t **)&self->remaining_buffer, &self->buffer_length);
75-
// Track length in terms of words.
76-
self->buffer_length /= sizeof(uint32_t);
77-
self->more_data = result == GET_BUFFER_MORE_DATA;
73+
common_hal_audiomixer_mixervoice_reset_buffer(self);
74+
}
75+
76+
void common_hal_audiomixer_mixervoice_reset_buffer(audiomixer_mixervoice_obj_t *self) {
77+
if (self->sample != NULL) {
78+
audiosample_reset_buffer(self->sample, false, 0);
79+
audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->remaining_buffer, &self->buffer_length);
80+
// Track length in terms of words.
81+
self->buffer_length /= sizeof(uint32_t);
82+
self->more_data = result == GET_BUFFER_MORE_DATA;
83+
}
7884
}
7985

8086
bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *self) {

0 commit comments

Comments
 (0)