14

ファイル機能から単純な再生を実行しようとしていますが、コールバック関数が呼び出されないようです。すべての 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 デバイスで試しました。)

似たように聞こえる問題に対する他の解決策を読みましたが、それらは機能しません。私が現在行っている複数のバッファの使用のようなもので、違いはないようです。

私は基本的に、どういうわけか明らかに間違ったことをしていると思いますが、それが何であるかはわかりません。私は関連するドキュメントを読み、利用可能なコード例を見て、答えを求めてネットを少し調べました。

少なくとも、調査するために他にできることはありますか?

4

2 に答える 2