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 に答える