@@ -40,10 +40,10 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
4040 switch (bitsPerSample) {
4141 case 8 :
4242 case 16 :
43- case 24 :
4443 case 32 :
4544 break ;
4645
46+ case 24 :
4747 default :
4848 Serial.println (" invalid bits per sample" );
4949 return 1 ;
@@ -234,10 +234,54 @@ void I2SClass::flush()
234234
235235size_t I2SClass::write (uint8_t data)
236236{
237- return write (&data, sizeof (data) );
237+ return write (( int32_t )data );
238238}
239239
240240size_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)
241285{
242286 __disable_irq ();
243287
@@ -246,7 +290,7 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
246290 size = space;
247291 }
248292
249- if (space == 0 ) {
293+ if (size == 0 ) {
250294 __enable_irq ();
251295 return 0 ;
252296 }
@@ -271,19 +315,6 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
271315 return size;
272316}
273317
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-
287318void I2SClass::onTransmit (void (*function)(void ))
288319{
289320 _onTransmit = function;
@@ -312,6 +343,8 @@ void I2SClass::onTransferComplete(void)
312343 _i_buffer_index = 0 ;
313344 }
314345 _i_buffer_length[_i_buffer_index] = 0 ;
346+ } else {
347+ _b_dma_transfer_in_progress = false ;
315348 }
316349
317350 if (_onTransmit) {
0 commit comments