Можно ли смешивать AudioServicesPlaySystemSound и AVAudioPlayer? - PullRequest
7 голосов
/ 02 ноября 2009

У нас есть игра, которая очень близка к выпуску, но у нас есть одна чрезвычайно раздражающая проблема. Один из наших телефонов для бета-тестирования, он не слышит никаких звуковых эффектов в игре. Он может, однако, слышать фоновую музыку и музыку на экране заголовка просто отлично.

Фоновая и заглавная музыка воспроизводятся через AVAudioPlayer (они длиннее, нам нужны циклы и регулировка громкости и т. Д.). Звуковые эффекты просто воспроизводятся с помощью AudioServicesPlaySystemSound (они очень короткие, нам не требуется точный контроль или знать, когда они заканчиваются и т. Д.). Это работает на большинстве iPhone, но не на этом. Все это воспроизводится в аудио сеансе AVAudioSessionCategorySoloAmbient.

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

Дополнительная справочная записка: я могу довольно убедительно сказать, что на его телефоне это смешение двух фреймворков. Он мог слышать звуки примерно до той же сборки, в которую мы добавили титульную музыку. Кроме того, если я изменю один из звуков для работы через AVAudioPlayer, он сможет это услышать. К сожалению, я не могу просто перенести звуки в AVAudioPlayers, потому что они просто не очень хорошо работают, и мне нужна лучшая синхронизация.

Ответы [ 2 ]

9 голосов
/ 02 ноября 2009

РЕДАКТИРОВАТЬ 2 :
Я определил причину ошибки. Две разные аудио рамки играют на двух разных настройках громкости. Существует основная громкость (это то, что отображается, когда вы находитесь в приложении, и на нем нет заголовка) и громкость звонка (это то, что отображается, когда вы находитесь на главном экране без загрузки какого-либо приложения). AVAudioPlayer вызывает воспроизведение с основной настройкой громкости. Поскольку я установил категорию на AVAudioSessionCategorySoloAmbient (см. Код ниже), это регулятор громкости, который будет регулироваться, если вы используете регулятор громкости внутри приложения. SystemSounds, однако, воспроизводятся на громкости звонка. Это НЕ будет появляться внутри приложения, и, как таковое, не позволяет пользователю изменять свои настройки во время игры.

Легко увидеть возможную путаницу для пользователя: скажем, у него установлен низкий или даже выключенный сигнал вызова. Они начинают играть в игру. Они слышат музыку титульного экрана (AVAudioPlayer) и могут увеличивать или уменьшать громкость, и она реагирует нормально. Затем они запускают игру и воспроизводят звуковые эффекты (SystemSounds) и ничего не слышат, потому что громкость звонка низкая / выключена. Чтобы услышать звуковые эффекты, они увеличивают громкость, и фоновая музыка реагирует соответственно. Таким образом, с этой точки зрения, похоже, звуковые эффекты просто не воспроизводятся.

Если вы сталкиваетесь с подобной ситуацией, попросите своего пользователя убедиться в том, что его громкость звонка повышена, прежде чем играть в игру, и его переключатель отключения звука включен (т.е. не отключен). Вы также можете проверить все это, выполнив тест самостоятельно - уменьшите громкость звонка и увеличьте громкость в приложении. Ваши системные звуки должны выпасть из смеси.

Оригинальный ответ : Перечитывая все документы, я нашел ответ. Я не правильно активировал аудио сеанс. Ранее у меня был только этот код для установки категории:

NSError *setCategoryError = nil; 
BOOL    categoryWasSet    = [[AVAudioSession sharedInstance] 
                              setCategory: AVAudioSessionCategorySoloAmbient 
                              error: &setCategoryError]; 

Но мне нужно было также добавить следующий код, чтобы явно активировать аудио сеанс:

NSError *activationError  = nil;
BOOL    activationSuccess = [[AVAudioSession sharedInstance]
                              setActive: YES 
                              error: &activationError];

Я повторно протестировал этого пользователя, и он полностью устранил проблему. Надеюсь, это поможет любому, у кого может быть похожая проблема.

РЕДАКТИРОВАТЬ: Кажется, это не решило проблему в конце концов. Я получил ложный положительный результат от моего тестера, и при более детальном рассмотрении кажется, что он фактически не слышал звуки, генерируемые SystemSound.

8 голосов
/ 02 ноября 2009

У меня есть два приложения в магазине приложений, которые смешивают эти две платформы. AVAudioPlayer для звуков, требующих запуска, остановки и регулировки громкости, а также набор инструментов AudioServices для коротких звуковых сигналов и щелчков. Единственное, о чем я могу думать, вне головы, это то, что громкость AVAudioPlayer, кажется, управляется отдельно от звуков AudioServices. Поэтому убедитесь, что на тестере не отключены звуки (с переключателем режима вибрации) или громкость не установлена.

Если это не поможет, расскажите мне больше о ваших звуках / коде, и я могу добавить код в свое приложение, чтобы посмотреть, смогу ли я получить такое же поведение. Конечно, похоже, что у большинства ваших тестеров нет этой проблемы, и я, вероятно, тоже ее не увижу.

...