lithium
lithium

Reputation: 1302

AVAudioSession and AirPods

It seems that my app is not working with AirPods. Right now I'm using this code for the playback and record:

    let audioSession = AVAudioSession.sharedInstance()
    do { try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker)
    }catch {
        print("audioSession properties weren't set because of an error.")
    }

Will it be enough if I change defaultToSpeaker to allowBluetooth?

P.S. I know it's quite a stupid question because it'd be much simpler to just change this line and check, but I don't have AirPods with me right now, so the only option for me is to upload the new build to Testflight (and I want to do this with minimum iterations).

update: (quite naive approach — but all I need is to use bluetooth headphones if they are available):

func selectDevice(audioSession: AVAudioSession) {

    var headphonesExist = false
    var bluetoothExist = false
    var speakerExist = false

    let currentRoute = AVAudioSession.sharedInstance().currentRoute

    for output in audioSession.currentRoute.outputs {
        print(output)

        if output.portType == AVAudioSessionPortHeadphones || output.portType == AVAudioSessionPortHeadsetMic {
            headphonesExist = true
        }

        if output.portType == AVAudioSessionPortBluetoothA2DP || output.portType == AVAudioSessionPortBluetoothHFP {
            bluetoothExist = true
        }

        if output.portType == AVAudioSessionPortBuiltInSpeaker {
            speakerExist = true
        }
    }

    if bluetoothExist == true {
        do { try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.allowBluetooth) } catch {
            print("error with audiosession: bluetooth")
        }
    }
}

Upvotes: 7

Views: 4684

Answers (2)

Fredric Cliver
Fredric Cliver

Reputation: 195

Here is a full source to request proper permission. All you have to do is to add a mode with '.allowBluetoothA2DP'

I've applied on Swift 5

func requestPermissionForAudioRecording(){
    recordingSession = AVAudioSession.sharedInstance()
    
    do {
      // only with this without options, will not capable with your Airpod, the Bluetooth device.
      //  try recordingSession.setCategory(.playAndRecord, mode: .default)
      try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowAirPlay, .allowBluetoothA2DP])
      try recordingSession.setActive(true)
      recordingSession.requestRecordPermission() { allowed in
        DispatchQueue.main.async {
          if allowed {
            // Recording permission has been allowed
            self.recordingPermissionGranted = true
          } else {
            // failed to record!
          }
        }
      }
    } catch let err {
      // failed to record!
      print("AudioSession couldn't be set!", err)
    }
  }

Upvotes: 4

Thompsonmachine
Thompsonmachine

Reputation: 177

You need to add support for bluetooth to your options parameter like so:

[AVAudioSessionCategoryOptions.defaultToSpeaker, .allowBluetoothA2DP]

.allowBluetoothA2DP will allow for high quality audio output to the bluetooth device and restrict microphone input on said device, while .allowBluetooth will default HFP compatible (input/output) bluetooth devices to the lower quality HFP, which supports microphone input.

Upvotes: 7

Related Questions