mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-06 19:32:58 +08:00
* fix: route iOS OpenAI realtime talk through WebRTC * fix(ios): harden native realtime routing * fix(ios): preserve realtime route ownership * fix(ios): balance realtime audio sessions * chore(ios): sync native i18n inventory * fix(ios): preserve Azure realtime relay * fix(ios): harden realtime session recovery * chore(ios): sync native i18n inventory * fix(ios): preserve selected Azure realtime routing * fix(ios): rotate terminal realtime sessions --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
35 lines
1.2 KiB
Swift
35 lines
1.2 KiB
Swift
import AVFoundation
|
|
import Foundation
|
|
|
|
enum TalkDefaults {
|
|
static let silenceTimeoutMs = 900
|
|
static let speakerphoneEnabledKey = "talk.speakerphone.enabled"
|
|
static let speakerphoneEnabledByDefault = true
|
|
|
|
static func speakerphoneEnabled(defaults: UserDefaults = .standard) -> Bool {
|
|
guard defaults.object(forKey: self.speakerphoneEnabledKey) != nil else {
|
|
return self.speakerphoneEnabledByDefault
|
|
}
|
|
return defaults.bool(forKey: self.speakerphoneEnabledKey)
|
|
}
|
|
}
|
|
|
|
enum TalkAudioRoute {
|
|
static func categoryOptions(speakerphoneEnabled: Bool) -> AVAudioSession.CategoryOptions {
|
|
var options: AVAudioSession.CategoryOptions = [.allowBluetoothHFP, .allowBluetoothA2DP, .allowAirPlay]
|
|
if speakerphoneEnabled {
|
|
options.insert(.defaultToSpeaker)
|
|
}
|
|
return options
|
|
}
|
|
|
|
static func shouldForceSpeaker(
|
|
preferenceEnabled: Bool,
|
|
outputPortTypes: [AVAudioSession.Port]) -> Bool
|
|
{
|
|
guard preferenceEnabled else { return false }
|
|
guard !outputPortTypes.isEmpty else { return false }
|
|
return outputPortTypes.allSatisfy { $0 == .builtInReceiver || $0 == .builtInSpeaker }
|
|
}
|
|
}
|