AudioQueueDispose延迟

时间:2015-07-17 13:55:37

标签: ios objective-c xcode audio audioqueueservices

根据此处的文件https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioQueueReference/#//apple_ref/c/func/AudioQueueDispose

err = AudioQueueDispose(queue, true);

我使用true因此处置AudioQueue会立即发生,虽然它有时会立即处理队列,有时它会在设备上延迟3-4秒到13秒。 err = AudioQueueStop(queue, true)也有同样的问题。

我的理解是两个函数都尝试刷新释放缓冲区并且即将入队...
所以如果要调用AudioQueueDispose,我甚至会帮助我的回调函数刷新缓冲区。

static void MyAQOutputCallBack(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer)
{
  if (player.shouldDispose) {
        printf("player shouldDispose !!!!!!!!!!!\n\n\n\n\n\n");
        OSStatus dispose = AudioQueueFlush (inAQ);
        return;
    }
}

由于我要在播放曲目后使用AudioQueues录制内容,因此我需要在没有延迟的情况下返回此函数。几百毫秒还可以,但3-4秒?这是不可接受的。

其他AudioQueue函数也在同一个线程上调用,它们似乎工作正常。

我也尝试在主线程上调用它来确保它是否会改变任何东西

[self performSelectorOnMainThread:@selector(tryOnMain) withObject:nil waitUntilDone:NO];

dispatch_sync(dispatch_get_main_queue(),^{没有任何区别

知道可能会发生什么吗?

1 个答案:

答案 0 :(得分:1)

我通过以下方式成功立即停止播放音频:

-(void)stopAudio
    {
        @synchronized(audioLock) {
            audioLock=[NSNumber numberWithBool:false];
            OSStatus err;
            err=AudioQueueReset (_audioQueue);
            if (err != noErr)
            {
                NSLog(@"AudioQueueReset() error: %d", (int)err);
            }
            err=AudioQueueStop (_audioQueue, YES);
            if (err != noErr)
            {
                NSLog(@"AudioQueueStop() error: %d", (int)err);
            }
            err=AudioQueueDispose (_audioQueue, YES);
            if (err != noErr)
            {
                NSLog(@"AudioQueueDispose() error: %d", (int)err);
            }
        }
    }

在我的:

void audioCallback(void *custom_data, AudioQueueRef queue, AudioQueueBufferRef buffer)

如果出现以下情况,我只会在队列中放入更多内容:

myObject *weakSelf = (__bridge myObject *)custom_data;
@synchronized(weakSelf -> audioLock) {
    if ([weakSelf -> audioLock boolValue]) {
         Put_more_stuff_on_queue
    }

在我的特定情况下,我播放AAC-LC音频。