mirror of
https://github.com/pschatzmann/arduino-audio-tools.git
synced 2024-09-21 02:17:31 +00:00
R2ROutput blocking correction
This commit is contained in:
parent
53414e7294
commit
7cdec5139a
@ -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) {
|
||||||
|
@ -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 {
|
||||||
|
// write as much as possible
|
||||||
|
result = buffer.writeArray(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user