|
|
@ -12,6 +12,8 @@ |
|
|
|
* |
|
|
|
* |
|
|
|
* Jonathan Oakley, November 2021 |
|
|
|
* Jonathan Oakley, November 2021 |
|
|
|
* Converted from I16 to F32 - Bob Larkin Feb 2023. Thanks, Jonathan |
|
|
|
* Converted from I16 to F32 - Bob Larkin Feb 2023. Thanks, Jonathan |
|
|
|
|
|
|
|
* 18 Mar 2023: Includes corrections to testMode==1, NON-STALLING from |
|
|
|
|
|
|
|
* https://github.com/h4yn0nnym0u5e/Audio/commit/9fce95edb634891ce6d28288e87f54f4994096e8
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include "OpenAudio_ArduinoLibrary.h" |
|
|
|
#include "OpenAudio_ArduinoLibrary.h" |
|
|
@ -52,8 +54,8 @@ void setup() { |
|
|
|
// Comment the following out (or set to ORIGINAL) for old stall behaviour;
|
|
|
|
// Comment the following out (or set to ORIGINAL) for old stall behaviour;
|
|
|
|
// set to NON_STALLING for return with status if audio blocks not available,
|
|
|
|
// set to NON_STALLING for return with status if audio blocks not available,
|
|
|
|
// or no room in queue for another audio block.
|
|
|
|
// or no room in queue for another audio block.
|
|
|
|
queue1.setBehaviour(AudioPlayQueue_F32::NON_STALLING); |
|
|
|
queue1.setBehaviour(AudioPlayQueue_F32::NON_STALLING); // <=== Set
|
|
|
|
//queue1.setBehaviour(AudioPlayQueue_F32::ORIGINAL);
|
|
|
|
// queue1.setBehaviour(AudioPlayQueue_F32::ORIGINAL); // or this
|
|
|
|
queue1.setMaxBuffers(4); |
|
|
|
queue1.setMaxBuffers(4); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -78,16 +80,22 @@ float32_t nextSample() |
|
|
|
|
|
|
|
|
|
|
|
int loops; |
|
|
|
int loops; |
|
|
|
int nulls,nulls2; |
|
|
|
int nulls,nulls2; |
|
|
|
int testMode = 2; // 1: getBuffer / playBuffer; 2: play(), mix of samples and buffers
|
|
|
|
int testMode = 2; // 1: getBuffer / playBuffer; 2: play(), mix of samples and buffers <<<SET
|
|
|
|
int playMode; // 1: generate individual samples and send; 2: generate buffer of samples and send
|
|
|
|
int playMode; // 1: generate individual samples and send; 2: generate buffer of samples and send
|
|
|
|
float32_t samples[512],*sptr; // space for samples when using play()
|
|
|
|
float32_t samples[512],*sptr; // space for samples when using play()
|
|
|
|
uint32_t len; // number of buffered samples (remaining)
|
|
|
|
uint32_t len; // number of buffered samples (remaining)
|
|
|
|
|
|
|
|
int noQueueSpace; // did call to AudioPlayQueue::playBuffer() fail? If so, re-try
|
|
|
|
|
|
|
|
int noQcount; // count of times we had to wait to queue a block
|
|
|
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
void loop() { |
|
|
|
|
|
|
|
|
|
|
|
switch (testMode) |
|
|
|
switch (testMode) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case 1: // use getBuffer / playBuffer
|
|
|
|
case 1: // use getBuffer / playBuffer
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (0 != noQueueSpace) |
|
|
|
|
|
|
|
noQueueSpace = queue1.playBuffer(); |
|
|
|
|
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
float32_t* buf = queue1.getBuffer(); |
|
|
|
float32_t* buf = queue1.getBuffer(); |
|
|
|
|
|
|
|
|
|
|
@ -95,10 +103,13 @@ void loop() { |
|
|
|
nulls++; |
|
|
|
nulls++; |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (int i=0;i<AUDIO_BLOCK_SAMPLES;i++) |
|
|
|
for (int i=0; i<AUDIO_BLOCK_SAMPLES; i++) |
|
|
|
buf[i] = nextSample(); |
|
|
|
buf[i] = nextSample(); |
|
|
|
queue1.playBuffer(); |
|
|
|
noQueueSpace = queue1.playBuffer(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (noQueueSpace) |
|
|
|
|
|
|
|
noQcount++; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
@ -166,7 +177,7 @@ void loop() { |
|
|
|
// In NON_STALLING mode this loops really fast, and the millis() value goes up by
|
|
|
|
// In NON_STALLING mode this loops really fast, and the millis() value goes up by
|
|
|
|
// 100 on every output line. In ORIGINAL mode the loop is slow, and the internal
|
|
|
|
// 100 on every output line. In ORIGINAL mode the loop is slow, and the internal
|
|
|
|
// stall results in slightly unpredictable timestamps.
|
|
|
|
// stall results in slightly unpredictable timestamps.
|
|
|
|
Serial.printf("%d: millis = %d, loops = %d, nulls = %u, nulls2 = %u, samples = %u\n", |
|
|
|
Serial.printf("%d: millis = %d, loops = %d, nulls = %u, nulls2 = %u, samples = %u, wait count = %d\n", |
|
|
|
playMode,millis(),loops,nulls,nulls2,genLen); |
|
|
|
playMode, millis(),loops, nulls, nulls2, genLen, noQcount); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|