1

我对 AudioQueueEnqueueBuffer 的调用失败,OSStatus -66686。我以前从未见过此错误代码,并且无法在任何地方找到有关它的信息。将其转换为 NSError 并打印其描述会给我以下控制台输出:

错误:错误域=NSOSStatusErrorDomain 代码=-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 调用失败?

4

2 回答 2

5

使用 Spotlight 进行搜索显示“66686”位于AudioQueue.h

kAudioQueueErr_BufferEmpty          = -66686

因此,无论您尝试做什么,缓冲区都是空的。

快速浏览一下上面的代码,在我看来它就像 SpeakHere 录音代码。但是,您已在上面设置它以进行播放。

无论哪种情况,您都需要在启动队列之前分配队列的缓冲区。对于记录,当有新记录的数据可用时,将定期调用您的函数回调。

对于播放,当您需要向队列提供更多音频数据时,将定期调用回调函数。

于 2012-01-19T18:37:35.623 回答
2

即使在分配缓冲区之后,您也必须用数据填充缓冲区。在从文件播放的情况下,我怀疑 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 是在较早的准备步骤中完成的。

于 2012-05-20T00:33:27.820 回答