- (void)setupNewAudioQueue {
UInt32 size = sizeof(_dataFormat);
OSErr queueErr = AudioQueueNewOutput(&_dataFormat, YKK_AudioQueueBufferCallback, self, CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &_queue);
NSAssert(queueErr == noErr, @"AudioQueueNewOutput failed");
UInt32 bufferByteSize = 0;
UInt32 maxPacketSize = 0;
size = sizeof(maxPacketSize);
OSErr packetErr = AudioFileGetProperty(_audioFile, kAudioFilePropertyPacketSizeUpperBound, &size, &maxPacketSize);
NSAssert(packetErr == noErr, @"kAudioFilePropertyPacketSizeUpperBound failed");
[self calculateBytesForTimeWithDescription:_dataFormat
maxPacketSize:maxPacketSize
bufferDuration:kBufferDurationSeconds
bufferByteSize:&bufferByteSize
packetsToRead:&_numPacketsToRead];
NSLog(@"bufferByteSize %d mNumPacketsToRead %d", bufferByteSize, _numPacketsToRead);
if (_dataFormat.mBytesPerPacket == 0 || _dataFormat.mFramesPerPacket == 0) {
_packetDescs = calloc(_numPacketsToRead, sizeof(AudioStreamPacketDescription));
} else {
_packetDescs = NULL;
}
size = sizeof(UInt32);
OSStatus result = AudioFileGetPropertyInfo (_audioFile, kAudioFilePropertyMagicCookieData, &size, NULL);
if (!result && size) {
char* cookie = (char*)calloc(size, sizeof(char));
OSErr cookieErr = AudioFileGetProperty (_audioFile, kAudioFilePropertyMagicCookieData, &size, cookie);
NSAssert(cookieErr == noErr, @"kAudioFilePropertyMagicCookieData failed");
OSErr setCookieErr = AudioQueueSetProperty(_queue, kAudioQueueProperty_MagicCookie, cookie, size);
NSAssert(setCookieErr == noErr, @"kAudioQueueProperty_MagicCookie failed");
free(cookie);
}
_done = false;
_packetIndex = 0;
for (int i = 0; i < kNumberBuffers; ++i) {
//AudioQueueAllocateBuffer(mQueue, gBufferSizeBytes, &mBuffers[i]);
OSErr allocErr = AudioQueueAllocateBuffer(_queue, bufferByteSize, &_buffers[i]);
NSAssert(allocErr == noErr, @"AudioQueueAllocateBufferWithPacketDescriptions failed");
if (_done) break;
}
// channel layout?
result = AudioFileGetPropertyInfo(_audioFile, kAudioFilePropertyChannelLayout, &size, NULL);
if (result == noErr && size > 0) {
AudioChannelLayout *acl = (AudioChannelLayout *)malloc(size);
OSErr layoutErr = AudioFileGetProperty(_audioFile, kAudioFilePropertyChannelLayout, &size, acl);
NSAssert(layoutErr == noErr, @"kAudioFilePropertyChannelLayout failed");
OSErr setLayoutErr = AudioQueueSetProperty(_queue, kAudioQueueProperty_ChannelLayout, acl, size);
NSAssert(setLayoutErr == noErr, @"set kAudioQueueProperty_ChannelLayout failed");
free(acl);
}
// set the volume of the queue
OSErr volErr = AudioQueueSetParameter(_queue, kAudioQueueParam_Volume, 1.0);
NSAssert(volErr == noErr, @"set kAudioQueueParam_Volume failed");
OSErr addListenerErr = AudioQueueAddPropertyListener(_queue, kAudioQueueProperty_IsRunning, YKK_isRunningProc, self);
NSAssert(addListenerErr == noErr, @"set kAudioQueueProperty_IsRunning failed");
self.initialized = YES;
}
/// ---------------------------------
to pause the queue I call:
- (OSStatus)pauseQueue {
OSStatus result = AudioQueuePause(_queue);
if (result) printf("ERROR PAUSING QUEUE!\n");
return result;
}
like I mentioned earlier, my YKK_AudioQueueBufferCallback continues to get called, even though I've called AudioQueuePause()..
void YKK_AudioQueueBufferCallback(void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inCompleteAQBuffer) {
printf("YKK_AudioQueueBufferCallback %f\n", [[NSDate date] timeIntervalSince1970]);
YKK_AudioQueueFilePlayer *player = (YKK_AudioQueueFilePlayer*)inUserData;
if (player->_done) return;
UInt32 numBytes;
UInt32 nPackets = player->_numPacketsToRead;
OSStatus result = AudioFileReadPackets(player->_audioFile, false, &numBytes, player->_packetDescs, player->_currentPacket, &nPackets, inCompleteAQBuffer->mAudioData);
if (result)
printf("AudioFileReadPackets failed: %d", result);
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, (player->_packetDescs ? nPackets : 0), player->_packetDescs);
player->_currentPacket = (player->_currentPacket + nPackets);
} else {
AudioQueueStop(player->_queue, false);
// reading nPackets == 0 is our EOF condition
player->_done = true;
}
}
I'm just getting back into audio programming after long hiatus... any help would be appreciated.
Michael