Skip to content

Commit 7b6e56c

Browse files
committed
add back I2S single sample write method
1 parent 203b6d9 commit 7b6e56c

File tree

2 files changed

+52
-18
lines changed

2 files changed

+52
-18
lines changed

libraries/I2S/src/I2S.cpp

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

235235
size_t I2SClass::write(uint8_t data)
236236
{
237-
return write(&data, sizeof(data));
237+
return write((int32_t)data);
238238
}
239239

240240
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)
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-
287318
void 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) {

libraries/I2S/src/I2S.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ class I2SClass : public Stream
3131

3232
virtual size_t availableForWrite();
3333

34-
int write(int32_t);
34+
size_t write(int);
35+
size_t write(int32_t);
36+
size_t write(const void *buffer, size_t size);
3537

3638
void onReceive(void(*)(int));
3739
void onTransmit(void(*)(void));
3840

39-
4041
private:
4142
static void onDmaTransferComplete();
4243
static void onDmaTransferError();

0 commit comments

Comments
 (0)