@@ -85,6 +85,9 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
8585 }
8686 memset (self -> echo_buffer , 0 , self -> max_echo_buffer_len );
8787
88+ // calculate the length of a single sample in milliseconds
89+ self -> sample_ms = MICROPY_FLOAT_CONST (1000.0 ) / self -> sample_rate ;
90+
8891 // calculate everything needed for the current delay
8992 mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
9093 recalculate_delay (self , f_delay_ms );
@@ -127,6 +130,9 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_o
127130}
128131
129132void recalculate_delay (audiodelays_echo_obj_t * self , mp_float_t f_delay_ms ) {
133+ // Require that delay is at least 1 sample long
134+ f_delay_ms = MAX (f_delay_ms , self -> sample_ms );
135+
130136 if (self -> freq_shift ) {
131137 // Calculate the rate of iteration over the echo buffer with 8 sub-bits
132138 self -> echo_buffer_rate = (uint32_t )MAX (self -> max_delay_ms / f_delay_ms * MICROPY_FLOAT_CONST (256.0 ), MICROPY_FLOAT_CONST (1.0 ));
@@ -153,7 +159,7 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) {
153159 memset (self -> echo_buffer + self -> echo_buffer_len , 0 , self -> max_echo_buffer_len - self -> echo_buffer_len );
154160 }
155161
156- self -> current_delay_ms = ( uint32_t ) f_delay_ms ;
162+ self -> current_delay_ms = f_delay_ms ;
157163}
158164
159165mp_obj_t common_hal_audiodelays_echo_get_decay (audiodelays_echo_obj_t * self ) {
@@ -328,9 +334,9 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
328334 mp_float_t mix = synthio_block_slot_get_limited (& self -> mix , MICROPY_FLOAT_CONST (0.0 ), MICROPY_FLOAT_CONST (1.0 ));
329335 mp_float_t decay = synthio_block_slot_get_limited (& self -> decay , MICROPY_FLOAT_CONST (0.0 ), MICROPY_FLOAT_CONST (1.0 ));
330336
331- uint32_t delay_ms = ( uint32_t ) synthio_block_slot_get (& self -> delay_ms );
332- if (self -> current_delay_ms != delay_ms ) {
333- recalculate_delay (self , delay_ms );
337+ mp_float_t f_delay_ms = synthio_block_slot (& self -> delay_ms );
338+ if (MICROPY_FLOAT_C_FUN ( fabs )( self -> current_delay_ms - f_delay_ms ) >= self -> sample_ms ) {
339+ recalculate_delay (self , f_delay_ms );
334340 }
335341
336342 uint32_t echo_buf_len = self -> echo_buffer_len / sizeof (uint16_t );
0 commit comments