From a05880aa6f6b8e932ce13d4548febbe108ef8c4b Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 15 Mar 2021 20:40:37 +0400 Subject: [PATCH] Voice chat improvements --- .../voip_group_recording_started.mp3 | Bin 0 -> 17616 bytes .../Resources/voip_group_unmuted.mp3 | Bin 0 -> 15744 bytes .../Sources/PresentationCallManager.swift | 7 ++++ .../Sources/PresentationCallToneData.swift | 7 +++- .../Sources/PresentationGroupCall.swift | 39 ++++++++++++++---- .../Sources/VoiceChatController.swift | 1 + .../TelegramCore/Sources/GroupCalls.swift | 22 +++++++--- 7 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 Telegram/Telegram-iOS/Resources/voip_group_recording_started.mp3 create mode 100644 Telegram/Telegram-iOS/Resources/voip_group_unmuted.mp3 diff --git a/Telegram/Telegram-iOS/Resources/voip_group_recording_started.mp3 b/Telegram/Telegram-iOS/Resources/voip_group_recording_started.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0060e82c3737b9fefb3d3cc59a240cfdcf458f54 GIT binary patch literal 17616 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/voip_group_unmuted.mp3 b/Telegram/Telegram-iOS/Resources/voip_group_unmuted.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b5dfaa606c912db5c22a97611a8a5755bbc1a702 GIT binary patch literal 15744 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 literal 0 HcmV?d00001 diff --git a/submodules/AccountContext/Sources/PresentationCallManager.swift b/submodules/AccountContext/Sources/PresentationCallManager.swift index a9d3693875..44602ffedb 100644 --- a/submodules/AccountContext/Sources/PresentationCallManager.swift +++ b/submodules/AccountContext/Sources/PresentationCallManager.swift @@ -286,6 +286,11 @@ public final class PresentationGroupCallMemberEvent { } } +public enum PresentationGroupCallTone { + case unmuted + case recordingStarted +} + public protocol PresentationGroupCall: class { var account: Account { get } var accountContext: AccountContext { get } @@ -321,6 +326,8 @@ public protocol PresentationGroupCall: class { func setVolume(peerId: PeerId, volume: Int32, sync: Bool) func setFullSizeVideo(peerId: PeerId?) func setCurrentAudioOutput(_ output: AudioSessionOutput) + + func playTone(_ tone: PresentationGroupCallTone) func updateMuteState(peerId: PeerId, isMuted: Bool) -> GroupCallParticipantsContext.Participant.MuteState? func setShouldBeRecording(_ shouldBeRecording: Bool, title: String?) diff --git a/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift index b8efbdfd14..065a6939d7 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift @@ -74,7 +74,7 @@ private func loadToneData(name: String, addSilenceDuration: Double = 0.0) -> Dat return data } -enum PresentationCallTone { +enum PresentationCallTone: Equatable { case ringing case connecting case busy @@ -83,6 +83,7 @@ enum PresentationCallTone { case groupJoined case groupLeft case groupConnecting + case custom(name: String, loopCount: Int?) var loopCount: Int? { switch self { @@ -96,6 +97,8 @@ enum PresentationCallTone { return 1 case .groupConnecting: return nil + case let .custom(_, loopCount): + return loopCount default: return nil } @@ -120,5 +123,7 @@ func presentationCallToneData(_ tone: PresentationCallTone) -> Data? { return loadToneData(name: "voip_group_left.mp3") case .groupConnecting: return loadToneData(name: "voip_group_connecting.mp3", addSilenceDuration: 2.0) + case let .custom(name, _): + return loadToneData(name: name) } } diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index db86ace852..6b0bcba7e5 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -100,7 +100,8 @@ public final class AccountGroupCallContextImpl: AccountGroupCallContext { myPeerId: account.peerId, id: call.id, accessHash: call.accessHash, - state: state + state: state, + previousServiceState: nil ) strongSelf.participantsContext = context @@ -842,7 +843,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } } if let sourceContext = sourceContext, let initialState = sourceContext.immediateState { - let temporaryParticipantsContext = GroupCallParticipantsContext(account: self.account, peerId: self.peerId, myPeerId: myPeerId, id: sourceContext.id, accessHash: sourceContext.accessHash, state: initialState) + let temporaryParticipantsContext = GroupCallParticipantsContext(account: self.account, peerId: self.peerId, myPeerId: myPeerId, id: sourceContext.id, accessHash: sourceContext.accessHash, state: initialState, previousServiceState: sourceContext.serviceState) self.temporaryParticipantsContext = temporaryParticipantsContext self.participantsContextStateDisposable.set((combineLatest(queue: .mainQueue(), myPeer, @@ -1364,8 +1365,10 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { let myPeerId = self.joinAsPeerId var initialState = initialState + var serviceState: GroupCallParticipantsContext.ServiceState? if let participantsContext = self.participantsContext, let immediateState = participantsContext.immediateState { initialState.mergeActivity(from: immediateState, myPeerId: myPeerId, previousMyPeerId: self.ignorePreviousJoinAsPeerId?.0) + serviceState = participantsContext.serviceState } let participantsContext = GroupCallParticipantsContext( @@ -1374,7 +1377,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { myPeerId: self.joinAsPeerId, id: callInfo.id, accessHash: callInfo.accessHash, - state: initialState + state: initialState, + previousServiceState: serviceState ) self.temporaryParticipantsContext = nil self.participantsContext = participantsContext @@ -1397,6 +1401,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { guard let strongSelf = self else { return } + + strongSelf.participantsContext?.updateAdminIds(adminIds) var topParticipants: [GroupCallParticipantsContext.Participant] = [] @@ -1480,6 +1486,12 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { if let ssrc = participant.ssrc { strongSelf.ssrcMapping[ssrc] = participant.peer.id } + + var filteredMuteState = participant.muteState + if isReconnectingAsSpeaker || strongSelf.currentConnectionMode != .rtc { + filteredMuteState = GroupCallParticipantsContext.Participant.MuteState(canUnmute: false, mutedByYou: false) + participant.muteState = filteredMuteState + } if participant.peer.id == strongSelf.joinAsPeerId { let previousRaisedHand = strongSelf.stateValue.raisedHand @@ -1512,15 +1524,10 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { text = presentationData.strings.VoiceChat_YouCanNowSpeak } strongSelf.accountContext.sharedContext.mainWindow?.present(UndoOverlayController(presentationData: presentationData, content: .voiceChatCanSpeak(text: text), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return true }), on: .root, blockInteraction: false, completion: {}) + strongSelf.playTone(.unmuted) } }) } - - var filteredMuteState = participant.muteState - if isReconnectingAsSpeaker || strongSelf.currentConnectionMode != .rtc { - filteredMuteState = GroupCallParticipantsContext.Participant.MuteState(canUnmute: false, mutedByYou: false) - participant.muteState = filteredMuteState - } if let muteState = filteredMuteState { if muteState.canUnmute { @@ -1733,6 +1740,20 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.toneRenderer?.setAudioSessionActive(value) } } + + public func playTone(_ tone: PresentationGroupCallTone) { + let name: String + switch tone { + case .unmuted: + name = "voip_group_unmuted.mp3" + case .recordingStarted: + name = "voip_group_recording_started.mp3" + } + + let toneRenderer = PresentationCallToneRenderer(tone: .custom(name: name, loopCount: 1)) + self.toneRenderer = toneRenderer + toneRenderer.setAudioSessionActive(self.isAudioSessionActive) + } private func markAsCanBeRemoved() { if self.markedAsCanBeRemoved { diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index a3b6703637..b2aca25481 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -1874,6 +1874,7 @@ public final class VoiceChatController: ViewController { strongSelf.call.setShouldBeRecording(true, title: title) strongSelf.presentUndoOverlay(content: .voiceChatRecording(text: strongSelf.presentationData.strings.VoiceChat_RecordingStarted), action: { _ in return false }) + strongSelf.call.playTone(.recordingStarted) } }) self?.controller?.present(controller, in: .window(.root)) diff --git a/submodules/TelegramCore/Sources/GroupCalls.swift b/submodules/TelegramCore/Sources/GroupCalls.swift index 93ce8fb5aa..a57cded5ed 100644 --- a/submodules/TelegramCore/Sources/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/GroupCalls.swift @@ -1015,20 +1015,26 @@ public final class GroupCallParticipantsContext { private var isLoadingMore: Bool = false private var shouldResetStateFromServer: Bool = false private var missingSsrcs = Set() - - private var nextActivityRank: Int = 0 + private var activityRankResetTimer: SwiftSignalKit.Timer? private let updateDefaultMuteDisposable = MetaDisposable() private let updateShouldBeRecordingDisposable = MetaDisposable() + + public struct ServiceState { + fileprivate var nextActivityRank: Int = 0 + } + + public private(set) var serviceState: ServiceState - public init(account: Account, peerId: PeerId, myPeerId: PeerId, id: Int64, accessHash: Int64, state: State) { + public init(account: Account, peerId: PeerId, myPeerId: PeerId, id: Int64, accessHash: Int64, state: State, previousServiceState: ServiceState?) { self.account = account self.myPeerId = myPeerId self.id = id self.accessHash = accessHash self.stateValue = InternalState(state: state, overlayState: OverlayState()) self.statePromise = ValuePromise(self.stateValue) + self.serviceState = previousServiceState ?? ServiceState() self.updatesDisposable.set((self.account.stateManager.groupCallParticipantUpdates |> deliverOnMainQueue).start(next: { [weak self] updates in @@ -1167,10 +1173,16 @@ public final class GroupCallParticipantsContext { } private func takeNextActivityRank() -> Int { - let value = self.nextActivityRank - self.nextActivityRank += 1 + let value = self.serviceState.nextActivityRank + self.serviceState.nextActivityRank += 1 return value } + + public func updateAdminIds(_ adminIds: Set) { + if self.stateValue.state.adminIds != adminIds { + self.stateValue.state.adminIds = adminIds + } + } public func reportSpeakingParticipants(ids: [PeerId: UInt32]) { if !ids.isEmpty {