Skip to content

Commit c7e87cf

Browse files
committed
Remove unnecessary double buffer on filter_buffer.
1 parent e7c02bd commit c7e87cf

File tree

2 files changed

+13
-28
lines changed

2 files changed

+13
-28
lines changed

shared-module/audiofilters/Filter.c

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,12 @@ void common_hal_audiofilters_filter_construct(audiofilters_filter_obj_t *self,
4444
self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1
4545

4646
// This buffer will be used to process samples through the biquad filter
47-
self->filter_buffer[0] = m_malloc(SYNTHIO_MAX_DUR * sizeof(int32_t));
48-
if (self->filter_buffer[0] == NULL) {
47+
self->filter_buffer = m_malloc(SYNTHIO_MAX_DUR * sizeof(int32_t));
48+
if (self->filter_buffer == NULL) {
4949
common_hal_audiofilters_filter_deinit(self);
5050
m_malloc_fail(SYNTHIO_MAX_DUR * sizeof(int32_t));
5151
}
52-
memset(self->filter_buffer[0], 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
53-
54-
// This buffer will be used to mix original sample with processed signal
55-
self->filter_buffer[1] = m_malloc(SYNTHIO_MAX_DUR * sizeof(int32_t));
56-
if (self->filter_buffer[1] == NULL) {
57-
common_hal_audiofilters_filter_deinit(self);
58-
m_malloc_fail(SYNTHIO_MAX_DUR * sizeof(int32_t));
59-
}
60-
memset(self->filter_buffer[1], 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
52+
memset(self->filter_buffer, 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
6153

6254
// Initialize other values most effects will need.
6355
self->sample = NULL; // The current playing sample
@@ -94,8 +86,7 @@ void common_hal_audiofilters_filter_deinit(audiofilters_filter_obj_t *self) {
9486
}
9587
self->buffer[0] = NULL;
9688
self->buffer[1] = NULL;
97-
self->filter_buffer[0] = NULL;
98-
self->filter_buffer[1] = NULL;
89+
self->filter_buffer = NULL;
9990
}
10091

10192
mp_obj_t common_hal_audiofilters_filter_get_filter(audiofilters_filter_obj_t *self) {
@@ -133,8 +124,7 @@ void audiofilters_filter_reset_buffer(audiofilters_filter_obj_t *self,
133124

134125
memset(self->buffer[0], 0, self->buffer_len);
135126
memset(self->buffer[1], 0, self->buffer_len);
136-
memset(self->filter_buffer[0], 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
137-
memset(self->filter_buffer[1], 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
127+
memset(self->filter_buffer, 0, SYNTHIO_MAX_DUR * sizeof(int32_t));
138128

139129
synthio_biquad_filter_reset(&self->filter_state);
140130
}
@@ -274,37 +264,32 @@ audioio_get_buffer_result_t audiofilters_filter_get_buffer(audiofilters_filter_o
274264
// Fill filter buffer with samples
275265
for (uint32_t j = 0; j < n_samples; j++) {
276266
if (MP_LIKELY(self->bits_per_sample == 16)) {
277-
self->filter_buffer[0][j] = sample_src[i + j];
267+
self->filter_buffer[j] = sample_src[i + j];
278268
} else {
279269
if (self->samples_signed) {
280-
self->filter_buffer[0][j] = sample_hsrc[i + j];
270+
self->filter_buffer[j] = sample_hsrc[i + j];
281271
} else {
282272
// Be careful here changing from an 8 bit unsigned to signed into a 32-bit signed
283-
self->filter_buffer[0][j] = (int8_t)(((uint8_t)sample_hsrc[i + j]) ^ 0x80);
273+
self->filter_buffer[j] = (int8_t)(((uint8_t)sample_hsrc[i + j]) ^ 0x80);
284274
}
285275
}
286276
}
287277

288-
// Copy original signal for mixing back in later
289-
memcpy(self->filter_buffer[1], self->filter_buffer[0], n_samples);
290-
291278
// Process biquad filter
292-
synthio_biquad_filter_samples(&self->filter_state, self->filter_buffer[0], n_samples);
279+
synthio_biquad_filter_samples(&self->filter_state, self->filter_buffer, n_samples);
293280

294281
// Mix processed signal with original sample and transfer to output buffer
295282
for (uint32_t j = 0; j < n_samples; j++) {
296-
int32_t word = (self->filter_buffer[1][j] * (1.0 - mix)) + (self->filter_buffer[0][j] * mix);
297283
if (MP_LIKELY(self->bits_per_sample == 16)) {
298-
word_buffer[i + j] = mix_down_sample(word);
284+
word_buffer[i + j] = mix_down_sample((sample_src[i + j] * (1.0 - mix)) + (self->filter_buffer[j] * mix));
299285
if (!self->samples_signed) {
300286
word_buffer[i + j] ^= 0x8000;
301287
}
302288
} else {
303-
int8_t mixed = word;
304289
if (self->samples_signed) {
305-
hword_buffer[i + j] = mixed;
290+
hword_buffer[i + j] = (int8_t)((sample_hsrc[i + j] * (1.0 - mix)) + (self->filter_buffer[j] * mix));
306291
} else {
307-
hword_buffer[i + j] = (uint8_t)mixed ^ 0x80;
292+
hword_buffer[i + j] = (uint8_t)(((int8_t)(((uint8_t)sample_hsrc[i + j]) ^ 0x80) * (1.0 - mix)) + (self->filter_buffer[j] * mix)) ^ 0x80;
308293
}
309294
}
310295
}

shared-module/audiofilters/Filter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ typedef struct {
3232
uint8_t *sample_remaining_buffer;
3333
uint32_t sample_buffer_length;
3434

35-
int32_t *filter_buffer[2];
35+
int32_t *filter_buffer;
3636

3737
bool loop;
3838
bool more_data;

0 commit comments

Comments
 (0)