mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Temporary fix for audio delay
This commit is contained in:
parent
ee64afdf1a
commit
eac7b8d948
@ -19,18 +19,23 @@ public enum ManagedAudioSessionType: Equatable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func nativeCategoryForType(_ type: ManagedAudioSessionType, headphones: Bool) -> AVAudioSession.Category {
|
private func nativeCategoryForType(_ type: ManagedAudioSessionType, headphones: Bool, outputMode: AudioSessionOutputMode) -> AVAudioSession.Category {
|
||||||
switch type {
|
switch type {
|
||||||
case .play:
|
case .play:
|
||||||
|
return .playback
|
||||||
|
case .record, .voiceCall:
|
||||||
|
return .playAndRecord
|
||||||
|
case .playWithPossiblePortOverride:
|
||||||
|
if headphones {
|
||||||
return .playback
|
return .playback
|
||||||
case .record, .voiceCall:
|
} else {
|
||||||
return .playAndRecord
|
switch outputMode {
|
||||||
case .playWithPossiblePortOverride:
|
case .custom(.speaker), .system:
|
||||||
if headphones {
|
|
||||||
return .playback
|
|
||||||
} else {
|
|
||||||
return .playAndRecord
|
return .playAndRecord
|
||||||
|
default:
|
||||||
|
return .playback
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -638,25 +643,29 @@ public final class ManagedAudioSession {
|
|||||||
self.currentTypeAndOutputMode = (type, outputMode)
|
self.currentTypeAndOutputMode = (type, outputMode)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
print("ManagedAudioSession setting category for \(type)")
|
let nativeCategory = nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue, outputMode: outputMode)
|
||||||
|
|
||||||
|
print("ManagedAudioSession setting category for \(type) (native: \(nativeCategory))")
|
||||||
var options: AVAudioSession.CategoryOptions = []
|
var options: AVAudioSession.CategoryOptions = []
|
||||||
switch type {
|
switch type {
|
||||||
case .play:
|
case .play:
|
||||||
break
|
break
|
||||||
case .playWithPossiblePortOverride:
|
case .playWithPossiblePortOverride:
|
||||||
if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
|
if case .playAndRecord = nativeCategory {
|
||||||
options.insert(.allowBluetoothA2DP)
|
if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
|
||||||
} else {
|
options.insert(.allowBluetoothA2DP)
|
||||||
options.insert(.allowBluetooth)
|
} else {
|
||||||
|
options.insert(.allowBluetooth)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case .record, .voiceCall:
|
case .record, .voiceCall:
|
||||||
options.insert(.allowBluetooth)
|
options.insert(.allowBluetooth)
|
||||||
}
|
}
|
||||||
print("ManagedAudioSession setting active true")
|
print("ManagedAudioSession setting active true")
|
||||||
if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
|
if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
|
||||||
try AVAudioSession.sharedInstance().setCategory(nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue), mode: type == .voiceCall ? .voiceChat : .default, policy: .default, options: options)
|
try AVAudioSession.sharedInstance().setCategory(nativeCategory, mode: type == .voiceCall ? .voiceChat : .default, policy: .default, options: options)
|
||||||
} else {
|
} else {
|
||||||
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue))
|
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: nativeCategory)
|
||||||
try AVAudioSession.sharedInstance().setMode(type == .voiceCall ? .voiceChat : .default)
|
try AVAudioSession.sharedInstance().setMode(type == .voiceCall ? .voiceChat : .default)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
@ -684,43 +693,39 @@ public final class ManagedAudioSession {
|
|||||||
print("ManagedAudioSession setup \(outputMode) for \(type)")
|
print("ManagedAudioSession setup \(outputMode) for \(type)")
|
||||||
var resetToBuiltin = false
|
var resetToBuiltin = false
|
||||||
switch outputMode {
|
switch outputMode {
|
||||||
case .system:
|
case .system:
|
||||||
resetToBuiltin = true
|
resetToBuiltin = true
|
||||||
case let .custom(output):
|
case let .custom(output):
|
||||||
switch output {
|
switch output {
|
||||||
case .builtin:
|
case .builtin:
|
||||||
resetToBuiltin = true
|
resetToBuiltin = true
|
||||||
case .speaker:
|
case .speaker:
|
||||||
if type == .voiceCall {
|
if type == .voiceCall {
|
||||||
if let routes = AVAudioSession.sharedInstance().availableInputs {
|
|
||||||
for route in routes {
|
|
||||||
if route.portType == .builtInMic {
|
|
||||||
let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
|
|
||||||
case .headphones:
|
|
||||||
break
|
|
||||||
case let .port(port):
|
|
||||||
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
|
|
||||||
if let routes = AVAudioSession.sharedInstance().availableInputs {
|
if let routes = AVAudioSession.sharedInstance().availableInputs {
|
||||||
for route in routes {
|
for route in routes {
|
||||||
if route.uid == port.uid {
|
if route.portType == .builtInMic {
|
||||||
let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route)
|
let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case .speakerIfNoHeadphones:
|
|
||||||
if !self.isHeadsetPluggedInValue {
|
|
||||||
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
|
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
|
||||||
} else {
|
case .headphones:
|
||||||
|
break
|
||||||
|
case let .port(port):
|
||||||
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
|
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
|
||||||
}
|
if let routes = AVAudioSession.sharedInstance().availableInputs {
|
||||||
|
for route in routes {
|
||||||
|
if route.uid == port.uid {
|
||||||
|
let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case .speakerIfNoHeadphones:
|
||||||
|
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
|
||||||
}
|
}
|
||||||
|
|
||||||
if resetToBuiltin {
|
if resetToBuiltin {
|
||||||
@ -778,9 +783,11 @@ public final class ManagedAudioSession {
|
|||||||
|
|
||||||
private func updateOutputMode(_ outputMode: AudioSessionOutputMode) {
|
private func updateOutputMode(_ outputMode: AudioSessionOutputMode) {
|
||||||
if let (type, currentOutputMode) = self.currentTypeAndOutputMode, currentOutputMode != outputMode {
|
if let (type, currentOutputMode) = self.currentTypeAndOutputMode, currentOutputMode != outputMode {
|
||||||
self.currentTypeAndOutputMode = (type, outputMode)
|
//self.currentTypeAndOutputMode = (type, outputMode)
|
||||||
do {
|
do {
|
||||||
try self.setupOutputMode(outputMode, type: type)
|
try self.setup(type: type, outputMode: outputMode, activateNow: true)
|
||||||
|
//try self.setupOutputMode(outputMode, type: type)
|
||||||
|
//try self.activate()
|
||||||
} catch let error {
|
} catch let error {
|
||||||
print("ManagedAudioSession overrideOutputAudioPort error \(error)")
|
print("ManagedAudioSession overrideOutputAudioPort error \(error)")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user