R2ROutput blocking correction

This commit is contained in:
pschatzmann 2024-09-03 13:03:32 +02:00
parent 53414e7294
commit 7cdec5139a
2 changed files with 17 additions and 6 deletions

View File

@ -13,7 +13,7 @@ SineWaveGenerator<int16_t> sineWave; // subclass of SoundG
GeneratedSoundStream<int16_t> sound(sineWave); // Stream generated from sine wave GeneratedSoundStream<int16_t> sound(sineWave); // Stream generated from sine wave
R2ROutput out; R2ROutput out;
StreamCopy copier(out, sound); // copies sound into i2s StreamCopy copier(out, sound); // copies sound into i2s
const int pins1[] = {13,12,14,27,26,25, 33, 32}; // r2r pins 32 is least significant const int pins1[] = {12,14,27,26,25,33,32, 35}; // ESP32 pins
// Arduino Setup // Arduino Setup
void setup(void) { void setup(void) {

View File

@ -85,6 +85,7 @@ class R2RConfig : public AudioInfo {
uint16_t buffer_count = 2; // double buffer uint16_t buffer_count = 2; // double buffer
R2RDriverBase *driver = &r2r_driver; // by default use Arduino driver R2RDriverBase *driver = &r2r_driver; // by default use Arduino driver
bool is_blocking = true; bool is_blocking = true;
int blocking_retry_delay_ms = 5;
int timer_id = 0; int timer_id = 0;
}; };
@ -145,6 +146,8 @@ class R2ROutput : public AudioOutput {
} }
size_t write(const uint8_t *data, size_t len) override { size_t write(const uint8_t *data, size_t len) override {
LOGD("write: %d", len);
size_t result = 0;
// if buffer has not been allocated (buffer_size==0) // if buffer has not been allocated (buffer_size==0)
if (len > rcfg.buffer_size) { if (len > rcfg.buffer_size) {
LOGE("buffer_size %d too small for write size: %d", rcfg.buffer_size, LOGE("buffer_size %d too small for write size: %d", rcfg.buffer_size,
@ -152,19 +155,27 @@ class R2ROutput : public AudioOutput {
return len; return len;
} }
// wait for buffer to have enough space
if (rcfg.is_blocking){ if (rcfg.is_blocking){
while(buffer.availableForWrite()<len){ // write of all bytes
delay(5); int open = len;
while(open > 0){
int written = buffer.writeArray(data + result, open);
open -= written;
result += written;
if (open > 0){
delay(rcfg.blocking_retry_delay_ms);
} }
} }
} else {
size_t result = buffer.writeArray(data, len); // write as much as possible
result = buffer.writeArray(data, len);
}
// activate output when buffer is half full // activate output when buffer is half full
if (!is_active && buffer.bufferCountFilled() >= rcfg.buffer_count / 2) { if (!is_active && buffer.bufferCountFilled() >= rcfg.buffer_count / 2) {
LOGI("is_active = true"); LOGI("is_active = true");
is_active = true; is_active = true;
} }
return result; return result;
} }