Войти
ПрограммированиеФорумЗвук

[OpenAL] iPad музыка перестает играть после выхода из спящего режима

#0
16:02, 27 фев. 2012

Собствено так, музыка залипает, или вообще не проигрывается
Это касается "потоковой" музыки

С чем может быть связано?

Тот же код используется на PC - где успешно работает (я так дума)

Спасибо


#1
18:39, 27 фев. 2012

Может, ты побольше раскажешь о своей ситуации? Ристор аудио сессии после пробуждения делал?

#2
19:02, 27 фев. 2012

Ристор аудио сессии после пробуждения делал?
Это как? )

Ну как запускаю поток, запускаю музыку

вот так щас выглядит апдейт с дебажным бредом )

  //////////////////////////////////////////////////////////////////////////
  void OALSoundBufferStream::update()
  {
    LogSystemInterface * logSystem = m_soundSystem->getLogSystem();

    // Check the status of the Source.  If it is not playing, then playback was completed,
    // or the Source was starved of audio data, and needs to be restarted.
    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)
    {
      // If there are Buffers in the Source Queue then the Source was starved of audio
      // data, so needs to be restarted (because there is more audio data to play)
      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();
        }

        //this->stop( m_source );
        //this->play( m_source, m_loop, 0.f );

        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!

#3
19:04, 27 фев. 2012

Ты бы для начала код в тег нормально обернул.
Потом почитай про Audio sessions

#4
19:11, 27 фев. 2012

Обернул, читаю, но не понимаю (

#5
20:08, 27 фев. 2012

В доках все подробно описано - нет ничего сложного.
Но там есть один хитрый баг, за которым я когда-то долго гонялся. Вот тебе кот
Инициализация:

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();
 } 
}
Надеюсь, это поможет тебе сэкономить кучу времени ;)

#6
20:26, 27 фев. 2012

StiX
Спасибо, надеюсь это поможет! в любом случае с меня пиво )))

только вот это

CheckForActiveBackgroundAudioSession
TurnSoundOn();
TurnSoundOff();

вроде твое, что там происходит?

#7
20:39, 27 фев. 2012

Да, это мое.
> TurnSoundOn();
> TurnSoundOff();
Это специфическое для игры - проходит по всем звукам в игре в включает\выключает их прогирывание

IROV..
> CheckForActiveBackgroundAudioSession
А это уже не помню - там вызов какого-то метода из АудиоТулбокс фреймворка, который говорит есть ли активное аудио в бэкграунде. Вечерком дома могу посмотреть, что там такое

#8
21:54, 27 фев. 2012

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
ПрограммированиеФорумЗвук

Тема в архиве.