Подтвердить что ты не робот

Задержка 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(),^{ не делал никакой разницы

Любая идея, что может произойти?

4b9b3361

Ответ 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.