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