22
22
#include " freertos/semphr.h"
23
23
24
24
#define _I2S_EVENT_QUEUE_LENGTH 100
25
-
26
25
#define _I2S_DMA_BUFFER_SIZE 512 // BUFFER SIZE must be between 8 and 1024
27
- #define _I2S_DMA_BUFFER_COUNT 8 // BUFFER count must be between 2 and 128
26
+ #define _I2S_DMA_BUFFER_COUNT 8 // BUFFER COUNT must be between 2 and 128
28
27
29
28
#define I2S_INTERFACES_COUNT SOC_I2S_NUM
30
29
@@ -444,28 +443,27 @@ int I2SClass::read()
444
443
return 0 ;
445
444
}
446
445
447
- int I2SClass::read (void * buffer, size_t size)
448
- {
446
+ int I2SClass::read (void * buffer, size_t size){
449
447
if (_state != I2S_STATE_RECEIVER && _state != I2S_STATE_DUPLEX) {
450
448
if (!enableReceiver ()){
451
449
return 0 ; // There was an error switching to receiver
452
450
}
453
451
}
454
- // int read ;
452
+ size_t cpy_size = 0 ;
455
453
// esp_i2s::i2s_read((esp_i2s::i2s_port_t) _deviceIndex, buffer, size, (size_t*) &read, 0);
456
- size_t cpy_size = size <= _read_available ? size : _read_available;
457
454
// if(_in_buf_semaphore != NULL && xSemaphoreTake(_in_buf_semaphore, portMAX_DELAY) == pdTRUE){
458
455
if (_in_buf_semaphore != NULL && xSemaphoreTake (_in_buf_semaphore, 10 ) == pdTRUE){
459
- memcpy (buffer, _inputBuffer, cpy_size) ;
460
- xSemaphoreGive (_in_buf_semaphore );
456
+ cpy_size = size <= _read_available ? size : _read_available ;
457
+ memcpy (buffer, ( void *)(( uint )_inputBuffer+_input_buffer_pointer), cpy_size );
461
458
_input_buffer_pointer = (_input_buffer_pointer + cpy_size) > _buffer_byte_size ? _buffer_byte_size : _input_buffer_pointer + cpy_size;
462
459
_read_available -= cpy_size;
460
+ xSemaphoreGive (_in_buf_semaphore);
463
461
}
464
- if (_mode == I2S_ADC_DAC){
465
- for (int i = 0 ; i < cpy_size / 2 ; ++i){
462
+ if (_mode == I2S_ADC_DAC){
463
+ for (size_t i = 0 ; i < cpy_size / 2 ; ++i){
466
464
((uint16_t *)buffer)[i] = ((uint16_t *)buffer)[i] & 0x0FFF ;
467
465
}
468
- }
466
+ } // ADC/DAC mode
469
467
return cpy_size;
470
468
}
471
469
@@ -494,7 +492,6 @@ size_t I2SClass::write(const void *buffer, size_t size)
494
492
if (_out_buf_semaphore != NULL && xSemaphoreTake (_out_buf_semaphore, portMAX_DELAY) == pdTRUE){
495
493
memcpy ((void *)((uint )_outputBuffer+_output_buffer_pointer), buffer, cpy_size);
496
494
xSemaphoreGive (_out_buf_semaphore);
497
- }else {
498
495
}
499
496
_output_buffer_pointer = (_output_buffer_pointer + cpy_size) > _buffer_byte_size ? _output_buffer_pointer : _output_buffer_pointer + cpy_size;
500
497
return bytes_written;
@@ -616,7 +613,7 @@ void I2SClass::onTransferComplete()
616
613
if (_in_buf_semaphore != NULL && xSemaphoreTake (_in_buf_semaphore, 10 ) == pdTRUE){
617
614
esp_i2s::i2s_read ((esp_i2s::i2s_port_t ) _deviceIndex, _inputBuffer, _buffer_byte_size, (size_t *) &_read_available, 0 );
618
615
_input_buffer_pointer = 0 ;
619
- if (xSemaphoreGive (_in_buf_semaphore) != pdTRUE){ // CRASHING HERE on first call
616
+ if (xSemaphoreGive (_in_buf_semaphore) != pdTRUE){
620
617
// We would not expect this call to fail because we must have
621
618
// obtained the semaphore to get here.
622
619
}
@@ -634,13 +631,7 @@ void I2SClass::onTransferComplete()
634
631
void I2SClass::onDmaTransferComplete (void *)
635
632
{
636
633
637
- #ifdef _USE_SYS_VIEW
638
- SEGGER_SYSVIEW_Print (" onTransferComplete start" );
639
- #endif // _USE_SYS_VIEW
640
634
I2S.onTransferComplete ();
641
- #ifdef _USE_SYS_VIEW
642
- SEGGER_SYSVIEW_Print (" onTransferComplete stop" );
643
- #endif // _USE_SYS_VIEW
644
635
}
645
636
646
637
#if I2S_INTERFACES_COUNT > 0
@@ -651,4 +642,4 @@ void I2SClass::onDmaTransferComplete(void*)
651
642
#if I2S_INTERFACES_COUNT > 1
652
643
// TODO set default pins for second module
653
644
// I2SClass I2S1(I2S_DEVICE+1, I2S_CLOCK_GENERATOR, PIN_I2S_SD, PIN_I2S_SCK, PIN_I2S_FS); // default - half duplex
654
- #endif
645
+ #endif
0 commit comments