Как мне управлять воспроизведением другого звука, в свете многозадачности, в iOS?
В поваренной книге аудиосеанса есть раздел " Проверка, воспроизводится ли другое аудио во время запуска приложения".
Я использую MonoTouch (но не стесняйтесь давать ответ Objective-C, API-интерфейс тот же), поэтому код из этого документа выглядит примерно так:
bool otherAudioPlaying = AudioSession.OtherAudioIsPlaying;
if(otherAudioPlaying)
AudioSession.Category = AudioSessionCategory.AmbientSound;
else
AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
В результате, если мое приложение запускается при воспроизведении музыки с iPod, эта музыка с iPod продолжит воспроизводиться и не позволит мне использовать аппаратный аудиодекодер (который мне в любом случае не нужен). Если при запуске приложения не воспроизводится музыка с iPod, я могу использовать аппаратный декодер.
Затем я могу использовать значение otherAudioPlaying
определить, стоит ли начинать играть мою собственную музыку.
Теперь это прекрасно работает на старых операционных системах, которые не поддерживают многозадачность. Но с помощью многозадачности пользователь может покинуть мое приложение (в фоновом режиме), запустить воспроизведение музыки на iPod и снова войти в мое приложение. Затем их музыка на iPod будет отключена, и моя музыка снова начнет воспроизводиться.
Я хотел бы, чтобы музыка iPod продолжала воспроизводиться, когда мое приложение возвращается на передний план - даже если моя собственная музыка воспроизводилась (и использовала аппаратный декодер), когда мое приложение было фоновым.
(И наоборот - если мое приложение было фоновым, а музыка не воспроизводилась, я хотел бы определить, смогу ли я начать воспроизведение музыки после ее возвращения).
Как я могу это сделать? (И желательно без резкого отключения звука, сохраняя при этом приятное затухание.)
РЕДАКТИРОВАТЬ: Я также должен отметить, что я делаю все мои аудио работы из основного потока.
2 ответа
Что касается вашего последнего комментария к ответу refulgentis, вы можете приостановить воспроизведение музыки в applicationWillResignActive и оставить операции сохранения состояния и очистки для applicationDidEnterBackground. Это могло бы быть лучше, чтобы избежать любого странного поведения во время фонового переходного состояния.
Почему бы просто не позаботиться о его реализации в приложении многозадачных сообщений делегата приложения? В фоновом режиме приостановите воспроизведение звука (при необходимости сохраняя текущую позицию воспроизведения) и верните его обратно, когда приложение возобновит фокусировку.
Просто чтобы прояснить это немного: ответьте на applicationDidEnterBackground: в вашем делегате, сбросив состояние вашего аудиоплеера, и ответьте на applicationWillEnterForeground: установив его резервную копию, как вы делаете сейчас. Вы также можете получить объект, который настраивает воспроизведение звука, в ответ на UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForegroundNotification через NSNotificationCenter, что, вероятно, будет немного проще за счет абстрагирования того, что ваше приложение делает именно на фоне, из класса делегата приложения.