• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Audio Queue Callbacks not firing
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • Prev by Date: Re: Multi-bus rendering
  • Next by Date: AU Instrument with side-chain support. How?
  • Previous by thread: Re: AU Cocoa UI in Carbon window?
  • Next by thread: AU Instrument with side-chain support. How?
  • Index(es):
    • Date
    • Thread