@@ -68,14 +68,14 @@ class I2SDriverSTM32 {
68
68
// / we assume the data is already available in the buffer
69
69
int available () {
70
70
if (!active) return 0 ;
71
- if (use_dma) return p_rx_buffer == nullptr ? 0 : cfg. buffer_size ;
71
+ if (use_dma && p_rx_buffer == nullptr ) return 0 ;
72
72
return cfg.buffer_size ;
73
73
}
74
74
75
75
// / We limit the write size to the buffer size
76
76
int availableForWrite () {
77
77
if (!active) return 0 ;
78
- if (use_dma) return p_tx_buffer == nullptr ? 0 : cfg. buffer_size ;
78
+ if (use_dma && p_tx_buffer == nullptr ) return 0 ;
79
79
return cfg.buffer_size ;
80
80
}
81
81
@@ -150,22 +150,15 @@ class I2SDriverSTM32 {
150
150
} else {
151
151
// get data from buffer
152
152
if (self->stm32_write_active ) {
153
- // if we risk an onderflow we force the execution of the loop
154
- if (self->p_tx_buffer ->available () < byteCount) {
155
- loop ();
156
- }
157
153
read = self->p_tx_buffer ->readArray (buffer, byteCount);
158
- } else {
159
- // force execution of loop to fill buffer;
160
- loop ();
161
- }
154
+ }
162
155
}
163
156
164
157
// check for underflow
165
- count++;
166
- if (read != byteCount) {
167
- LOGW (" Buffer undeflow at %lu: %d for %d" , count, read, byteCount);
168
- }
158
+ // count++;
159
+ // if (read != byteCount) {
160
+ // LOGW("Buffer undeflow at %lu: %d for %d", count, read, byteCount);
161
+ // }
169
162
}
170
163
171
164
// / Checks if timout has been activated and if so, if it is timed out
@@ -196,7 +189,7 @@ class I2SDriverSTM32 {
196
189
bool result = true ;
197
190
BaseBuffer<uint8_t > *p_tx_buffer = nullptr ;
198
191
BaseBuffer<uint8_t > *p_rx_buffer = nullptr ;
199
- bool stm32_write_active = false ;
192
+ volatile bool stm32_write_active = false ;
200
193
bool use_dma = true ;
201
194
Print *p_dma_out = nullptr ;
202
195
Stream *p_dma_in = nullptr ;
@@ -211,7 +204,8 @@ class I2SDriverSTM32 {
211
204
result += actual_written;
212
205
open -= actual_written;
213
206
if (open > 0 ) {
214
- delay (10 );
207
+ stm32_write_active = true ;
208
+ delay (1 );
215
209
}
216
210
}
217
211
@@ -220,6 +214,7 @@ class I2SDriverSTM32 {
220
214
stm32_write_active = true ;
221
215
LOGI (" Buffer is full->starting i2s output" );
222
216
}
217
+
223
218
return size_bytes;
224
219
}
225
220
@@ -259,31 +254,28 @@ class I2SDriverSTM32 {
259
254
switch (cfg.rx_tx_mode ) {
260
255
case RX_MODE:
261
256
if (use_dma && p_rx_buffer == nullptr )
262
- p_rx_buffer = new NBuffer< uint8_t >(cfg. buffer_size , cfg. buffer_count );
257
+ p_rx_buffer = allocateBuffer ( );
263
258
result = i2s.beginReadDMA (i2s_stm32, writeFromReceive);
264
259
break ;
265
260
case TX_MODE:
266
261
stm32_write_active = false ;
267
262
if (use_dma && p_tx_buffer == nullptr )
268
- p_tx_buffer = new NBuffer< uint8_t >(cfg. buffer_size , cfg. buffer_count );
263
+ p_tx_buffer = allocateBuffer ( );
269
264
result = i2s.beginWriteDMA (i2s_stm32, readToTransmit);
270
265
break ;
271
266
272
- #ifdef IS_READWRITE
273
267
case RXTX_MODE:
274
268
if (use_dma) {
275
269
stm32_write_active = false ;
276
270
if (p_rx_buffer == nullptr )
277
- p_rx_buffer =
278
- new NBuffer<uint8_t >(cfg.buffer_size , cfg.buffer_count );
271
+ p_rx_buffer = allocateBuffer ();
279
272
if (p_tx_buffer == nullptr )
280
- p_tx_buffer =
281
- new NBuffer<uint8_t >(cfg.buffer_size , cfg.buffer_count );
273
+ p_tx_buffer = allocateBuffer ();
282
274
}
283
275
result = i2s.beginReadWriteDMA (
284
276
i2s_stm32, readToTransmit, writeFromReceive);
285
277
break ;
286
- # endif
278
+
287
279
default :
288
280
LOGE (" Unsupported mode" );
289
281
return false ;
@@ -319,11 +311,9 @@ class I2SDriverSTM32 {
319
311
i2s_stm32.data_format = toDataFormat (cfg.bits_per_sample );
320
312
i2s_stm32.mode = getMode (cfg);
321
313
i2s_stm32.standard = getStandard (cfg);
322
- #ifdef I2S_FULLDUPLEXMODE_ENABLE
323
314
i2s_stm32.fullduplexmode = cfg.rx_tx_mode == RXTX_MODE
324
315
? I2S_FULLDUPLEXMODE_ENABLE
325
316
: I2S_FULLDUPLEXMODE_DISABLE;
326
- #endif
327
317
i2s_stm32.hardware_config .buffer_size = cfg.buffer_size ;
328
318
// provide ourself as parameter to callback
329
319
i2s_stm32.ref = this ;
@@ -412,6 +402,10 @@ class I2SDriverSTM32 {
412
402
LOGD (" writeBytesExt: %u" , result)
413
403
return result;
414
404
}
405
+
406
+ BaseBuffer<uint8_t >* allocateBuffer () {
407
+ return new RingBuffer<uint8_t >(cfg.buffer_size * cfg.buffer_count );
408
+ }
415
409
};
416
410
417
411
using I2SDriver = I2SDriverSTM32;
0 commit comments