Files
openclaw-openclaw/apps/ios/Sources/Voice/TalkDefaults.swift
PollyBot13 8b99c45bbb fix: route iOS OpenAI realtime Talk through WebRTC (#98563)
* 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>
2026-07-02 12:49:23 -07:00

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 }
}
}