質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

【Swift】オーディオ再生まわり(スピーカーやBluetoothなど)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 706

ishicoro

score 24

石ころです。SNSを作っています。
主にBluetooth再生周りで困っています。
下記、ご助言頂けますと大変幸いです。

実現したいこと

(1) Bluetoothイヤホン未装着時
・セルをタップ:スピーカー再生
・近接センサー作動時:iPhone上部のスピーカーから小音量で自動再生(通話の時に使うスピーカーです)

※近接センサーはiPhone上部のセンサーを指し、上を覆い隠すと検知されます。iPhoneを耳元に持ってきたときに検知されるようにしています。

(2) Bluetoothイヤホン装着時
・セルをタップ:Bluetoothイヤホンから再生
・近接センサー作動時:Bluetoothイヤホンから再生

まず、(1)を実現するために、次のコードを書きました。

コード

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let audioSession = AVAudioSession.sharedInstance()
            do {
                try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
            } catch let error as NSError {
            }
 }
 @objc func proximitySensorStateChanged(){
        if (UIDevice.current.proximityState == true) {
            do{
                let audioSession = AVAudioSession.sharedInstance()
              do {
                    try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
                 } catch let error as NSError {
                    print("audioSession error: \(error.localizedDescription)")
                }   
   //中略:音声再生処理を記載しています
} catch {}
}
}


上記コードにより、冒頭の(1)は問題なく実現できます。
次に、Bluetooth再生を可能にするために、下記のコードを追記しました。

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   (追記始まり)---------------------------------
      do{
            try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: AVAudioSession.CategoryOptions.mixWithOthers)
     //mixWithOthersをallowBluetoothやduckOthersに変えてみても結果は同じ
        } catch {
        }
   (追記終わり)---------------------------------------
           let audioSession = AVAudioSession.sharedInstance()
            do {
                try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
            } catch let error as NSError {
            }
 }


上記により、Bluetooth再生は問題なく出来るようになる代わりに、この状態でiPhoneのBluetoothをOFFにし、一度セルタップ再生をした後に近接センサーを覆い隠し再生させると、上部スピーカーでの小音再生ではなく、通常スピーカーの大音量再生になってしまいます。

一度でもAVAudioSession.CategoryOptions.mixWithOthersが実行されてしまうと、近接センサー再生では通常スピーカー再生になってしまうようです。

お気付きの点ございましたら、お手数ですが、アドバイス頂けますと幸いです。
よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る