I implemented this and it works for me:
/** Wait for buffer ready. This will block until the buffer is prepared. DO NOT USE IN REALTIME! */
bool BufferingAudioSource::waitForNextAudioBlockReady (const AudioSourceChannelInfo& info, const uint32 sleepMiliSecs, const uint32 timeout)
{
if (nextPlayPos + info.numSamples < 0 ||
(! isLooping() && nextPlayPos > getTotalLength())) {
return true;
}
const uint32 endTime = Time::getMillisecondCounter () + timeout;
int validStart;
int validEnd;
while (Time::getMillisecondCounter() < endTime) {
{
const ScopedLock sl (bufferStartPosLock);
validStart = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos) - nextPlayPos);
validEnd = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos + info.numSamples) - nextPlayPos);
}
if (validStart <= 0 &&
validStart < validEnd &&
validEnd >= info.numSamples) {
return true;
}
Thread::sleep (sleepMiliSecs);
}
return false;
}
And right before a getNextAudioBlock I call
waitForNextAudioBlock (info, 10, 500);
Is this a sensible approach or has this some hazzard I didn’t realize?
