ファイル機能から単純な再生を実行しようとしていますが、コールバック関数が呼び出されないようです。すべての OSStatuses が 0 に戻り、他の数値もすべて正しく表示されるため (AudioFileReadPackets からの出力パケットの読み取りポインターなど)、実際には意味がありません。
セットアップは次のとおりです。
OSStatus stat;
stat = AudioFileOpenURL(
(CFURLRef)urlpath, kAudioFileReadPermission, 0, &aStreamData->aFile
);
UInt32 dsze = 0;
stat = AudioFileGetPropertyInfo(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, 0
);
stat = AudioFileGetProperty(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, &aStreamData->aDescription
);
stat = AudioQueueNewOutput(
&aStreamData->aDescription, bufferCallback, aStreamData, NULL, NULL, 0, &aStreamData->aQueue
);
aStreamData->pOffset = 0;
for(int i = 0; i < NUM_BUFFERS; i++) {
stat = AudioQueueAllocateBuffer(
aStreamData->aQueue, aStreamData->aDescription.mBytesPerPacket, &aStreamData->aBuffer[i]
);
bufferCallback(aStreamData, aStreamData->aQueue, aStreamData->aBuffer[i]);
}
stat = AudioQueuePrime(aStreamData->aQueue, 0, NULL);
stat = AudioQueueStart(aStreamData->aQueue, NULL);
(関数間の値をチェックしているところは示されていませんstat
。正常に戻るだけです。)
そしてコールバック関数:
void bufferCallback(void *uData, AudioQueueRef queue, AudioQueueBufferRef buffer) {
UInt32 bread = 0;
UInt32 pread = buffer->mAudioDataBytesCapacity / player->aStreamData->aDescription.mBytesPerPacket;
OSStatus stat;
stat = AudioFileReadPackets(
player->aStreamData->aFile, false, &bread, NULL, player->aStreamData->pOffset, &pread, buffer->mAudioData
);
buffer->mAudioDataByteSize = bread;
stat = AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
player->aStreamData->pOffset += pread;
}
ここで、aStreamData はユーザー データ構造体 (typedefed であるため、クラス プロパティとして使用できます) であり、player は制御する Objective-C クラスの静的インスタンスです。他のコードが必要な場合はお知らせください。私は少し機知に富んでいます。ここに含まれる数字のいずれかを出力すると、割り当てループで自分自身を呼び出したときの bufferCallback の関数を含め、正しい結果が得られます。その後、呼び出されることはありません。起動メソッドが返され、何も起こりません。
また、逸話として、私は周辺機器 (MBox Pro 3) を使用して、出力しようとしているときにのみ CoreAudio が起動するサウンドを再生しています。IE、iTunes などを起動すると、スピーカーがかすかにポップし、LED が点滅から点灯に変わります。デバイスはそのように起動するため、CA は確実に何かを行っています。(もちろん、オンボード Macbook サウンド sans デバイスで試しました。)
似たように聞こえる問題に対する他の解決策を読みましたが、それらは機能しません。私が現在行っている複数のバッファの使用のようなもので、違いはないようです。
私は基本的に、どういうわけか明らかに間違ったことをしていると思いますが、それが何であるかはわかりません。私は関連するドキュメントを読み、利用可能なコード例を見て、答えを求めてネットを少し調べました。
少なくとも、調査するために他にできることはありますか?