1
 OSStatus err = AudioQueueNewOutput(&audioDescription, AudioPlayerAQOutputCallback, ( void* )self, nil, nil, 0, &audioQueue);
    if( err != noErr )
        NSLog(@"Couldn't open AudioFile.");

    err = AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, isRunningProc, self);
    if( err != noErr )
        NSLog(@"Couldn't register for playback state changes.");

このコールバック関数は、AudioQueueStart(audioQueue, NULL) の後に 1 回だけ呼び出されます。

何と呼んでも AudioQueuePause(audioQueue);

または音声が最後まで届きます。

static void isRunningProc(void *              inUserData,
                      AudioQueueRef           inAQ,
                      AudioQueuePropertyID    inID)

私が逃したものは何ですか?

4

1 に答える 1

1

私はこれについて短いテストを行いました:

一時停止を再開するときに、一時停止または開始のために呼び出されないコールバックのように見えます。

しかし、これはあなたが解決できないことではありません。あなたはどういうわけか歌を始めました。これにより、プロパティ リスナーがトリガーされます。曲が止まった場合も同様です。または、あなたはそれを停止します。再生ルーチンで次のようなものを使用して、何らかの方法でプロパティ リスナーを自分でトリガーする必要がある場合があります。

if (bytesRead == 0) {
    //This will trigger the property listener
    AudioQueueStop(inAQ, false);
}
else {
    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}

AudioQueue に関する限り、再生するオーディオ バッファを供給し続ける限り、再生は継続されます。(また、バッファをまったくフィードしないこともテストしましたが、これは停止をトリガーしませんでした。そのため、明示的に stop を呼び出して、プロパティ リスナーをトリガーする必要があります。)

これは、曲が再生されているかどうかをすでに知っていることを意味します。一時停止または一時停止解除は、ボタンをクリックして要求されます。曲が再生されない場合は、何もしないでください。曲が再生中の場合は、AudioQueuePause を呼び出して、音楽を一時停止したことを示すフラグを設定します。エラーコードを確認することを忘れないでください。(下記(1)参照)。フラグが音楽を一時停止したことを示している場合は、AudioQueueStart を呼び出し、一時停止したかどうかを示すフラグをクリアします。もう一度エラーコードを確認してください。

(1) なぜエラーコードを確認するのですか?

まず、ありそうもないことですが、ブルームーンなのでエラーが出る場合があります。

ただし、私の懸念は複数のスレッドにあります。AudioQueue は明らかに、GUI とは別のスレッドで実行されます。つまり、音楽が再生されているかどうかにかかわらずフラグをテストすると、ステータスをテストしてから変更された可能性があるため、この状態は完全には信頼できません。別のスレッドが、テストとそのテストに基づくアクションの間に入り込んだ可能性があります。

曲が既に再生されていることを確認するとします。(そうです。) それで曲を一時停止してもらいますが、曲を一時停止してもらう前に、途中で終わってしまったので、本当に曲が止まってしまいます。次に、曲を一時停止するように依頼します。しかし、それはすでに停止しています。

その後どうなりますか?よくわかりません。この状況では問題にならないかもしれませんが、このようなことは検討する価値があります。テストするか、少なくともドキュメントを参照する必要があります。

別のシナリオはどうですか?曲が停止され、もう一度開始するように依頼された場合はどうなりますか。それはもっと悪いシナリオだと思いますが、問題にはならないかもしれません。これらのケースを再度検討し、ドキュメントを確認するか、自分でテストしてください。

于 2013-12-01T15:24:44.687 に答える