@@ -86,10 +86,11 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
86
86
87
87
// calculate current echo buffer size we use for the given delay
88
88
mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
89
+ self -> current_delay_ms = f_delay_ms ;
89
90
self -> echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * (self -> channel_count * sizeof (uint16_t ));
90
91
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
93
94
self -> echo_buffer_read_pos = self -> buffer_len / sizeof (uint16_t );
94
95
self -> echo_buffer_write_pos = 0 ;
95
96
}
@@ -119,17 +120,24 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_o
119
120
synthio_block_assign_slot (delay_ms , & self -> delay_ms , MP_QSTR_delay_ms );
120
121
121
122
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));
123
123
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
125
129
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 ;
132
137
}
138
+
139
+ self -> echo_buffer_len = new_echo_buffer_len ;
140
+ self -> current_delay_ms = f_delay_ms ;
133
141
}
134
142
135
143
mp_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 *
250
258
mp_float_t mix = MIN (1.0 , MAX (synthio_block_slot_get (& self -> mix ), 0.0 ));
251
259
mp_float_t decay = MIN (1.0 , MAX (synthio_block_slot_get (& self -> decay ), 0.0 ));
252
260
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
+
253
266
// Switch our buffers to the other buffer
254
267
self -> last_buf_idx = !self -> last_buf_idx ;
255
268
0 commit comments