2017-10-21 3 views
2

アプリにフォーカスがない状態でバックグラウンドオーディオを許可します。私は現在、それを可能にしなければならない、このコードを、持っている:Swiftでバックグラウンドオーディオを使用できないようにする

do { 
    try AKSettings.setSession(category: .playback, with: .mixWithOthers) 
} catch { 
    print("error") 
} 
AKSettings.playbackWhileMuted = true 

私も能力の設定で有効になって「ピクチャーオーディオ、エアプレイと絵」を設定しています。しかし、自分のデバイスのホームボタンを押すと、オーディオは再生されません。私は間違って何をしていますか?私はAudioKitを使用して音を出すことが重要です。

私はAudioPlayer.swiftという名前のAudioKitコンポーネントをすべて格納するためにシングルトンを使用しています。ここで私は私のAudioPlayer.swiftシングルトンファイル内に持っているものです。

class AudioPlayer: NSObject { 
    var currentFrequency = String() 
    var soundIsPlaying = false 

    var leftOscillator = AKOscillator() 
    var rightOscillator = AKOscillator() 

    var rain = try! AKAudioFile() 
    var rainPlayer: AKAudioPlayer! 

    var envelope = AKAmplitudeEnvelope() 

    override init() { 
     super.init() 

     do { 
      try AKSettings.setSession(category: .playback, with: .mixWithOthers) 
     } catch { 
      print("error") 
     } 
     AKSettings.playbackWhileMuted = true 

     AudioKit.output = envelope 
     AudioKit.start() 
    } 

    func setupFrequency(left: AKOscillator, right: AKOscillator, frequency: String) { 
     currentFrequency = frequency 

     leftOscillator = left 
     rightOscillator = right 

     let leftPanner = AKPanner(leftOscillator) 
     leftPanner.pan = -1 

     let rightPanner = AKPanner(rightOscillator) 
     rightPanner.pan = 1 

     //Set up rain and rainPlayer 
     do { 
      rain = try AKAudioFile(readFileName: "rain.wav") 
      rainPlayer = try AKAudioPlayer(file: rain, looping: true, deferBuffering: false, completionHandler: nil) 
     } catch { print(error) } 

     let mixer = AKMixer(leftPanner, rightPanner, rainPlayer) 

     //Put mixer in sound envelope 
     envelope = AKAmplitudeEnvelope(mixer) 
     envelope.attackDuration = 2.0 
     envelope.decayDuration = 0 
     envelope.sustainLevel = 1 
     envelope.releaseDuration = 0.2 

     //Start AudioKit stuff 
     AudioKit.output = envelope 
     AudioKit.start() 
     leftOscillator.start() 
     rightOscillator.start() 
     rainPlayer.start() 
     envelope.start() 
     soundIsPlaying = true 
    } 
} 

をそしてここでそれを一定の周波数を送信するためにAudioKitシングルトンを参照して私のサウンドエフェクトビューコントローラの1の例である(私はについて持っていますこれらのビューコントローラのダース、独自の周波数設定で、それぞれ):

class CalmView: UIViewController { 
    let leftOscillator = AKOscillator() 
    let rightOscillator = AKOscillator() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     leftOscillator.amplitude = 0.3 
     leftOscillator.frequency = 220 

     rightOscillator.amplitude = 0.3 
     rightOscillator.frequency = 230 
    } 

    @IBAction func playSound(_ sender: Any) { 
     if shared.soundIsPlaying == false { 
      AudioKit.stop() 
      shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm") 
     } else if shared.soundIsPlaying == true && shared.currentFrequency != "Calm" { 
      AudioKit.stop() 
      shared.leftOscillator.stop() 
      shared.rightOscillator.stop() 
      shared.rainPlayer.stop() 
      shared.envelope.stop() 
      shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm") 
     } else { 
      shared.soundIsPlaying = false 
      shared.envelope.stop() 
     } 
    } 
} 

私はViewController.swiftファイルにAudioPlayerシングルトンをインスタンス化。

+1

十分なコードを持っているとあまりにも多くの間に細かい線があります。あなたが尋ねた質問は以下に答えられました。あなたは物事が正しく設定されているようです。 AudioKitの例であるSongProcessorをテストして、それが正しい振る舞いをしているかどうかを確認してから、コードを比較してください。ショートカットや簡単な解決方法はありません。 –

答えて

2

これは、AudioKitの起動時との関係でいつ設定しているかによって異なります。 AudioKitを使用している場合は、AKSettingsを使用してセッションカテゴリを管理する必要があります。基本的には、再生カテゴリだけでなく、mixWithOthers。デフォルトでは、このん:

/// Set the audio session type 
@objc open static func setSession(category: SessionCategory, 
          with options: AVAudioSessionCategoryOptions = [.mixWithOthers]) throws { 

ですから、あなたのViewControllerにこのような何かをしたい:

do { 
     if #available(iOS 10.0, *) { 
      try AKSettings.setSession(category: .playAndRecord, with: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP]) 
     } else { 
      // Fallback on earlier versions 
     } 
    } catch { 
     print("Errored setting category.") 
    } 

だから私はまっすぐにすることを得ることのその問題を考えます。また、アプリ間のオーディオを設定するのに役立つかもしれません。あなたにまだ問題があり、より多くの情報を提供するなら、私はもっと助けることができますが、これはあなたがこれまでに与えた情報に基づいて私が訴えることができるほど良い答えです。

+0

これらの設定を設定した後、AudioKitを起動する必要がありますか?今はViewController.swiftにこのコードがありますが、別のView ControllerでAudioKitを起動します。それは問題を引き起こしているのでしょうか? – 5AMWE5T

+1

AudioKitはおそらくあなたがやっている設定を上書きするでしょう。私はビューコントローラでオーディオを行うことを推奨しません。その代わりに、オーディオ用のシングルトンクラスを作成します。これをエンジンまたは指揮者と呼び、すべてのビューコントローラから参照することがあります。ビューコントローラのライフサイクルをオーディオエンジンの状態に影響させたくない場合。 –

+0

私は自分のオーディオプレーヤーをシングルトンに持っていて、オリジナルのポストからそのコードを移動しましたが、問題はまだ残っています。 – 5AMWE5T

関連する問題