So a bit more detail on the problem. I'm using LiveKit, and it looks like the SDK configures some parts of the audio session. Currently the bluetooth accessories work like a audio call (mute/unmute) rather than like a PPT channel (I would expect transmit/stop transmitting).
Here is the default configuration the Livekit SDK does
https://github.com/livekit/client-sdk-swift/blob/1f5959f787805a4b364f228ccfb413c1c4944748/Sources/LiveKit/Track/AudioManager.swift#L153
DispatchQueue.webRTC.async { [weak self] in
guard let self = self else { return }
// prepare config
let configuration = RTCAudioSessionConfiguration.webRTC()
var categoryOptions: AVAudioSession.CategoryOptions = []
if newState.trackState == .remoteOnly && newState.preferSpeakerOutput {
configuration.category = AVAudioSession.Category.playback.rawValue
configuration.mode = AVAudioSession.Mode.spokenAudio.rawValue
} else if [.localOnly, .localAndRemote].contains(newState.trackState) ||
(newState.trackState == .remoteOnly && !newState.preferSpeakerOutput) {
configuration.category = AVAudioSession.Category.playAndRecord.rawValue
if newState.preferSpeakerOutput {
// use .videoChat if speakerOutput is preferred
configuration.mode = AVAudioSession.Mode.videoChat.rawValue
} else {
// use .voiceChat if speakerOutput is not preferred
configuration.mode = AVAudioSession.Mode.voiceChat.rawValue
}
categoryOptions = [.allowBluetooth, .allowBluetoothA2DP]
} else {
configuration.category = AVAudioSession.Category.soloAmbient.rawValue
configuration.mode = AVAudioSession.Mode.default.rawValue
}
configuration.categoryOptions = categoryOptions
var setActive: Bool?
if newState.trackState != .none, oldState.trackState == .none {
// activate audio session when there is any local/remote audio track
setActive = true
} else if newState.trackState == .none, oldState.trackState != .none {
// deactivate audio session when there are no more local/remote audio tracks
setActive = false
}
// configure session
let session = RTCAudioSession.sharedInstance()
session.lockForConfiguration()
// always unlock
defer { session.unlockForConfiguration() }
do {
self.log("configuring audio session category: \(configuration.category), mode: \(configuration.mode), setActive: \(String(describing: setActive))")
if let setActive = setActive {
try session.setConfiguration(configuration, active: setActive)
} else {
try session.setConfiguration(configuration)
}
} catch let error {
self.log("Failed to configure audio session with error: \(error)", .error)
}
}
}
#endif
}
Its possible to override, but there is no enum element for pushToTalk. Can I get any help? This has been very hard to get to a working example of what's claimed in the documentation: "accessory button events map to begin and end transmission actions"
https://developer.apple.com/documentation/pushtotalk/ptchannelmanager/setaccessorybuttoneventsenabled%28_:channeluuid:completionhandler:%29?language=objc
Thank you
Topic:
App & System Services
SubTopic:
Core OS
Tags: