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