From 03f683d588c65a15da03b1b131ecb6c1a77f315b Mon Sep 17 00:00:00 2001 From: Thomas Harte <thomas.harte@gmail.com> Date: Mon, 18 Jan 2016 19:57:18 -0600 Subject: [PATCH] Gave the audio queue something a lot like a spin lock on waiting to pipe out audio. --- .../Mac/Clock Signal/Wrappers/AudioQueue.m | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Wrappers/AudioQueue.m b/OSBindings/Mac/Clock Signal/Wrappers/AudioQueue.m index ccbcf7712..fa5031ed6 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/AudioQueue.m +++ b/OSBindings/Mac/Clock Signal/Wrappers/AudioQueue.m @@ -140,21 +140,32 @@ static void audioOutputCallback( - (void)enqueueAudioBuffer:(const int16_t *)buffer numberOfSamples:(size_t)lengthInSamples { - [_writeLock lockWhenCondition:AudioQueueCanWrite]; - size_t samplesBeforeOverflow = AudioQueueStreamLength - (_audioStreamWritePosition % AudioQueueStreamLength); - - if(samplesBeforeOverflow < lengthInSamples) + while(1) { - memcpy(&_audioStream[_audioStreamWritePosition % AudioQueueStreamLength], buffer, samplesBeforeOverflow * sizeof(int16_t)); - memcpy(&_audioStream[0], &buffer[samplesBeforeOverflow], (lengthInSamples - samplesBeforeOverflow) * sizeof(int16_t)); - } - else - { - memcpy(&_audioStream[_audioStreamWritePosition % AudioQueueStreamLength], buffer, lengthInSamples * sizeof(int16_t)); - } + [_writeLock lockWhenCondition:AudioQueueCanWrite]; + if((_audioStreamReadPosition + AudioQueueStreamLength) - _audioStreamWritePosition >= lengthInSamples) + { + size_t samplesBeforeOverflow = AudioQueueStreamLength - (_audioStreamWritePosition % AudioQueueStreamLength); - _audioStreamWritePosition += lengthInSamples; - [_writeLock unlockWithCondition:[self writeLockCondition]]; + if(samplesBeforeOverflow < lengthInSamples) + { + memcpy(&_audioStream[_audioStreamWritePosition % AudioQueueStreamLength], buffer, samplesBeforeOverflow * sizeof(int16_t)); + memcpy(&_audioStream[0], &buffer[samplesBeforeOverflow], (lengthInSamples - samplesBeforeOverflow) * sizeof(int16_t)); + } + else + { + memcpy(&_audioStream[_audioStreamWritePosition % AudioQueueStreamLength], buffer, lengthInSamples * sizeof(int16_t)); + } + + _audioStreamWritePosition += lengthInSamples; + [_writeLock unlockWithCondition:[self writeLockCondition]]; + break; + } + else + { + [_writeLock unlockWithCondition:AudioQueueWait]; + } + } } - (NSInteger)writeLockCondition