2015-06-27 3 views
4

В iOS я пытаюсь утихомирить музыку приложения Music при воспроизведении некоторых звуковых эффектов. В случае, если вы не знаете, «уклонение» просто означает, что громкость музыки немного разрядилась, прежде чем воспроизводить мой звук, затем звук воспроизводится, а затем громкость музыки возвращается назад.iOS AVAudioSession ducking медленный и синхронный

Для погружении в воду, я устанавливаю AVAudioSession категорию AVAudioSessionCategoryAmbient с опцией AVAudioSessionCategoryOptionDuckOthers, а затем активации/деактивации сессии (и воспроизведения звука в-между, очевидно). Он работает хорошо, но изменения объема, по-видимому, выполняются в том же потоке, что и вызов, и приложение зависает во время изменения тома.

Если вы хотите воспроизвести поведение, я думаю, что самый быстрый маршрут - это запустить новый проект SpriteKit, который даст вам образец, вращающийся по дороге проект. Затем поместите следующий код в методе touchesBegan:withEvent:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
[[AVAudioSession sharedInstance] setActive:NO error:nil]; 

Следующая запустить приложение в устройстве IOS, поставить музыку в приложение Music и коснитесь экрана, чтобы создать корабли и утку музыку. Вы услышите утку, но также увидите, как на экране замерзают корабли.

Это нормально? Каким будет самый простой способ избежать замораживания приложения, пока утка будет сделана?

Кстати, я использую iPhone 5S на iOS 8.1. Кроме того, я использую это в плагине Unity3D. Как я могу укусить приложение «Музыка» из «Единства»?

+0

же проблема здесь. –

+0

Такая же проблема. Вы когда-нибудь находили решение этого? –

ответ

0

Вы можете попробовать разместить AVAudioSession звонков в другую тему. Тогда они не будут блокировать основной (UI) поток. Это особенно важно для setActive, для чего требуется значительное количество времени.

 dispatch_queue_t myQueue = dispatch_queue_create("com.myname.myapp", nil); 
     dispatch_async(myQueue, ^{ 
      [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil]; 
      [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
     }); 

Этот вопрос также представляется актуальным: iOS AudioSessionSetActive() blocking main thread?