• 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
AudioQueuePause not pausing
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

AudioQueuePause not pausing


  • Subject: AudioQueuePause not pausing
  • From: Michael Hanna <email@hidden>
  • Date: Sun, 29 Aug 2010 20:07:24 +0200

Hello, on Mac OS 10.6, linking to 10.6SDK, AudioQueuePause() call to a audio queue that is already started results not in a pause but the queue restarts at the beginning of the file and playback proceeds to "skip" every couple seconds.

I have confirmed that even after AudioQueuePause() is called my AudioQueueBufferCallback continues to get called. I'm not sure how to diagnose an issue like this. The only thing I can do is to show how I set up the queue and perhaps someone can suggest what I'm doing wrong...

before this forthcoming code is called, I've already called AudioFileOpenURL...

/// ---------------------------------
- (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
 _______________________________________________
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

  • Follow-Ups:
    • Re: AudioQueuePause not pausing
      • From: Doug Wyatt <email@hidden>
  • Prev by Date: Re: Problems with kAudioDevicePropertyStreamConfiguration not reporting output channels
  • Next by Date: Conceptual question about a sequencer project
  • Previous by thread: Re: Problems with kAudioDevicePropertyStreamConfiguration not reporting output channels
  • Next by thread: Re: AudioQueuePause not pausing
  • Index(es):
    • Date
    • Thread