mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-15 14:27:29 +00:00
-dealloc now blocks until all audio queue buffers are no longer playing.
This commit is contained in:
@@ -14,8 +14,9 @@
|
|||||||
#define AudioQueueBufferLength 256
|
#define AudioQueueBufferLength 256
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AudioQueueCanWrite,
|
AudioQueueCanProceed,
|
||||||
AudioQueueWait
|
AudioQueueWait,
|
||||||
|
AudioQueueIsInvalidated
|
||||||
};
|
};
|
||||||
|
|
||||||
@implementation AudioQueue
|
@implementation AudioQueue
|
||||||
@@ -25,10 +26,8 @@ enum {
|
|||||||
unsigned int _audioStreamReadPosition, _audioStreamWritePosition;
|
unsigned int _audioStreamReadPosition, _audioStreamWritePosition;
|
||||||
int16_t _audioStream[AudioQueueStreamLength];
|
int16_t _audioStream[AudioQueueStreamLength];
|
||||||
NSConditionLock *_writeLock;
|
NSConditionLock *_writeLock;
|
||||||
|
BOOL _isInvalidated;
|
||||||
#ifdef DEBUG_INPUT
|
int _dequeuedCount;
|
||||||
NSFileHandle *
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -62,9 +61,20 @@ enum {
|
|||||||
{
|
{
|
||||||
memset(buffer->mAudioData, 0, buffer->mAudioDataByteSize);
|
memset(buffer->mAudioData, 0, buffer->mAudioDataByteSize);
|
||||||
}
|
}
|
||||||
AudioQueueEnqueueBuffer(theAudioQueue, buffer, 0, NULL);
|
|
||||||
|
|
||||||
[_writeLock unlockWithCondition:AudioQueueCanWrite];
|
if(!_isInvalidated)
|
||||||
|
{
|
||||||
|
[_writeLock unlockWithCondition:AudioQueueCanProceed];
|
||||||
|
AudioQueueEnqueueBuffer(theAudioQueue, buffer, 0, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_dequeuedCount++;
|
||||||
|
if(_dequeuedCount == AudioQueueNumAudioBuffers)
|
||||||
|
[_writeLock unlockWithCondition:AudioQueueIsInvalidated];
|
||||||
|
else
|
||||||
|
[_writeLock unlockWithCondition:AudioQueueCanProceed];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void audioOutputCallback(
|
static void audioOutputCallback(
|
||||||
@@ -81,7 +91,7 @@ static void audioOutputCallback(
|
|||||||
|
|
||||||
if(self)
|
if(self)
|
||||||
{
|
{
|
||||||
_writeLock = [[NSConditionLock alloc] initWithCondition:AudioQueueCanWrite];
|
_writeLock = [[NSConditionLock alloc] initWithCondition:AudioQueueCanProceed];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Describe a mono, 16bit, 44.1Khz audio format
|
Describe a mono, 16bit, 44.1Khz audio format
|
||||||
@@ -131,6 +141,13 @@ static void audioOutputCallback(
|
|||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
|
[_writeLock lock];
|
||||||
|
_isInvalidated = YES;
|
||||||
|
[_writeLock unlock];
|
||||||
|
|
||||||
|
[_writeLock lockWhenCondition:AudioQueueIsInvalidated];
|
||||||
|
[_writeLock unlock];
|
||||||
|
|
||||||
int c = AudioQueueNumAudioBuffers;
|
int c = AudioQueueNumAudioBuffers;
|
||||||
while(c--)
|
while(c--)
|
||||||
AudioQueueFreeBuffer(_audioQueue, _audioBuffers[c]);
|
AudioQueueFreeBuffer(_audioQueue, _audioBuffers[c]);
|
||||||
@@ -142,7 +159,7 @@ static void audioOutputCallback(
|
|||||||
{
|
{
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
[_writeLock lockWhenCondition:AudioQueueCanWrite];
|
[_writeLock lockWhenCondition:AudioQueueCanProceed];
|
||||||
if((_audioStreamReadPosition + AudioQueueStreamLength) - _audioStreamWritePosition >= lengthInSamples)
|
if((_audioStreamReadPosition + AudioQueueStreamLength) - _audioStreamWritePosition >= lengthInSamples)
|
||||||
{
|
{
|
||||||
size_t samplesBeforeOverflow = AudioQueueStreamLength - (_audioStreamWritePosition % AudioQueueStreamLength);
|
size_t samplesBeforeOverflow = AudioQueueStreamLength - (_audioStreamWritePosition % AudioQueueStreamLength);
|
||||||
@@ -170,7 +187,7 @@ static void audioOutputCallback(
|
|||||||
|
|
||||||
- (NSInteger)writeLockCondition
|
- (NSInteger)writeLockCondition
|
||||||
{
|
{
|
||||||
return ((_audioStreamWritePosition - _audioStreamReadPosition) < (AudioQueueStreamLength - AudioQueueBufferLength)) ? AudioQueueCanWrite : AudioQueueWait;
|
return ((_audioStreamWritePosition - _audioStreamReadPosition) < (AudioQueueStreamLength - AudioQueueBufferLength)) ? AudioQueueCanProceed : AudioQueueWait;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Reference in New Issue
Block a user