[OpenAL] iPad музыка перестает играть после выхода из спящего режима
Собствено так, музыка залипает, или вообще не проигрывается
Это касается "потоковой" музыки
С чем может быть связано?
Тот же код используется на PC - где успешно работает (я так дума)
Спасибо
Может, ты побольше раскажешь о своей ситуации? Ристор аудио сессии после пробуждения делал?
Ристор аудио сессии после пробуждения делал?
Это как? )
Ну как запускаю поток, запускаю музыку
вот так щас выглядит апдейт с дебажным бредом )
void OALSoundBufferStream::update()
{
LogSystemInterface * logSystem = m_soundSystem->getLogSystem();
int state;
alGetSourcei( m_source, AL_SOURCE_STATE, &state );
OAL_CHECK_ERROR();
LOGGER_WARNING(logSystem)("OALSoundBufferStream::update %p state %p"
, this
, state
);
if (state != AL_PLAYING)
{
int queuedBuffers;
alGetSourcei( m_source, AL_BUFFERS_QUEUED, &queuedBuffers );
OAL_CHECK_ERROR();
LOGGER_WARNING(logSystem)("OALSoundBufferStream::update %p queuedBuffers %d"
, this
, queuedBuffers
);
m_soundDecoder->seek( 0.f );
if( queuedBuffers )
{
ALuint buffer;
alSourceUnqueueBuffers( m_source, queuedBuffers, &buffer );
OAL_CHECK_ERROR();
unsigned int bytesWritten = m_soundDecoder->decode( m_dataBuffer, m_bufferSize );
if ( bytesWritten )
{
alBufferData( buffer, m_format, m_dataBuffer, m_bufferSize, m_frequency );
OAL_CHECK_ERROR();
alSourceQueueBuffers( m_source, 1, &buffer );
OAL_CHECK_ERROR();
}
alSourcePlay( m_source );
OAL_CHECK_ERROR();
LOGGER_WARNING(logSystem)("OALSoundBufferStream::update %p stop play"
, this
);
}
return;
}
int processed = 0;
alGetSourcei( m_source, AL_BUFFERS_PROCESSED, &processed );
OAL_CHECK_ERROR();
LOGGER_WARNING(logSystem)("OALSoundBufferStream::update %p processed %d"
, this
, processed
);
if( processed <= 0 )
{
return;
}
while( processed-- )
{
ALuint buffer;
alSourceUnqueueBuffers( m_source, 1, &buffer );
OAL_CHECK_ERROR();
unsigned int bytesWritten = m_soundDecoder->decode( m_dataBuffer, m_bufferSize );
LOGGER_WARNING(logSystem)("OALSoundBufferStream::update %p decode %d"
, this
, bytesWritten
);
if ( bytesWritten )
{
alBufferData( buffer, m_format, m_dataBuffer, bytesWritten, m_frequency );
OAL_CHECK_ERROR();
alSourceQueueBuffers( m_source, 1, &buffer );
OAL_CHECK_ERROR();
}
}
}
После просыпания if (state != AL_PLAYING)
через пару тиков STOPING
и int processed = 0; всегда 0!
Ты бы для начала код в тег нормально обернул.
Потом почитай про Audio sessions
Обернул, читаю, но не понимаю (
В доках все подробно описано - нет ничего сложного.
Но там есть один хитрый баг, за которым я когда-то долго гонялся. Вот тебе кот
Инициализация:
AudioSessionInitialize(NULL, NULL, InterruptionListenerCallback, NULL);
Реализация InterruptionListenerCallback:
void InterruptionListenerCallback(void *data, UInt32 interruptionState)
{
if (interruptionState == kAudioSessionBeginInterruption)
{
AudioSessionSetActive(false);
alcMakeContextCurrent(NULL);
alcSuspendContext(soundContext);
}
else if (interruptionState == kAudioSessionEndInterruption)
{
UInt32 category = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
OSStatus error = AudioSessionSetActive(true);
int restartTry = 0;
while (error != 0 && ++restartTry < 10)
{
sleep(1);
error = AudioSessionSetActive(true);
}
if (error == 0)
{
alcMakeContextCurrent(soundContext);
alcProcessContext(soundContext);
}
}
}
Этот магический while там не спроста - иногда ось тупо не возобновляет твою аудиосессию и единственный выход - вот такие грабли.
Есть еще одни грабли с этими аудиосессиями. У меня в игре при выходе из бэкграунда проверялось, играют ли аудио другие приложения и, если да, то все звуки в игре принудительно выключались. Но при быстром переключении между приложениями (когда ты не сворачиваешь текущее приложение, а вызываешь в нем док и переключаешься на свое) проверка на активное проигрывание аудио в бэкграунде была позитивной - ОС не не успела приостановить аудиосессию предыдущего приложения. Обходится такими граблями:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[glView startAnimation];
if (CheckForActiveBackgroundAudioSession())
{
TurnSoundOff();
}
[self performSelector:@selector(SoundResumeOnHotSwapAntiBug) withObject:nil afterDelay:1.5];
}
- (void)SoundResumeOnHotSwapAntiBug
{
if (!CheckForActiveBackgroundAudioSession())
{
TurnSoundOn();
}
}
Надеюсь, это поможет тебе сэкономить кучу времени ;)
StiX
Спасибо, надеюсь это поможет! в любом случае с меня пиво )))
только вот это
CheckForActiveBackgroundAudioSession
TurnSoundOn();
TurnSoundOff();
вроде твое, что там происходит?
Да, это мое.
> TurnSoundOn();
> TurnSoundOff();
Это специфическое для игры - проходит по всем звукам в игре в включает\выключает их прогирывание
IROV..
> CheckForActiveBackgroundAudioSession
А это уже не помню - там вызов какого-то метода из АудиоТулбокс фреймворка, который говорит есть ли активное аудио в бэкграунде. Вечерком дома могу посмотреть, что там такое
StiX
AudioSessionInitialize(NULL, NULL, InterruptionListenerCallback, NULL);
запускаю
но
сюда
void InterruptionListenerCallback(void *data, UInt32 interruptionState)
{
не приходит никогда (
После того как я возвращаюсь в приложение, у меня музыка заела, и вот такой лог
Feb 27 19:48:49 unknown IOSApplication[6802] <Warning>: applicationWillResignActive
Feb 27 19:48:49 unknown IOSApplication[6802] <Warning>: Application::onFocus from 1 to 0
Feb 27 19:49:21 unknown SpringBoard[15] <Notice>: Posting 'com.apple.iokit.hid.displayStatus' notifyState=0
Feb 27 19:49:21 unknown SpringBoard[15] <Notice>: MultitouchHID: detection mode: 0->255
Feb 27 19:50:35 unknown SpringBoard[15] <Notice>: Posting 'com.apple.iokit.hid.displayStatus' notifyState=1
Feb 27 19:50:35 unknown SpringBoard[15] <Notice>: MultitouchHID: detection mode: 255->0 (deferring until bootloaded)
Feb 27 19:50:36 unknown SpringBoard[15] <Notice>: MultitouchHID: device bootloaded
Feb 27 19:50:36 unknown SpringBoard[15] <Notice>: MultitouchHID: detection mode: 0->0
Feb 27 19:50:36 unknown kernel[0] <Debug>: set_crc_notification_state 0
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: applicationDidBecomeActive
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: Application::onFocus from 0 to 1
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x517be70
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x517be70 bytesWritten 44100
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x517be70 bytesWritten2 44100
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x517be70 state 0x1012
Feb 27 19:50:57 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x517be70 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten 44100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten2 44100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1014
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 queuedBuffers 2
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten 44100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten2 44100
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 stop 2 play
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:58 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1012
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 processed 0
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 state 0x1014
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 queuedBuffers 2
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten 44100
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::play 0x51db100 bytesWritten2 44100
Feb 27 19:50:59 unknown IOSApplication[6802] <Warning>: OALSoundBufferStream::update 0x51db100 stop 2 play