Audio Queue Callbacks not firing
Audio Queue Callbacks not firing
- Subject: Audio Queue Callbacks not firing
- From: Colin Cornaby <email@hidden>
- Date: Thu, 11 Sep 2008 09:13:42 -0700
I wrote out some rough code to play multiple audio queues back to
back, but my callbacks aren't firing. I'm sure I'm just having pointer
problems somewhere, but I can't find where I went wrong...
Code is attached (obviously not implementation complete, but it should
at least play a sound...)
#define kNumberBuffers 3
#define kMaxFiles 20
struct AQPlayerState {
AudioStreamBasicDescription
mDataFormats[kMaxFiles]; // 2
AudioQueueRef
mQueues[kMaxFiles]; // 3
AudioQueueBufferRef mBuffers[kNumberBuffers]; // 4
AudioFileID
mAudioFiles[kMaxFiles]; // 5
UInt32 mNumAudioFiles; //
6 // 5
UInt32 mCurrentAudioFile;
UInt32 bufferByteSize; // 6
SInt64 mCurrentPacket; // 7
UInt32 mNumPacketsToRead; // 8
AudioStreamPacketDescription *mPacketDescs; // 9
bool mIsRunning; // 10
};
static void HandleOutputBuffer (void *aqData, AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer)
{
UInt32 numBytesReadFromFile;
struct AQPlayerState * paqData = ((struct AQPlayerState *)aqData);
UInt32 numPackets = paqData->mNumPacketsToRead;;
AudioFileReadPackets (paqData->mAudioFiles[paqData-
>mCurrentAudioFile], false, &numBytesReadFromFile, paqData-
>mPacketDescs, paqData->mCurrentPacket, &numPackets, inBuffer-
>mAudioData);
if (numPackets > 0) {
AudioQueueEnqueueBuffer (paqData->mQueues[paqData-
>mCurrentAudioFile], inBuffer, (paqData->mPacketDescs ? numPackets :
0), paqData->mPacketDescs);
}else{
AudioQueueStop (paqData->mQueues[paqData->mCurrentAudioFile], false);
paqData->mIsRunning = false;
}
}
void DeriveBufferSize (AudioStreamBasicDescription ASBDesc, UInt32
maxPacketSize, Float64 seconds, UInt32 *outBufferSize, UInt32
*outNumPacketsToRead)
{
static const int maxBufferSize =
0x50000; // 6
static const int minBufferSize =
0x4000; // 7
if (ASBDesc.mFramesPerPacket != 0)
{ // 8
Float64 numPacketsForTime = ASBDesc.mSampleRate /
ASBDesc.mFramesPerPacket * seconds;
*outBufferSize = numPacketsForTime * maxPacketSize;
} else
{ // 9
*outBufferSize =
maxBufferSize > maxPacketSize ?
maxBufferSize : maxPacketSize;
}
if
( // 10
*outBufferSize > maxBufferSize &&
*outBufferSize > maxPacketSize
)
*outBufferSize = maxBufferSize;
else
{ // 11
if (*outBufferSize < minBufferSize)
*outBufferSize = minBufferSize;
}
*outNumPacketsToRead = *outBufferSize /
maxPacketSize; // 12
}
void addAudioFile(struct AQPlayerState *aqData, CFURLRef audioFile)
{
OSStatus error;
aqData->mCurrentAudioFile=0;
error = AudioFileOpenURL (audioFile, kAudioFileReadPermission, 0,
&aqData->mAudioFiles[aqData->mNumAudioFiles]);
UInt32 dataFormatSize = sizeof(AudioStreamBasicDescription);
error = AudioFileGetProperty (aqData->mAudioFiles[aqData-
>mNumAudioFiles], kAudioFilePropertyDataFormat, &dataFormatSize,
&(aqData->mDataFormats[aqData->mNumAudioFiles]));
error = AudioQueueNewOutput (&aqData->mDataFormats[aqData-
>mNumAudioFiles], HandleOutputBuffer, (void *)aqData,
CFRunLoopGetCurrent (), kCFRunLoopCommonModes, 0, &aqData-
>mQueues[aqData->mNumAudioFiles]);
UInt32 maxPacketSize;
UInt32 propertySize = sizeof (maxPacketSize);
error = AudioFileGetProperty (aqData->mAudioFiles[aqData-
>mNumAudioFiles], kAudioFilePropertyPacketSizeUpperBound,
&propertySize, &maxPacketSize);
DeriveBufferSize (aqData->mDataFormats[aqData->mNumAudioFiles],
maxPacketSize, 0.5, &aqData->bufferByteSize, &aqData-
>mNumPacketsToRead);
bool isFormatVBR = (aqData->mDataFormats[aqData-
>mNumAudioFiles].mBytesPerPacket == 0 || aqData->mDataFormats[aqData-
>mNumAudioFiles].mFramesPerPacket == 0);
if (isFormatVBR) {
aqData->mPacketDescs =(AudioStreamPacketDescription*) malloc (aqData-
>mNumPacketsToRead * sizeof (AudioStreamPacketDescription));
} else {
aqData->mPacketDescs = NULL;
}
aqData->mCurrentPacket = 0;
//prime the buffers
for (int i = 0; i < kNumberBuffers; ++i) {
error = AudioQueueAllocateBuffer (aqData->mQueues[aqData-
>mNumAudioFiles], aqData->bufferByteSize, &aqData->mBuffers[i]);
HandleOutputBuffer (aqData, aqData->mQueues[aqData->mNumAudioFiles],
aqData->mBuffers[i]);
}
Float32 gain = 1.0;
error = AudioQueueSetParameter (aqData->mQueues[aqData-
>mNumAudioFiles], kAudioQueueParam_Volume, gain);
aqData->mIsRunning = true;
error = AudioQueueStart (aqData->mQueues[aqData->mNumAudioFiles],
NULL);
aqData->mNumAudioFiles++;
do {
CFRunLoopRunInMode (kCFRunLoopDefaultMode, 0.25, false);
} while (aqData->mIsRunning);
CFRunLoopRunInMode (kCFRunLoopDefaultMode,1,false);
}
Thanks,
Colin
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden