@@ -40,10 +40,10 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
40
40
switch (bitsPerSample) {
41
41
case 8 :
42
42
case 16 :
43
- case 24 :
44
43
case 32 :
45
44
break ;
46
45
46
+ case 24 :
47
47
default :
48
48
Serial.println (" invalid bits per sample" );
49
49
return 1 ;
@@ -234,10 +234,54 @@ void I2SClass::flush()
234
234
235
235
size_t I2SClass::write (uint8_t data)
236
236
{
237
- return write (&data, sizeof (data) );
237
+ return write (( int32_t )data );
238
238
}
239
239
240
240
size_t I2SClass::write (const uint8_t *buffer, size_t size)
241
+ {
242
+ return write ((const void *)buffer, size);
243
+ }
244
+
245
+ size_t I2SClass::availableForWrite ()
246
+ {
247
+ int space = 0 ;
248
+
249
+ __disable_irq ();
250
+
251
+ space = (I2S_BUFFER_SIZE - _i_buffer_length[_i_buffer_index]);
252
+
253
+ __enable_irq ();
254
+
255
+ return space;
256
+ }
257
+
258
+ size_t I2SClass::write (int sample)
259
+ {
260
+ return write ((int32_t )sample);
261
+ }
262
+
263
+ size_t I2SClass::write (int32_t sample)
264
+ {
265
+ if (_uc_index == 0 ) {
266
+ while (!_i2s->INTFLAG .bit .TXRDY0 );
267
+ while (_i2s->SYNCBUSY .bit .DATA0 );
268
+ } else {
269
+ while (!_i2s->INTFLAG .bit .TXRDY1 );
270
+ while (_i2s->SYNCBUSY .bit .DATA1 );
271
+ }
272
+
273
+ _i2s->DATA [_uc_index].bit .DATA = sample;
274
+
275
+ if (_uc_index == 0 ) {
276
+ _i2s->INTFLAG .bit .TXRDY0 = 1 ;
277
+ } else {
278
+ _i2s->INTFLAG .bit .TXRDY1 = 1 ;
279
+ }
280
+
281
+ return 1 ;
282
+ }
283
+
284
+ size_t I2SClass::write (const void *buffer, size_t size)
241
285
{
242
286
__disable_irq ();
243
287
@@ -246,7 +290,7 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
246
290
size = space;
247
291
}
248
292
249
- if (space == 0 ) {
293
+ if (size == 0 ) {
250
294
__enable_irq ();
251
295
return 0 ;
252
296
}
@@ -271,19 +315,6 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
271
315
return size;
272
316
}
273
317
274
- size_t I2SClass::availableForWrite ()
275
- {
276
- int space = 0 ;
277
-
278
- __disable_irq ();
279
-
280
- space = (I2S_BUFFER_SIZE - _i_buffer_length[_i_buffer_index]);
281
-
282
- __enable_irq ();
283
-
284
- return space;
285
- }
286
-
287
318
void I2SClass::onTransmit (void (*function)(void ))
288
319
{
289
320
_onTransmit = function;
@@ -312,6 +343,8 @@ void I2SClass::onTransferComplete(void)
312
343
_i_buffer_index = 0 ;
313
344
}
314
345
_i_buffer_length[_i_buffer_index] = 0 ;
346
+ } else {
347
+ _b_dma_transfer_in_progress = false ;
315
348
}
316
349
317
350
if (_onTransmit) {
0 commit comments