Skip to content

Commit baff65d

Browse files
committed
[BUGFIX] Fixed usage of new buffer in read function
1 parent ad2c540 commit baff65d

File tree

2 files changed

+13
-22
lines changed

2 files changed

+13
-22
lines changed

Diff for: libraries/I2S/examples/InputSerialPlotter/InputSerialPlotter.ino

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ void setup() {
3232
Serial.println("Failed to initialize I2S!");
3333
while (1); // do nothing
3434
}
35+
I2S.setAllPins(27,25,33,26);
3536
}
3637

3738
void loop() {
3839
// read a sample
3940
int sample = I2S.read();
4041

41-
if (sample) {
42-
// if it's non-zero print value to serial
42+
if (sample && sample != -1 && sample != 1) {
4343
Serial.println(sample);
4444
}
4545
}

Diff for: libraries/I2S/src/I2S.cpp

+11-20
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
#include "freertos/semphr.h"
2323

2424
#define _I2S_EVENT_QUEUE_LENGTH 100
25-
2625
#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
2827

2928
#define I2S_INTERFACES_COUNT SOC_I2S_NUM
3029

@@ -444,28 +443,27 @@ int I2SClass::read()
444443
return 0;
445444
}
446445

447-
int I2SClass::read(void* buffer, size_t size)
448-
{
446+
int I2SClass::read(void* buffer, size_t size){
449447
if (_state != I2S_STATE_RECEIVER && _state != I2S_STATE_DUPLEX) {
450448
if(!enableReceiver()){
451449
return 0; // There was an error switching to receiver
452450
}
453451
}
454-
//int read;
452+
size_t cpy_size = 0;
455453
//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;
457454
//if(_in_buf_semaphore != NULL && xSemaphoreTake(_in_buf_semaphore, portMAX_DELAY) == pdTRUE){
458455
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);
461458
_input_buffer_pointer = (_input_buffer_pointer + cpy_size) > _buffer_byte_size ? _buffer_byte_size : _input_buffer_pointer + cpy_size;
462459
_read_available -= cpy_size;
460+
xSemaphoreGive(_in_buf_semaphore);
463461
}
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){
466464
((uint16_t*)buffer)[i] = ((uint16_t*)buffer)[i] & 0x0FFF;
467465
}
468-
}
466+
} // ADC/DAC mode
469467
return cpy_size;
470468
}
471469

@@ -494,7 +492,6 @@ size_t I2SClass::write(const void *buffer, size_t size)
494492
if(_out_buf_semaphore != NULL && xSemaphoreTake(_out_buf_semaphore, portMAX_DELAY) == pdTRUE){
495493
memcpy((void*)((uint)_outputBuffer+_output_buffer_pointer), buffer, cpy_size);
496494
xSemaphoreGive(_out_buf_semaphore);
497-
}else{
498495
}
499496
_output_buffer_pointer = (_output_buffer_pointer + cpy_size) > _buffer_byte_size ? _output_buffer_pointer : _output_buffer_pointer + cpy_size;
500497
return bytes_written;
@@ -616,7 +613,7 @@ void I2SClass::onTransferComplete()
616613
if(_in_buf_semaphore != NULL && xSemaphoreTake(_in_buf_semaphore, 10) == pdTRUE){
617614
esp_i2s::i2s_read((esp_i2s::i2s_port_t) _deviceIndex, _inputBuffer, _buffer_byte_size, (size_t*) &_read_available, 0);
618615
_input_buffer_pointer = 0;
619-
if(xSemaphoreGive(_in_buf_semaphore) != pdTRUE){ // CRASHING HERE on first call
616+
if(xSemaphoreGive(_in_buf_semaphore) != pdTRUE){
620617
// We would not expect this call to fail because we must have
621618
// obtained the semaphore to get here.
622619
}
@@ -634,13 +631,7 @@ void I2SClass::onTransferComplete()
634631
void I2SClass::onDmaTransferComplete(void*)
635632
{
636633

637-
#ifdef _USE_SYS_VIEW
638-
SEGGER_SYSVIEW_Print("onTransferComplete start");
639-
#endif // _USE_SYS_VIEW
640634
I2S.onTransferComplete();
641-
#ifdef _USE_SYS_VIEW
642-
SEGGER_SYSVIEW_Print("onTransferComplete stop");
643-
#endif // _USE_SYS_VIEW
644635
}
645636

646637
#if I2S_INTERFACES_COUNT > 0
@@ -651,4 +642,4 @@ void I2SClass::onDmaTransferComplete(void*)
651642
#if I2S_INTERFACES_COUNT > 1
652643
// TODO set default pins for second module
653644
//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

Comments
 (0)