@@ -86,10 +86,11 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
8686
8787 // calculate current echo buffer size we use for the given delay
8888 mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
89+ self -> current_delay_ms = f_delay_ms ;
8990 self -> echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * (self -> channel_count * sizeof (uint16_t ));
9091
91- // read is where we store the incoming sample + previous echo
92- // write is what we send to the outgoing buffer
92+ // read is where we read previous echo from delay_ms ago to play back now
93+ // write is where the store the latest playing sample to echo back later
9394 self -> echo_buffer_read_pos = self -> buffer_len / sizeof (uint16_t );
9495 self -> echo_buffer_write_pos = 0 ;
9596}
@@ -119,17 +120,24 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_o
119120 synthio_block_assign_slot (delay_ms , & self -> delay_ms , MP_QSTR_delay_ms );
120121
121122 mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
122- self -> echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * (self -> channel_count * 2 );// (self->bits_per_sample / 8));
123123
124- uint32_t max_ebuf_length = self -> echo_buffer_len / sizeof (uint16_t );
124+ recalculate_delay (self , f_delay_ms );
125+ }
126+
127+ void recalculate_delay (audiodelays_echo_obj_t * self , mp_float_t f_delay_ms ) {
128+ // Calculate the current echo buffer length in bytes
125129
126- if (self -> echo_buffer_read_pos > max_ebuf_length ) {
127- self -> echo_buffer_read_pos = 0 ;
128- self -> echo_buffer_write_pos = max_ebuf_length - (self -> buffer_len / sizeof (uint16_t ));
129- } else if (self -> echo_buffer_write_pos > max_ebuf_length ) {
130- self -> echo_buffer_read_pos = self -> buffer_len / sizeof (uint16_t );
131- self -> echo_buffer_write_pos = 0 ;
130+ uint32_t new_echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * sizeof (uint16_t );
131+
132+ // Check if our new echo is too long for our maximum buffer
133+ if (new_echo_buffer_len > self -> max_echo_buffer_len ) {
134+ return ;
135+ } else if (new_echo_buffer_len < 0.0 ) { // or too short!
136+ return ;
132137 }
138+
139+ self -> echo_buffer_len = new_echo_buffer_len ;
140+ self -> current_delay_ms = f_delay_ms ;
133141}
134142
135143mp_obj_t common_hal_audiodelays_echo_get_decay (audiodelays_echo_obj_t * self ) {
@@ -250,6 +258,11 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
250258 mp_float_t mix = MIN (1.0 , MAX (synthio_block_slot_get (& self -> mix ), 0.0 ));
251259 mp_float_t decay = MIN (1.0 , MAX (synthio_block_slot_get (& self -> decay ), 0.0 ));
252260
261+ uint32_t delay_ms = (uint32_t )synthio_block_slot_get (& self -> delay_ms );
262+ if (self -> current_delay_ms != delay_ms ) {
263+ recalculate_delay (self , delay_ms );
264+ }
265+
253266 // Switch our buffers to the other buffer
254267 self -> last_buf_idx = !self -> last_buf_idx ;
255268
0 commit comments