diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 4951e7d50d..2e2eebedb2 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -361,19 +361,20 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { return } if case let .estabilished(callInfo, _, _, _) = strongSelf.internalState { - /*var addedSsrc: [UInt32] = [] - var removedSsrc: [UInt32] = []*/ + var removedSsrc: [UInt32] = [] for (callId, update) in updates { if callId == callInfo.id { + for participantUpdate in update.participantUpdates { + if participantUpdate.isRemoved { + removedSsrc.append(participantUpdate.ssrc) + } + } strongSelf.participantsContext?.addUpdates(updates: [update]) } } - /*if !addedSsrc.isEmpty { - strongSelf.callContext?.addSsrcs(ssrcs: addedSsrc) - } if !removedSsrc.isEmpty { strongSelf.callContext?.removeSsrcs(ssrcs: removedSsrc) - }*/ + } } }) diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index 74e31ccab7..5e9725a331 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -536,7 +536,7 @@ public final class VoiceChatController: ViewController { let wasMuted = strongSelf.callState?.muteState != nil strongSelf.callState = state - if state.muteState != nil { + if let muteState = state.muteState, !muteState.canUnmute { if strongSelf.pushingToTalk { strongSelf.pushingToTalk = false strongSelf.actionButton.pressing = false diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index 993683e805..25b1850d06 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -32,22 +32,15 @@ public final class OngoingGroupCallContext { case connected } - public struct MemberState: Equatable { - public var isSpeaking: Bool - } - private final class Impl { let queue: Queue let context: GroupCallThreadLocalContext let sessionId = UInt32.random(in: 0 ..< UInt32(Int32.max)) - var mainStreamAudioSsrc: UInt32? - var otherSsrcs: [UInt32] = [] let joinPayload = Promise<(String, UInt32)>() let networkState = ValuePromise(.connecting, ignoreRepeated: true) let isMuted = ValuePromise(true, ignoreRepeated: true) - let memberStates = ValuePromise<[UInt32: MemberState]>([:], ignoreRepeated: true) let audioLevels = ValuePipe<[(UInt32, Float)]>() let myAudioLevel = ValuePipe() @@ -118,7 +111,6 @@ public final class OngoingGroupCallContext { guard let strongSelf = self else { return } - strongSelf.mainStreamAudioSsrc = ssrc strongSelf.joinPayload.set(.single((payload, ssrc))) } }) @@ -130,58 +122,15 @@ public final class OngoingGroupCallContext { } func addSsrcs(ssrcs: [UInt32]) { - if ssrcs.isEmpty { - return - } - guard let mainStreamAudioSsrc = self.mainStreamAudioSsrc else { - return - } - let mappedSsrcs = ssrcs - var otherSsrcs = self.otherSsrcs - for ssrc in mappedSsrcs { - if ssrc == mainStreamAudioSsrc { - continue - } - if !otherSsrcs.contains(ssrc) { - otherSsrcs.append(ssrc) - } - } - if self.otherSsrcs != otherSsrcs { - self.otherSsrcs = otherSsrcs - var memberStatesValue: [UInt32: MemberState] = [:] - for ssrc in otherSsrcs { - memberStatesValue[ssrc] = MemberState(isSpeaking: false) - } - self.memberStates.set(memberStatesValue) - - self.context.setSsrcs(self.otherSsrcs.map { ssrc in - return ssrc as NSNumber - }) - } } func removeSsrcs(ssrcs: [UInt32]) { if ssrcs.isEmpty { return } - guard let mainStreamAudioSsrc = self.mainStreamAudioSsrc else { - return - } - var otherSsrcs = self.otherSsrcs.filter { ssrc in - return !ssrcs.contains(ssrc) - } - if self.otherSsrcs != otherSsrcs { - self.otherSsrcs = otherSsrcs - var memberStatesValue: [UInt32: MemberState] = [:] - for ssrc in otherSsrcs { - memberStatesValue[ssrc] = MemberState(isSpeaking: false) - } - self.memberStates.set(memberStatesValue) - - self.context.setSsrcs(self.otherSsrcs.map { ssrc in - return ssrc as NSNumber - }) - } + self.context.removeSsrcs(ssrcs.map { ssrc in + return ssrc as NSNumber + }) } func stop() { @@ -228,18 +177,6 @@ public final class OngoingGroupCallContext { } } - public var memberStates: Signal<[UInt32: MemberState], NoError> { - return Signal { subscriber in - let disposable = MetaDisposable() - self.impl.with { impl in - disposable.set(impl.memberStates.get().start(next: { value in - subscriber.putNext(value) - })) - } - return disposable - } - } - public var audioLevels: Signal<[(UInt32, Float)], NoError> { return Signal { subscriber in let disposable = MetaDisposable() diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 7183673d66..ccce6845fe 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -164,7 +164,7 @@ typedef NS_ENUM(int32_t, GroupCallNetworkState) { - (void)emitJoinPayload:(void (^ _Nonnull)(NSString * _Nonnull, uint32_t))completion; - (void)setJoinResponsePayload:(NSString * _Nonnull)payload; -- (void)setSsrcs:(NSArray * _Nonnull)ssrcs; +- (void)removeSsrcs:(NSArray * _Nonnull)ssrcs; - (void)setIsMuted:(bool)isMuted; - (void)switchAudioOutput:(NSString * _Nonnull)deviceId; diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 5d0c2c69fd..6cf743ec4f 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -1029,13 +1029,13 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; } } -- (void)setSsrcs:(NSArray * _Nonnull)ssrcs { +- (void)removeSsrcs:(NSArray * _Nonnull)ssrcs { if (_instance) { std::vector values; for (NSNumber *ssrc in ssrcs) { values.push_back([ssrc unsignedIntValue]); } - _instance->setSsrcs(values); + _instance->removeSsrcs(values); } } diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index 9e25105d86..1a3df12fbe 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit 9e25105d8662f54b7151070225c5866d0f0a6231 +Subproject commit 1a3df12fbe943fe66df86607a5e6347a0db4cf4f diff --git a/third-party/webrtc/BUILD b/third-party/webrtc/BUILD index 9c2f3f7db7..12e1afaeb5 100644 --- a/third-party/webrtc/BUILD +++ b/third-party/webrtc/BUILD @@ -700,9 +700,12 @@ webrtc_sources = [ "media/engine/simulcast.cc", "media/engine/simulcast_encoder_adapter.cc", "media/engine/unhandled_packets_buffer.cc", + "media/engine/webrtc_media_engine.h", "media/engine/webrtc_media_engine.cc", "media/engine/webrtc_media_engine_defaults.cc", + "media/engine/webrtc_video_engine.h", "media/engine/webrtc_video_engine.cc", + "media/engine/webrtc_voice_engine.h", "media/engine/webrtc_voice_engine.cc", "media/sctp/noop.cc", "media/sctp/sctp_transport.cc", diff --git a/third-party/webrtc/webrtc-ios b/third-party/webrtc/webrtc-ios index facc5cdcc8..7198385cd3 160000 --- a/third-party/webrtc/webrtc-ios +++ b/third-party/webrtc/webrtc-ios @@ -1 +1 @@ -Subproject commit facc5cdcc8792fd1a83f39b14ce5d719c6f44625 +Subproject commit 7198385cd356994e366ea325c84b34e974c9117e