Ошибка AudioQueueEnqueueBuffer - PullRequest
       26

Ошибка AudioQueueEnqueueBuffer

0 голосов
/ 26 мая 2011

Мои вызовы AudioQueueEnqueueBuffer не выполняются, с OSStatus -66686.Я никогда не видел этот код ошибки раньше, и я не могу найти информацию о нем нигде.Преобразование его в NSError и печать его описания дает мне следующий вывод консоли:

Ошибка: Ошибка Domain = NSOSStatusErrorDomain Code = -66686 "Операция не может быть завершена. (Ошибка OSStatus -66686.)"

Вот весь мой соответствующий код инициализации AudioQueue:

AudioQueueRef       audioQueue;
AudioQueueBufferRef aq_buffer[3];
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = 44100;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
streamFormat.mBitsPerChannel = 16;
streamFormat.mChannelsPerFrame = 1;
streamFormat.mBytesPerPacket = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mBytesPerFrame = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mFramesPerPacket = 1;
streamFormat.mReserved = 0;

OSStatus err;
err = AudioQueueNewOutput(&streamFormat, AudioPlayCallback, self, 
                          CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &audioQueue);

// Start playback
err = AudioQueueStart(audioQueue, NULL);

// Enqueue buffers
for (int i = 0; i < 3; i++) {
    err = AudioQueueAllocateBuffer (audioQueue, 1024, &aq_buffer[i]); 
    err = AudioQueueEnqueueBuffer (audioQueue, aq_buffer[i], 0, NULL);
    NSLog(@"err : %d", err);
    NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain
                                         code:err
                                         userInfo:nil];
    NSLog(@"Error: %@", [error description]);
}       

Я пытался изменить размер буфера, который я выделяю, но это не имеет никакого эффекта (и вызов AudioQueueAllocateBuffer все равно не завершается ошибкой),Я попытался переключить порядок вызовов между AudioQueueStart и распределением буфера и ставить в очередь вызовы, безрезультатно.Я проверил комментарии в AudioQueue.h, и я не вижу, что я делаю неправильно.Описание ошибки слишком расплывчато, чтобы быть полезным.

Почему происходит сбой вызова AudioQueueEnqueueBuffer?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Поиск с помощью Spotlight показывает, что "66686" можно найти в AudioQueue.h:

kAudioQueueErr_BufferEmpty          = -66686

Итак, что бы вы ни пытались сделать, буфер пуст.

При быстром взгляде на приведенный выше код он выглядит как код записи SpeakHere. Тем не менее, вы настроили его выше для воспроизведения.

В любом случае вам нужно выделить буферы очереди перед ее запуском. Для записи ваш обратный вызов функции будет периодически вызываться, когда доступны новые записанные данные.

Для воспроизведения, функция обратного вызова будет периодически вызываться, когда вам нужно предоставить больше аудиоданных в очередь.

2 голосов
/ 20 мая 2012

Даже после выделения буферов вам придется заполнять буферы данными.В случае воспроизведения из файла, я подозреваю, что AudioFileReadPackets сделает это за вас.Но если вы, например, играете из потока, вам придется самостоятельно помещать данные в буфер.

Это сработало для меня:

char pcmData[pcmDataSize];

// add your own code here to populate pcmData with the PCM data to playback

memcpy(audioQueueBufferRef->mAudioData,pcmData, pcmDataSize);
audioQueueBufferRef->mAudioDataByteSize = pcmDataSize;
audioQueueBufferRef->mPacketDescriptionCount = pcmDataSize/2; // change this according to your num bytes per frame
AudioQueueEnqueueBuffer(audioQueueRef, audioQueueBufferRef, 0, NULL);

AudioQueueAllocateBuffer было сделано в более ранней подготовкешаг.

...