@@ -44,20 +44,12 @@ void common_hal_audiofilters_filter_construct(audiofilters_filter_obj_t *self,
44
44
self -> last_buf_idx = 1 ; // Which buffer to use first, toggle between 0 and 1
45
45
46
46
// 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 ) {
49
49
common_hal_audiofilters_filter_deinit (self );
50
50
m_malloc_fail (SYNTHIO_MAX_DUR * sizeof (int32_t ));
51
51
}
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 ));
61
53
62
54
// Initialize other values most effects will need.
63
55
self -> sample = NULL ; // The current playing sample
@@ -94,8 +86,7 @@ void common_hal_audiofilters_filter_deinit(audiofilters_filter_obj_t *self) {
94
86
}
95
87
self -> buffer [0 ] = NULL ;
96
88
self -> buffer [1 ] = NULL ;
97
- self -> filter_buffer [0 ] = NULL ;
98
- self -> filter_buffer [1 ] = NULL ;
89
+ self -> filter_buffer = NULL ;
99
90
}
100
91
101
92
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,
133
124
134
125
memset (self -> buffer [0 ], 0 , self -> buffer_len );
135
126
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 ));
138
128
139
129
synthio_biquad_filter_reset (& self -> filter_state );
140
130
}
@@ -274,37 +264,32 @@ audioio_get_buffer_result_t audiofilters_filter_get_buffer(audiofilters_filter_o
274
264
// Fill filter buffer with samples
275
265
for (uint32_t j = 0 ; j < n_samples ; j ++ ) {
276
266
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 ];
278
268
} else {
279
269
if (self -> samples_signed ) {
280
- self -> filter_buffer [0 ][ j ] = sample_hsrc [i + j ];
270
+ self -> filter_buffer [j ] = sample_hsrc [i + j ];
281
271
} else {
282
272
// 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 );
284
274
}
285
275
}
286
276
}
287
277
288
- // Copy original signal for mixing back in later
289
- memcpy (self -> filter_buffer [1 ], self -> filter_buffer [0 ], n_samples );
290
-
291
278
// 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 );
293
280
294
281
// Mix processed signal with original sample and transfer to output buffer
295
282
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 );
297
283
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 ) );
299
285
if (!self -> samples_signed ) {
300
286
word_buffer [i + j ] ^= 0x8000 ;
301
287
}
302
288
} else {
303
- int8_t mixed = word ;
304
289
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 )) ;
306
291
} 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 ;
308
293
}
309
294
}
310
295
}
0 commit comments