OpenAl と MPMoviePlayerController の組み合わせに問題があります。
OpenAl セットアップ プロセスで AudioInterruptionLister を登録しました。ビデオを開始すると、リスナーは AudioListenerInterruptionStarts を受け取りますが、ムービーが終了すると AudioListenerInterruptionEnd トリガーを受け取りません。
// Register callback for audio interrupts
AudioSessionInitialize(NULL, NULL, &OpenALInterruptionListener, this);
リスナー
void OpenALInterruptionListener(void *inClientData, UInt32 inInterruptionState)
{
OpenAL *oal = (OpenAL *) inClientData;
if (inInterruptionState == kAudioSessionBeginInterruption)
{
oal->MakeContextNull();
AudioSessionSetActive(false);
}
else if (inInterruptionState == kAudioSessionEndInterruption)
{
AudioSessionSetActive(true);
oal->MakeContextCurrent();
}
}
これまでの私の解決策は、映画を開始する前にコンテキストを無効にし、映画が終了した後に現在のコンテキストにすることでした。ユーザーが画面に触れて映画を非常に速くスキップすると、コンテキストが最新になり、少し遅れて、コンテキストが再び null に設定される AudioListenerInterruptionStart トリガーが取得されるという問題が発生します。
iOS 3.1 以降では、useApplicationAudioSession = NO を設定でき、リスナーが開始トリガーまたは終了トリガーになることはありません。ただし、iOS 3.2 未満では、htis オプションは存在しません。
しかし、私の主な質問は、なぜ AudioListenerInterruptionEnd トリガーを取得しないのかということです。
助けてくれてありがとう