Как мне управлять воспроизведением другого звука в свете многозадачности в iOS? - PullRequest
2 голосов
/ 22 октября 2010

В Audio Session Cookbook есть раздел " Проверка, воспроизводится ли другое аудио во время запуска приложения ".

Я использую 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 ]

0 голосов
/ 31 октября 2010

Что касается вашего последнего комментария к ответу refulgentis, вы можете приостановить воспроизведение музыки в applicationWillResignActive и оставить операции сохранения состояния и очистки для applicationDidEnterBackground.Это может быть лучше, если вы избежите какого-либо странного поведения в фоновом переходном состоянии.

0 голосов
/ 25 октября 2010

Почему бы просто не позаботиться о том, чтобы реализовать его в сообщениях многозадачности делегата приложения? В фоновом режиме приостановите воспроизведение звука (при необходимости сохраняя текущую позицию воспроизведения) и верните его обратно, когда приложение возобновит фокусировку.

Просто чтобы прояснить это немного: ответьте на applicationDidEnterBackground: в вашем делегате, сбросив состояние вашего аудиоплеера, и ответьте на applicationWillEnterForeground: настройте его обратно, как вы делаете сейчас. Вы также можете получить объект, который настраивает воспроизведение звука, в ответ на UIApplicationWillEnterBackgroundNotification / UIApplicationWillEnterForegroundNotification через NSNotificationCenter, что, вероятно, будет немного проще за счет абстрагирования того, что ваше приложение делает именно на фоне, из класса делегата приложения.

...