12

OpenALを使用してオーディオを再生するOpenGL3Dゲームを作成しましたが、オーディオデバイスが初期化される前に[ホーム]ボタンを押すとオーディオが失われるという問題が発生します。オーディオセッション割り込みハンドラーに接続しようとしましたが、コールバックが呼び出されません。アプリケーションを最小化するか最大化するかに関係なく。「OpenALInterruptionListener」が呼び出されることはありません。

私は何が間違っているのですか?

AudioSessionInitialize(NULL, NULL, OpenALInterriptionListener, this);

void OpenALInterriptionListener(void * inClientData, UInt32 inInterruptionState)
{
    OpenALDevice * device = (OpenALDevice *) inClientData;

    if (inInterruptionState == kAudioSessionBeginInterruption)
    {
          alcSuspendContext(_context);
          alcMakeContextCurrent(_context);
          AudioSessionSetActive(false);
    }
    else if (inInterruptionState == kAudioSessionEndInterruption)
    {
          UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
          AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
          AudioSessionSetActive(true);    
          alcMakeContextCurrent(_context);
          alcProcessContext(_context);
    }
}
4

2 に答える 2

2

現在、オーディオ割り込みとIOSに問題があることに注意してください。割り込み通知は問題ありませんが、オーディオ割り込み通知の終了が常に機能するとは限りません。これにはAppleにバグがあり、彼らは応答していません。

于 2012-06-05T19:30:26.970 に答える
1

alcMakeContextCurrent()でNULLを使用してみてください

void OpenALInterriptionListener(void *inClientData, UInt32 inInterruptionState)
{
    OpenALDevice * device = (OpenALDevice *) inClientData;
    OSStatus nResult;

    if( inInterruptionState == kAudioSessionBeginInterruption )
    {
        alcMakeContextCurrent(NULL);    
    }
    else if( inInterruptionState == kAudioSessionEndInterruption )
    {
        nResult = AudioSessionSetActive(true);

        if( nResult )
        {
            //  "Error setting audio session active"
        }

        alcMakeContextCurrent( device->GetContext() );
    }
}
于 2012-05-28T03:21:07.150 に答える