@@ -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
10192mp_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 }
0 commit comments