Задержка AudioQueueDispose
Согласно документации здесь 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
Я сразу же прекратил воспроизведение звука:
-(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.