@@ -275,12 +275,14 @@ int I2SClass::read(void* buffer, size_t size)
275
275
{
276
276
uint32_t xf_offset, xf_index, xf_count;
277
277
278
- if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_RECEIVE))) {
279
- return 0 ;
278
+ if (_state != I2S_STATE_RECEIVE) {
279
+ if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_RECEIVE))) {
280
+ return 0 ;
281
+ }
282
+
283
+ _state = I2S_STATE_RECEIVE;
280
284
}
281
285
282
- _state = I2S_STATE_RECEIVE;
283
-
284
286
if (!_xf_active)
285
287
{
286
288
xf_offset = _xf_offset;
@@ -376,24 +378,38 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
376
378
377
379
size_t I2SClass::write (int sample)
378
380
{
379
- return write ((const void *)& sample, (_width / 8 ) );
381
+ return write ((int32_t ) sample);
380
382
}
381
383
382
384
size_t I2SClass::write (int32_t sample)
383
385
{
384
- return write ((const void *)&sample, (_width / 8 ));
386
+ if (_state != I2S_STATE_TRANSMIT) {
387
+ if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_TRANSMIT))) {
388
+ return 0 ;
389
+ }
390
+
391
+ _state = I2S_STATE_TRANSMIT;
392
+ }
393
+
394
+ while (!write ((const void *)&sample, (_width / 8 ))) {
395
+ armv7m_core_yield ();
396
+ }
397
+
398
+ return 1 ;
385
399
}
386
400
387
401
size_t I2SClass::write (const void *buffer, size_t size)
388
402
{
389
403
uint32_t xf_offset, xf_index, xf_count;
390
404
391
- if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_TRANSMIT))) {
392
- return 0 ;
405
+ if (_state != I2S_STATE_TRANSMIT) {
406
+ if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_TRANSMIT))) {
407
+ return 0 ;
408
+ }
409
+
410
+ _state = I2S_STATE_TRANSMIT;
393
411
}
394
412
395
- _state = I2S_STATE_TRANSMIT;
396
-
397
413
if (_width == 32 ) { size &= ~3 ; }
398
414
else if (_width == 16 ) { size &= ~1 ; }
399
415
0 commit comments