Hello all. I've come across an interesting problem. I'm working on a kick drum generator that uses a sine wavetable. I've been having issues with timing and narrowed it down to AudioPlayQueue playBuffer() taking 2 - 3 milliseconds to complete. Since playBuffer() is in a loop to process the length of the kick drum playBuffer() occurs many times adding up to over 300ms of time used on playBuffer(). I have simplified my code below and have confirmed the code below produces the issue I am having. I am using a Teensy 3.2 clocked to 96mhz. My AudioMemory is set to 48.
I noticed that for some reason old blocks are not being cleared out of the queue. Below is output from a timer of playBuffer() in milliseconds and the corresponding AudioMemoryUsed(). As you can see the first 32 memory blocks complete in 0ms but then after the queue is full at 32 it begins to take 2 - 3 ms for each playBuffer() call. I understand once the queue is full it waits for a block to become free but shouldn't blocks become free before hitting the max of 32? At no point does it ever manage to free any blocks from the queue. I'm not sure what to try next.
Code:
int16_t buffer[AUDIO_BUFFER_SIZE];
while(triggered)
{
if (sampleCount >= numSamples)
{
triggered = false;
break;
}
if (bufferCount == AUDIO_BUFFER_SIZE) //128
{
int16_t* bufM = audioPlayQueueMono.getBuffer();
memcpy(bufM, &buffer[0], AUDIO_BUFFER_SIZE << 1);
audioPlayQueueMono.playBuffer();
bufferCount = 0;
}
buffer[bufferCount] = sample;
bufferCount++;
sampleCount++;
}
I noticed that for some reason old blocks are not being cleared out of the queue. Below is output from a timer of playBuffer() in milliseconds and the corresponding AudioMemoryUsed(). As you can see the first 32 memory blocks complete in 0ms but then after the queue is full at 32 it begins to take 2 - 3 ms for each playBuffer() call. I understand once the queue is full it waits for a block to become free but shouldn't blocks become free before hitting the max of 32? At no point does it ever manage to free any blocks from the queue. I'm not sure what to try next.
Code:
playBuffer() millis: 0 AudioMemoryUsed: 1
playBuffer() millis: 0 AudioMemoryUsed: 2
playBuffer() millis: 0 AudioMemoryUsed: 3
playBuffer() millis: 0 AudioMemoryUsed: 4
playBuffer() millis: 0 AudioMemoryUsed: 5
playBuffer() millis: 0 AudioMemoryUsed: 6
playBuffer() millis: 0 AudioMemoryUsed: 7
playBuffer() millis: 0 AudioMemoryUsed: 8
playBuffer() millis: 0 AudioMemoryUsed: 9
playBuffer() millis: 0 AudioMemoryUsed: 10
playBuffer() millis: 0 AudioMemoryUsed: 11
playBuffer() millis: 0 AudioMemoryUsed: 12
playBuffer() millis: 0 AudioMemoryUsed: 13
playBuffer() millis: 0 AudioMemoryUsed: 14
playBuffer() millis: 0 AudioMemoryUsed: 15
playBuffer() millis: 0 AudioMemoryUsed: 16
playBuffer() millis: 0 AudioMemoryUsed: 17
playBuffer() millis: 0 AudioMemoryUsed: 17
playBuffer() millis: 0 AudioMemoryUsed: 18
playBuffer() millis: 0 AudioMemoryUsed: 19
playBuffer() millis: 0 AudioMemoryUsed: 20
playBuffer() millis: 0 AudioMemoryUsed: 21
playBuffer() millis: 0 AudioMemoryUsed: 21
playBuffer() millis: 0 AudioMemoryUsed: 22
playBuffer() millis: 0 AudioMemoryUsed: 23
playBuffer() millis: 0 AudioMemoryUsed: 24
playBuffer() millis: 0 AudioMemoryUsed: 24
playBuffer() millis: 0 AudioMemoryUsed: 25
playBuffer() millis: 0 AudioMemoryUsed: 26
playBuffer() millis: 0 AudioMemoryUsed: 27
playBuffer() millis: 0 AudioMemoryUsed: 27
playBuffer() millis: 0 AudioMemoryUsed: 28
playBuffer() millis: 0 AudioMemoryUsed: 29
playBuffer() millis: 0 AudioMemoryUsed: 30
playBuffer() millis: 0 AudioMemoryUsed: 31
playBuffer() millis: 0 AudioMemoryUsed: 31
playBuffer() millis: 0 AudioMemoryUsed: 32
playBuffer() millis: 1 AudioMemoryUsed: 32
playBuffer() millis: 2 AudioMemoryUsed: 32
playBuffer() millis: 3 AudioMemoryUsed: 32
playBuffer() millis: 3 AudioMemoryUsed: 32
playBuffer() millis: 3 AudioMemoryUsed: 32
playBuffer() millis: 3 AudioMemoryUsed: 32
playBuffer() millis: 3 AudioMemoryUsed: 32
...