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(),^{
没有任何区别
知道可能会发生什么吗?
答案 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音频。