Skip to content

Commit 98b360a

Browse files
committed
Double buffering
1 parent 01a220a commit 98b360a

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

shared-module/audiodelays/Echo.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,19 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
2121
self->sample_rate = sample_rate;
2222

2323
self->buffer_len = buffer_size;
24-
self->buffer = m_malloc(self->buffer_len);
25-
if (self->buffer == NULL) {
24+
self->buffer[0] = m_malloc(self->buffer_len);
25+
if (self->buffer[0] == NULL) {
2626
common_hal_audiodelays_echo_deinit(self);
2727
m_malloc_fail(self->buffer_len);
2828
}
29-
memset(self->buffer, 0, self->buffer_len);
29+
memset(self->buffer[0], 0, self->buffer_len);
30+
self->buffer[1] = m_malloc(self->buffer_len);
31+
if (self->buffer[1] == NULL) {
32+
common_hal_audiodelays_echo_deinit(self);
33+
m_malloc_fail(self->buffer_len);
34+
}
35+
memset(self->buffer[1], 0, self->buffer_len);
36+
self->last_buf_idx = 1;
3037

3138
if (decay == MP_OBJ_NULL) {
3239
decay = mp_obj_new_float(0.7);
@@ -81,7 +88,8 @@ void common_hal_audiodelays_echo_deinit(audiodelays_echo_obj_t *self) {
8188
return;
8289
}
8390
self->echo_buffer = NULL;
84-
self->buffer = NULL;
91+
self->buffer[0] = NULL;
92+
self->buffer[1] = NULL;
8593
}
8694

8795

@@ -99,9 +107,9 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_o
99107

100108
if (self->echo_buffer_read_pos > max_ebuf_length) {
101109
self->echo_buffer_read_pos = 0;
102-
self->echo_buffer_write_pos = max_ebuf_length - (self->buffer_len / sizeof(uint32_t));
110+
self->echo_buffer_write_pos = max_ebuf_length - (self->buffer_len / sizeof(uint16_t));
103111
} else if (self->echo_buffer_write_pos > max_ebuf_length) {
104-
self->echo_buffer_read_pos = self->buffer_len / sizeof(uint32_t);
112+
self->echo_buffer_read_pos = self->buffer_len / sizeof(uint16_t);
105113
self->echo_buffer_write_pos = 0;
106114
}
107115
}
@@ -211,7 +219,8 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
211219
mp_float_t mix = MIN(1.0, MAX(synthio_block_slot_get(&self->mix), 0.0));
212220
mp_float_t decay = MIN(1.0, MAX(synthio_block_slot_get(&self->decay), 0.0));
213221

214-
int16_t *word_buffer = (int16_t *)self->buffer;
222+
self->last_buf_idx = !self->last_buf_idx;
223+
int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx];
215224
uint32_t length = self->buffer_len / sizeof(uint16_t);
216225
int16_t *echo_buffer = (int16_t *)self->echo_buffer;
217226
uint32_t echo_buf_len = self->echo_buffer_len / sizeof(uint16_t);
@@ -338,15 +347,15 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
338347
}
339348
}
340349

341-
*buffer = (uint8_t *)self->buffer;
350+
*buffer = (uint8_t *)self->buffer[self->last_buf_idx];
342351
*buffer_length = self->buffer_len;
343352
return GET_BUFFER_MORE_DATA;
344353
}
345354

346355
void audiodelays_echo_get_buffer_structure(audiodelays_echo_obj_t *self, bool single_channel_output,
347356
bool *single_buffer, bool *samples_signed, uint32_t *max_buffer_length, uint8_t *spacing) {
348357

349-
*single_buffer = true;
358+
*single_buffer = false;
350359
*samples_signed = true;
351360
*max_buffer_length = self->buffer_len;
352361
if (single_channel_output) {

shared-module/audiodelays/Echo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ typedef struct {
2424
uint8_t channel_count;
2525
uint32_t sample_rate;
2626

27-
uint32_t *buffer;
27+
int8_t *buffer[2];
28+
uint8_t last_buf_idx;
2829
uint32_t buffer_len; // max buffer in bytes
2930

3031
uint32_t *sample_remaining_buffer;
@@ -33,7 +34,7 @@ typedef struct {
3334
bool loop;
3435
bool more_data;
3536

36-
uint32_t *echo_buffer;
37+
int8_t *echo_buffer;
3738
uint32_t echo_buffer_len; // bytes
3839
uint32_t max_echo_buffer_len; // bytes
3940

0 commit comments

Comments
 (0)