10
10
#include "shared-module/audiomixer/utils.h"
11
11
12
12
13
- void common_hal_audiodelays_echo_construct (audiodelays_echo_obj_t * self , uint32_t delay_ms , mp_float_t decay , mp_obj_t mix ,
13
+ void common_hal_audiodelays_echo_construct (audiodelays_echo_obj_t * self , uint32_t max_delay_ms ,
14
+ mp_obj_t delay_ms , mp_obj_t decay , mp_obj_t mix ,
14
15
uint32_t buffer_size , uint8_t bits_per_sample ,
15
16
bool samples_signed , uint8_t channel_count , uint32_t sample_rate ) {
16
17
@@ -19,7 +20,6 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
19
20
self -> channel_count = channel_count ;
20
21
self -> sample_rate = sample_rate ;
21
22
22
- // check that buffer_size <= echo_buffer_size
23
23
self -> buffer_len = buffer_size ;
24
24
self -> buffer = m_malloc (self -> buffer_len );
25
25
if (self -> buffer == NULL ) {
@@ -28,23 +28,34 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
28
28
}
29
29
memset (self -> buffer , 0 , self -> buffer_len );
30
30
31
- self -> decay = (uint16_t )(decay * (1 << 15 ));
31
+ if (decay == MP_OBJ_NULL ) {
32
+ decay = mp_obj_new_float (0.7 );
33
+ }
34
+ synthio_block_assign_slot (decay , & self -> decay , MP_QSTR_decay );
35
+
36
+ if (delay_ms == MP_OBJ_NULL ) {
37
+ delay_ms = mp_obj_new_float (0.05 );
38
+ }
39
+ synthio_block_assign_slot (delay_ms , & self -> delay_ms , MP_QSTR_delay_ms );
32
40
33
41
if (mix == MP_OBJ_NULL ) {
34
42
mix = mp_obj_new_float (0.5 );
35
43
}
36
44
synthio_block_assign_slot (mix , & self -> mix , MP_QSTR_mix );
37
45
38
46
// calculate buffer size for the set delay
39
- self -> delay_ms = delay_ms ;
40
- self -> echo_buffer_len = self -> sample_rate / 1000.0f * self -> delay_ms * (self -> channel_count * (self -> bits_per_sample / 8 ));
47
+ mp_float_t f_delay_ms = synthio_block_slot_get ( & self -> delay_ms ) ;
48
+ self -> echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * (self -> channel_count * (self -> bits_per_sample / 8 ));
41
49
42
- self -> echo_buffer = m_malloc (self -> echo_buffer_len );
50
+ // Set the echo buffer for the max possible delay
51
+ self -> max_delay_ms = max_delay_ms ;
52
+ self -> max_echo_buffer_len = self -> sample_rate / 1000.0f * max_delay_ms * (self -> channel_count * (self -> bits_per_sample / 8 ));
53
+ self -> echo_buffer = m_malloc (self -> max_echo_buffer_len );
43
54
if (self -> echo_buffer == NULL ) {
44
55
common_hal_audiodelays_echo_deinit (self );
45
- m_malloc_fail (self -> echo_buffer_len );
56
+ m_malloc_fail (self -> max_echo_buffer_len );
46
57
}
47
- memset (self -> echo_buffer , 0 , self -> echo_buffer_len );
58
+ memset (self -> echo_buffer , 0 , self -> max_echo_buffer_len );
48
59
49
60
// read is where we store the incoming sample
50
61
// write is what we send to the outgoing buffer
@@ -74,19 +85,15 @@ void common_hal_audiodelays_echo_deinit(audiodelays_echo_obj_t *self) {
74
85
}
75
86
76
87
77
- uint32_t common_hal_audiodelays_echo_get_delay_ms (audiodelays_echo_obj_t * self ) {
78
- return self -> delay_ms ;
88
+ mp_obj_t common_hal_audiodelays_echo_get_delay_ms (audiodelays_echo_obj_t * self ) {
89
+ return self -> delay_ms . obj ;
79
90
}
80
91
81
- void common_hal_audiodelays_echo_set_delay_ms (audiodelays_echo_obj_t * self , uint32_t delay_ms ) {
82
- self -> delay_ms = delay_ms ;
83
- self -> echo_buffer_len = self -> sample_rate / 1000.0f * self -> delay_ms * (self -> channel_count * (self -> bits_per_sample / 8 ));
92
+ void common_hal_audiodelays_echo_set_delay_ms (audiodelays_echo_obj_t * self , mp_obj_t delay_ms ) {
93
+ synthio_block_assign_slot (delay_ms , & self -> delay_ms , MP_QSTR_delay_ms );
84
94
85
- self -> echo_buffer = m_realloc (self -> echo_buffer , self -> echo_buffer_len );
86
- if (self -> echo_buffer == NULL ) {
87
- common_hal_audiodelays_echo_deinit (self );
88
- m_malloc_fail (self -> echo_buffer_len );
89
- }
95
+ mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
96
+ self -> echo_buffer_len = self -> sample_rate / 1000.0f * f_delay_ms * (self -> channel_count * (self -> bits_per_sample / 8 ));
90
97
91
98
uint32_t max_ebuf_length = self -> echo_buffer_len / sizeof (uint32_t );
92
99
@@ -99,12 +106,12 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, uint
99
106
}
100
107
}
101
108
102
- mp_float_t common_hal_audiodelays_echo_get_decay (audiodelays_echo_obj_t * self ) {
103
- return ( mp_float_t ) self -> decay / ( 1 << 15 ) ;
109
+ mp_obj_t common_hal_audiodelays_echo_get_decay (audiodelays_echo_obj_t * self ) {
110
+ return self -> decay . obj ;
104
111
}
105
112
106
- void common_hal_audiodelays_echo_set_decay (audiodelays_echo_obj_t * self , mp_float_t decay ) {
107
- self -> decay = ( uint16_t )( decay * ( 1 << 15 ) );
113
+ void common_hal_audiodelays_echo_set_decay (audiodelays_echo_obj_t * self , mp_obj_t decay ) {
114
+ synthio_block_assign_slot ( decay , & self -> decay , MP_QSTR_decay );
108
115
}
109
116
110
117
mp_obj_t common_hal_audiodelays_echo_get_mix (audiodelays_echo_obj_t * self ) {
@@ -169,8 +176,6 @@ void common_hal_audiodelays_echo_play(audiodelays_echo_obj_t *self, mp_obj_t sam
169
176
170
177
void common_hal_audiodelays_echo_stop (audiodelays_echo_obj_t * self ) {
171
178
self -> sample = NULL ;
172
- // memset(self->echo_buffer, 0, self->echo_buffer_len); // clear echo
173
- // memset(self->buffer, 0, self->buffer_len);
174
179
return ;
175
180
}
176
181
@@ -188,6 +193,14 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
188
193
}
189
194
uint16_t mix = (uint16_t )(f_mix * (1 << 15 ));
190
195
196
+ mp_float_t f_decay = synthio_block_slot_get (& self -> decay );
197
+ if (f_decay > 1.0 ) {
198
+ f_decay = 1.0 ;
199
+ } else if (f_decay < 0.0 ) {
200
+ f_decay = 0.0 ;
201
+ }
202
+ uint16_t decay = (uint16_t )(f_decay * (1 << 15 ));
203
+
191
204
while (length != 0 ) {
192
205
if (self -> sample_buffer_length == 0 ) {
193
206
if (!self -> more_data ) {
@@ -219,7 +232,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
219
232
// sample signed/unsigned won't matter as we have no sample
220
233
for (uint32_t i = 0 ; i < length ; i ++ ) {
221
234
uint32_t echo = self -> echo_buffer [self -> echo_buffer_read_pos ++ ];
222
- word_buffer [i ] = mult16signed (echo , self -> decay );
235
+ word_buffer [i ] = mult16signed (echo , decay );
223
236
self -> echo_buffer [self -> echo_buffer_write_pos ++ ] = word_buffer [i ];
224
237
225
238
word_buffer [i ] = mult16signed (word_buffer [i ], mix );
@@ -238,7 +251,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
238
251
uint16_t * echo_hsrc = (uint16_t * )self -> echo_buffer ;
239
252
for (uint32_t i = 0 ; i < length * 2 ; i ++ ) {
240
253
uint32_t echo_word = unpack8 (echo_hsrc [i ]);
241
- echo_word = mult16signed (echo_word , self -> decay );
254
+ echo_word = mult16signed (echo_word , decay );
242
255
hword_buffer [i ] = pack8 (echo_word );
243
256
244
257
echo_hsrc [self -> echo_buffer_write_pos ++ ] = hword_buffer [i ];
@@ -267,7 +280,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
267
280
sample_word = tosigned16 (sample_word );
268
281
}
269
282
uint32_t echo = self -> echo_buffer [self -> echo_buffer_read_pos ++ ];
270
- word_buffer [i ] = add16signed (mult16signed (echo , self -> decay ), sample_word );
283
+ word_buffer [i ] = add16signed (mult16signed (echo , decay ), sample_word );
271
284
self -> echo_buffer [self -> echo_buffer_write_pos ++ ] = word_buffer [i ];
272
285
273
286
word_buffer [i ] = add16signed (mult16signed (sample_word , 32768 - mix ), mult16signed (word_buffer [i ], mix ));
@@ -290,7 +303,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
290
303
if (MP_LIKELY (!self -> samples_signed )) {
291
304
sample_word = tosigned16 (sample_word );
292
305
}
293
- echo_word = mult16signed (echo_word , self -> decay );
306
+ echo_word = mult16signed (echo_word , decay );
294
307
sample_word = add16signed (sample_word , echo_word );
295
308
hword_buffer [i ] = pack8 (sample_word );
296
309
0 commit comments