В Руководстве по аудиосессии есть раздел "Проверка, воспроизводится ли другой звук во время запуска приложения".
Я использую 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 продолжала воспроизводиться, когда мое приложение возвращается на передний план - даже если моя собственная музыка воспроизводилась (и с использованием аппаратного декодера), когда мое приложение находилось в фоновом режиме.
(И, наоборот, если мое приложение работает в фоновом режиме без воспроизведения музыки, я хотел бы определить, могу ли я начать воспроизведение музыки, когда оно вернется).
Как я могу это сделать? (И желательно без резкого отключения звука, сохраняя приятное затухание, которое обычно случается.)
РЕДАКТИРОВАТЬ: я также должен указать, что я делаю всю свою работу со звуком в основном потоке.