2015-03-06 4 views
0

Здравствуйте, я попробовал различные решения для подобных вопросов, но не смог заставить мой код работать. У меня есть следующие функции, которые я называю в моем приложении:AVAudioSession overrideOutputAudioPort & localNotifications in mute

func PlaySound (WhenToPlaySound:String) { 

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil) 
    AVAudioSession.sharedInstance().setActive(true, error: nil) 

    if WhenToPlaySound == "BeginningOfRound" { 

     if UIApplication.sharedApplication().applicationState == UIApplicationState.Background { 

      soundnotification.soundName = "BoxingBellStart.wav" 

      UIApplication.sharedApplication().scheduleLocalNotification(soundnotification) 

      println("timer is done in background mode") 

     } else { 

      // Load Sound 
      soundlocation = NSBundle.mainBundle().URLForResource("BoxingBellStart", withExtension: "wav")! 
      player = AVAudioPlayer(contentsOfURL: soundlocation, error: &Error) 
      player.volume = 1.0 

      // Play Sound 
      player.play() 

      println("timer is done in active mode") 

     } 

    } else { 

     if UIApplication.sharedApplication().applicationState == UIApplicationState.Background { 

      soundnotification.soundName = "Boxing.wav" 

      UIApplication.sharedApplication().scheduleLocalNotification(soundnotification) 

      println("timer is done in background mode") 

     } else { 

      // Load Sound 
      soundlocation = NSBundle.mainBundle().URLForResource("Boxing", withExtension: "wav")! 
      player = AVAudioPlayer(contentsOfURL: soundlocation, error: &Error) 
      player.volume = 1.0 

      // Play Sound 
      player.play() 

      println("timer is done in active mode") 

     } 

    } 
} 

В основном это работает, за исключением двух вещей:

1. Я не могу показаться, чтобы переопределить громкость динамика. Я хочу, чтобы громкость системы была полной, прежде чем я начну воспроизводить звук.

  1. LocalNotifications, которые активируются, когда приложение находится в фоновом режиме, платит только тогда, когда устройство не отключено.

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

AVAudioSession.sharedInstance().overrideOutputAudioPort(<#portOverride: AVAudioSessionPortOverride#>, error: <#NSErrorPointer#>) 

Заранее спасибо, Ace

ответ

1

overrideOutputAudioPort влияет на звук маршрутизации, не громкость.

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

Свойство volume AVAudioPlayer устанавливает громкость относительно на уровень выходного сигнала системы. По умолчанию он равен 1.0 (громкость проигрывателя = системный том). Вы не можете его повышать, стиль спинального крана, до 1,1 ...

См. Также мой ответ here ... если вы хотите взять под контроль системный том, вам понадобится пользовательский интерфейс, предоставляемый MPVolumeView.

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

обновление
относительно уведомлений, это не так просто, как я предложил. Это может сработать, если вы установите категорию AVAudioSession в AVAudioSessionCategoryPlaybackread the apple docs on this setting).

При использовании этой категории, ваше приложение аудио продолжает Тихий переключатель установлен беззвучный режим или когда блокировки экрана

Вы также можете добавить «аудио», чтобы UIBackgroundModes в вашем info.plist.

+0

Я обновил пункт 1. –

+0

относительно пункта 2. Я заметил, что еще одно приложение достигло локальных звуков уведомлений, даже если устройство в молчании. Если громкость отключена, то она не работает, но с громкостью и тишиной воспроизводится звук уведомления. –

+0

@AceGreen - см. Мое обновление. Что касается точки 1, вы не можете изменить системный том без взаимодействия с пользователем (например, через MPVolumeView). – foundry