2010-10-22 4 views
2

В разделе Audio Session Cookbook есть раздел «Checking if Other Audio is Playing During App Launch».Как справиться с другим воспроизведением звука в свете многозадачности в 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 будет отключена, и моя музыка снова начнет воспроизводиться.

Что бы я хотел, чтобы музыка продолжалась, когда мое приложение возвращается на передний план - даже если моя собственная музыка воспроизводилась (и использовала аппаратный декодер), когда мое приложение было основано.

(И наоборот - если в моем приложении не было музыки, я хотел бы узнать, могу ли я начать играть музыку, когда она вернется).

Как я могу это сделать? (И, желательно, без резкого отключения звука, сохраняя при этом приятное затухание, которое обычно случается.)

EDIT: Я должен также указать, что я делаю все свои звуковые работы с основного потока.

+0

Что случилось с установкой AudioSession.category = AVAudioSessionCategoryAmbient, независимо от того, играет ли другой звук или нет? –

+0

@William Если я установил категорию в Ambient, то я не могу использовать аппаратуру декодирования самостоятельно для своей собственной музыки (а ее выполнение на CPU использует слишком много процессорного времени). –

ответ

0

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

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

+0

Я знаю о 'applicationDidEnterBackground', и я предполагаю, что решение потребует ответа на него. То, что я пытаюсь понять, - это то, что влечет за собой «приостановка вашего звука» и «сброс состояния вашего аудиоплеера». –

+0

Хм ... Думаю, я не понимаю. Если это вопрос о AudioSession, вы знаете, как начать его, я предполагаю, что подобные методы останавливают его?Если вы действительно не знаете, я буду искать документы и отвечать снова. На более банальном уровне: я не могу сказать вам, как сбросить состояние вашего аудиоплеера, потому что я не знаю, как вы его настроили. iOS будет считать его сброшенным, если вы его остановите. – refulgentis

+0

Мой аудиопроигрыватель - это просто аппаратная аудиокарта, в основном то, что описано в «Руководстве по программированию служб очереди аудио» (за исключением того, что он обрабатывается в другом потоке, в основном, где я получаю уведомления). Дело в том, что взаимодействие с API AudioQueue/AudioSession во время applicationDidEnterBackground приводит к нечетному поведению или сбою. К сожалению, документация (насколько я могу судить) не описывает способ взаимодействия этих двух частей API. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^