diff --git a/submodules/TelegramAudio/Sources/ManagedAudioSession.swift b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift index c8f22b86de..669dda2c76 100644 --- a/submodules/TelegramAudio/Sources/ManagedAudioSession.swift +++ b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift @@ -823,14 +823,14 @@ public final class ManagedAudioSession { print("\(CFAbsoluteTimeGetCurrent()) AudioSession activate: \((CFAbsoluteTimeGetCurrent() - startTime) * 1000.0) ms") - self.updateCurrentAudioRouteInfo() - - print("\(CFAbsoluteTimeGetCurrent()) AudioSession updateCurrentAudioRouteInfo: \((CFAbsoluteTimeGetCurrent() - startTime) * 1000.0) ms") - try self.setupOutputMode(outputMode, type: type) print("\(CFAbsoluteTimeGetCurrent()) AudioSession setupOutputMode: \((CFAbsoluteTimeGetCurrent() - startTime) * 1000.0) ms") + self.updateCurrentAudioRouteInfo() + + print("\(CFAbsoluteTimeGetCurrent()) AudioSession updateCurrentAudioRouteInfo: \((CFAbsoluteTimeGetCurrent() - startTime) * 1000.0) ms") + if case .voiceCall = type { try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(0.005) } diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index c165bb7ca7..05f5801db0 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -463,6 +463,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { if !audioSession.getIsHeadsetPluggedIn() { self.currentSelectedAudioOutputValue = .speaker + self.audioOutputStatePromise.set(.single(([], .speaker))) } self.audioSessionDisposable = audioSession.push(audioSessionType: .voiceCall, manualActivate: { [weak self] control in @@ -493,7 +494,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { if !didReceiveAudioOutputs { didReceiveAudioOutputs = true if currentOutput == .speaker { - signal = .single((availableOutputs, .builtin)) + signal = .single((availableOutputs, .speaker)) |> then( signal |> delay(1.0, queue: Queue.mainQueue()) @@ -989,6 +990,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { strongSelf.stateValue.adminIds = adminIds + strongSelf.stateValue.canManageCall = state.isCreator || adminIds.contains(strongSelf.accountContext.account.peerId) if (state.isCreator || strongSelf.stateValue.adminIds.contains(strongSelf.accountContext.account.peerId)) && state.defaultParticipantsAreMuted.canChange { strongSelf.stateValue.defaultParticipantMuteState = state.defaultParticipantsAreMuted.isMuted ? .muted : .unmuted } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index 90cc296dde..a93c391e3d 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -907,10 +907,14 @@ public final class VoiceChatController: ViewController { guard let strongSelf = self else { return } + let wasEmpty = strongSelf.audioOutputState == nil strongSelf.audioOutputState = state if let (layout, navigationHeight) = strongSelf.validLayout { strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .immediate) } + if wasEmpty { + strongSelf.controller?.audioOutputStateReady.set(true) + } }) self.audioLevelsDisposable = (call.audioLevels @@ -1846,6 +1850,7 @@ public final class VoiceChatController: ViewController { fileprivate let contentsReady = ValuePromise(false, ignoreRepeated: true) fileprivate let dataReady = ValuePromise(false, ignoreRepeated: true) + fileprivate let audioOutputStateReady = ValuePromise(false, ignoreRepeated: true) private let _ready = Promise(false) override public var ready: Promise { return self._ready @@ -1881,7 +1886,8 @@ public final class VoiceChatController: ViewController { self._ready.set(combineLatest([ self.contentsReady.get(), - self.dataReady.get() + self.dataReady.get(), + self.audioOutputStateReady.get() ]) |> map { values -> Bool in for value in values { diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index c42b9760f5..7cceb32127 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -2975,7 +2975,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP case let .groupCall(flags, _, _, _, _, _): let isMuted = (flags & (1 << 1)) != 0 let canChange = (flags & (1 << 2)) != 0 - let defaultParticipantsAreMuted = GroupCallParticipantsContext.State.DefaultParticipantsAreMuted(isMuted: isMuted, canChange: isMuted) + let defaultParticipantsAreMuted = GroupCallParticipantsContext.State.DefaultParticipantsAreMuted(isMuted: isMuted, canChange: canChange) updatedGroupCallParticipants.append(( info.id, .call(isTerminated: false, defaultParticipantsAreMuted: defaultParticipantsAreMuted)