@@ -13,11 +13,14 @@ I2SClass::I2SClass(uint8_t uc_index, uint8_t uc_clock_generator, uint8_t uc_pinS
13
13
_uc_fs(uc_pinFS),
14
14
15
15
_i_dma_channel(-1 ),
16
- freeBuffers(2 ),
17
- inIndex(0 ),
16
+
17
+ _b_dma_transfer_in_progress(false ),
18
+ _i_buffer_index(0 ),
18
19
19
20
_onTransmit(NULL )
20
21
{
22
+ _i_buffer_length[0 ] = 0 ;
23
+ _i_buffer_length[1 ] = 0 ;
21
24
}
22
25
23
26
int I2SClass::begin (int mode, long sampleRate, int bitsPerSample, int driveClock)
@@ -238,26 +241,29 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
238
241
{
239
242
__disable_irq ();
240
243
241
- if (freeBuffers == 0 ) {
244
+ int space = (I2S_BUFFER_SIZE - _i_buffer_length[_i_buffer_index]);
245
+ if (size > space) {
246
+ size = space;
247
+ }
248
+
249
+ if (space == 0 ) {
242
250
__enable_irq ();
243
251
return 0 ;
244
252
}
245
253
246
- if (size > I2S_BUFFER_SIZE) {
247
- size = I2S_BUFFER_SIZE;
248
- }
254
+ memcpy (&_auc_buffer[_i_buffer_index][_i_buffer_length[_i_buffer_index]], buffer, size);
249
255
250
- freeBuffers--;
251
- memcpy (&_auc_buffer[inIndex], buffer, size);
256
+ _i_buffer_length[_i_buffer_index] += size;
252
257
253
- if (freeBuffers == 1 ) {
254
- DMA. transfer (_i_dma_channel, &_auc_buffer[inIndex], ( void *)&_i2s-> DATA [_uc_index]. reg , size) ;
255
- }
258
+ if (_b_dma_transfer_in_progress == false ) {
259
+ _b_dma_transfer_in_progress = true ;
260
+ DMA. transfer (_i_dma_channel, _auc_buffer[_i_buffer_index], ( void *)&_i2s-> DATA [_uc_index]. reg , _i_buffer_length[_i_buffer_index]);
256
261
257
- if (inIndex == 0 ) {
258
- inIndex = I2S_BUFFER_SIZE;
259
- } else {
260
- inIndex = 0 ;
262
+ if (_i_buffer_index == 0 ) {
263
+ _i_buffer_index = 1 ;
264
+ } else {
265
+ _i_buffer_index = 0 ;
266
+ }
261
267
}
262
268
263
269
__enable_irq ();
@@ -267,7 +273,15 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
267
273
268
274
size_t I2SClass::availableForWrite ()
269
275
{
270
- return (freeBuffers * I2S_BUFFER_SIZE);
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;
271
285
}
272
286
273
287
void I2SClass::onTransmit (void (*function)(void ))
@@ -287,18 +301,19 @@ void I2SClass::onDmaTransferError()
287
301
288
302
void I2SClass::onTransferComplete (void )
289
303
{
290
- freeBuffers++ ;
304
+ int nextTransferLength = _i_buffer_length[_i_buffer_index] ;
291
305
292
- int outIndex;
306
+ if (nextTransferLength) {
307
+ DMA.transfer (_i_dma_channel, _auc_buffer[_i_buffer_index], (void *)&_i2s->DATA [_uc_index].reg , nextTransferLength);
293
308
294
- if (inIndex == 0 ) {
295
- outIndex = I2S_BUFFER_SIZE;
296
- } else {
297
- outIndex = 0 ;
309
+ if (_i_buffer_index == 0 ) {
310
+ _i_buffer_index = 1 ;
311
+ } else {
312
+ _i_buffer_index = 0 ;
313
+ }
314
+ _i_buffer_length[_i_buffer_index] = 0 ;
298
315
}
299
316
300
- DMA.transfer (_i_dma_channel, &_auc_buffer[outIndex], (void *)&_i2s->DATA [_uc_index].reg , 512 );
301
-
302
317
if (_onTransmit) {
303
318
_onTransmit ();
304
319
}
0 commit comments