2013-08-06 5 views
16

Я работаю над приложением Podcast. Это воспроизводит аудио, используя тип сеанса AVAudioSessionCategoryPlayback. Это делает почти все, что я хочу сделать. Он приостанавливает другую музыку, ее прерывают, когда приходит вызов и вообще работает точно так, как я хочу.Обнаруживать, когда AVAudioSession «Ducked»

С исключение. Когда воспроизводится звук с более высоким приоритетом (например, при запуске приложения «от поворота к повороту»), звук в моем приложении сбрасывается громкостью, но продолжает работать. Это создает ужасное смешивание двух голосов, которые нежелательны. Вместо этого я предпочел бы, чтобы звук в моем приложении приостанавливался во время переигранного звука, а затем продолжайте снова, как только он закончится.

Я попытался изменить различные свойства AVAudioSession, такие как AVAudioSessionCategoryOptionMixWithOthers, но они изменяют только то, как звуки с более низким приоритетом смешиваются с моим приложением. Они не меняют, как моя смешивается с более высокоприоритетными звуками. Я также пробовал наблюдать за свойством otherAudioPlayingsharedSession, но это не сработало, когда я эти короткие клипы накладываются.

Есть ли способ обнаружить, когда звук в моем приложении уклоняется, чтобы я мог вместо этого сделать паузу? Или, альтернативно, чтобы предотвратить удержание звука моего приложения, чтобы он воспринимал эти другие звуки как прерывания?

Спасибо.

+0

Вы пытались использовать 'kAudioSessionBeginInterruption' и' kAudioSessionEndInterruption'? – iwasrobbed

+0

Да, но оверлейная утка не считается «прерыванием» в отношении AVAudioSession. Таким образом, эти обратные вызовы/уведомления не запускаются. –

+2

Возможно, вы захотите подать радар с Apple об этом, если вы считаете, что это должно быть. На мой взгляд, логично, что это следует рассматривать как прерывание аудио сессии. – iwasrobbed

ответ

0

Я никогда не делал этого, но я полагаю, вы могли бы использовать функцию AudioSession услуги C audioSessionAddPropertyListener зарегистрировать свою функцию обратного вызова для kAudioSessionProperty_OtherAudioIsPlaying.

Помните, что в документации «FLATDACTED» есть некоторая путаница и Apple DevForums о возможности того, что все или некоторые функции AudioSession C устарели «в будущем».

+0

Спасибо за ваше предложение, я ценю помощь. Тем не менее, я пробовал это как с API Obj-C и C. Ни один из них не вызвал желаемого результата обратного вызова при увольнении во время уклонения. –

0

Вы можете посмотреть в перерывах, а просто отбрасывать звуковую сессию, когда прерывается, а затем возобновить его, когда прерывание заканчивается следующим образом:

В вашем ViewDidLoad:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

if ([self canBecomeFirstResponder]) { 
    [self becomeFirstResponder]; 
} 

Handle уведомления :

static NSInteger audioSessionActiveCounter = 0; 

- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification 
{ 
    AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; 

    if (AVAudioSessionInterruptionTypeBegan == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- Begin Interruption ---"); 
     // stop your session here with a setActive:NO 

    } 
    else if (AVAudioSessionInterruptionTypeEnded == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- End Interruption ---"); 
     // resume your session here with a setActive:YES 
    } 
} 

Надеюсь, что это поможет.

0

Я не считаю, что kAudioSessionSperty_OtherAudioIsPlaying должен каким-либо образом перезвонить - возможно, вам придется регулярно опробовать это значение.

Он должен вернуть ненулевое значение, если на устройстве воспроизводится другое аудио. Это может не указывать на то, что вы «нырнули» как таковой, но это будет означать, что другой звук смешивается с вашим аудио. Предположительно, вы были бы только уклонились, если другое приложение установило свойство kAudioSessionProperty_OtherMixableAudioShouldDuck своего аудиозанятия.

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

Надеюсь, это поможет.

1

В вас AppDelegate.m классе и в didFinishLaunchingWithOptions функции, слушать следующее уведомление

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

и вне способа запуска приложений, реализовать селектор в

- (void)audioSessionInterruption:(NSNotification *)notif{ 
    NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo); 
} 

Надеется, что это будет работать для вас .. ..

0

Я написал в Apple DTS об этой проблеме. Вот что я получил:

Благодарим вас за обращение в службу технической поддержки Apple Developer DTS. Наши инженеры рассмотрели ваш запрос и пришли к выводу, что не поддерживается для достижения желаемой функциональности, учитывая в настоящее время.

Если вы хотели бы для Apple, чтобы рассмотреть вопрос о включении поддержки в будущем разрешить/уведомить фоновое приложение, чтобы остановить воспроизведение звука, когда на переднем плане приложение выбирает уткой другого аудио, включите фону приложение, чтобы начать аудио снова после того, как утка завершена, отправьте запрос с помощью инструмента Bug Reporter по адресу http://bugreport.apple.com.

Похоже, что сейчас это невозможно.

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