Подтвердить что ты не робот

Как правильно обрабатывать прерывания звука?

Я создал игру OpenGL 3D, используя OpenAL для воспроизведения звука и испытывая проблему потери звука, если кнопка "Домой" нажимается до того, как аудиоустройство начинает инициализацию. Я попытался подключиться к обработчику прерываний аудио сессии, но мой callback никогда не вызывается. Независимо от того, уменьшаю ли я или максимизирую свое приложение. Мой "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);
    }
}
4b9b3361

Ответ 1

Обратите внимание, что в настоящее время возникают проблемы с прерываниями аудио и IOS. Сообщения о прерываниях прекрасны, но прекращение уведомления об ошибках. Не всегда срабатывают уведомления. В Apple есть ошибка, и они не ответили.

Ответ 2

Попробуйте использовать NULL в alcMakeContextCurrent()

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() );
    }
}