12

我创建了一个使用 OpenAL 进行音频播放的 OpenGL 3D 游戏,如果在初始化音频设备之前按下“主页”按钮,则会遇到丢失音频的问题。我试图连接到音频会话中断处理程序,但我的回调永远不会被调用。无论我是最小化还是最大化我的应用程序。我的“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 问题。中断通知很好,但结束音频中断通知并不总是有效。苹果对此有一个错误,他们没有回应。

于 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 回答