diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 496c51c953..d08f1942de 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -951,8 +951,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { var sharedAudioContext = sharedAudioContext if sharedAudioContext == nil { - var useSharedAudio = !isStream - var canReuseCurrent = true + var useSharedAudio = true + var canReuseCurrent = !isStream if let data = self.accountContext.currentAppConfiguration.with({ $0 }).data { if data["ios_killswitch_group_shared_audio"] != nil { useSharedAudio = false @@ -962,8 +962,12 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } } + if isStream { + useSharedAudio = false + } + if useSharedAudio { - let sharedAudioContextValue = SharedCallAudioContext.get(audioSession: audioSession, callKitIntegration: callKitIntegration, defaultToSpeaker: true, reuseCurrent: canReuseCurrent && callKitIntegration == nil) + let sharedAudioContextValue = SharedCallAudioContext.get(audioSession: audioSession, callKitIntegration: callKitIntegration, defaultToSpeaker: true, reuseCurrent: canReuseCurrent && callKitIntegration == nil, enableMicrophone: !isStream) sharedAudioContext = sharedAudioContextValue } } @@ -2077,6 +2081,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } if let genericCallContext = self.genericCallContext { + let callInfo = joinCallResult.callInfo + switch genericCallContext { case let .call(callContext): switch joinCallResult.connectionMode { diff --git a/submodules/TelegramCallsUI/Sources/SharedCallAudioContext.swift b/submodules/TelegramCallsUI/Sources/SharedCallAudioContext.swift index 1ab045575d..4377dd49e2 100644 --- a/submodules/TelegramCallsUI/Sources/SharedCallAudioContext.swift +++ b/submodules/TelegramCallsUI/Sources/SharedCallAudioContext.swift @@ -37,18 +37,18 @@ public final class SharedCallAudioContext { private var proximityManagerIndex: Int? - static func get(audioSession: ManagedAudioSession, callKitIntegration: CallKitIntegration?, defaultToSpeaker: Bool = false, reuseCurrent: Bool = false) -> SharedCallAudioContext { + static func get(audioSession: ManagedAudioSession, callKitIntegration: CallKitIntegration?, defaultToSpeaker: Bool = false, reuseCurrent: Bool = false, enableMicrophone: Bool = true) -> SharedCallAudioContext { if let current = self.current, reuseCurrent { return current } - let context = SharedCallAudioContext(audioSession: audioSession, callKitIntegration: callKitIntegration, defaultToSpeaker: defaultToSpeaker) + let context = SharedCallAudioContext(audioSession: audioSession, callKitIntegration: callKitIntegration, defaultToSpeaker: defaultToSpeaker, enableMicrophone: enableMicrophone) self.current = context return context } - private init(audioSession: ManagedAudioSession, callKitIntegration: CallKitIntegration?, defaultToSpeaker: Bool = false) { + private init(audioSession: ManagedAudioSession, callKitIntegration: CallKitIntegration?, defaultToSpeaker: Bool = false, enableMicrophone: Bool = true) { self.callKitIntegration = callKitIntegration - self.audioDevice = OngoingCallContext.AudioDevice.create(enableSystemMute: false) + self.audioDevice = OngoingCallContext.AudioDevice.create(enableSystemMute: false, enableMicrophone: enableMicrophone) var defaultToSpeaker = defaultToSpeaker if audioSession.getIsHeadsetPluggedIn() { @@ -63,7 +63,7 @@ public final class SharedCallAudioContext { } var didReceiveAudioOutputs = false - self.audioSessionDisposable = audioSession.push(audioSessionType: .voiceCall, manualActivate: { [weak self] control in + self.audioSessionDisposable = audioSession.push(audioSessionType: enableMicrophone ? .voiceCall : .play(mixWithOthers: true), manualActivate: { [weak self] control in Queue.mainQueue().async { guard let self else { return diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift b/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift index 98082d1df4..5a7d07b036 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift @@ -788,6 +788,7 @@ func _internal_joinGroupCall(account: Account, peerId: PeerId?, joinAs: PeerId?, let isVideoEnabled = (flags & (1 << 9)) != 0 let messagesEnabled = (flags & (1 << 17)) != 0 let canChangeMessagesEnabled = (flags & (1 << 18)) != 0 + let isStream = (flags & (1 << 12)) != 0 state.defaultParticipantsAreMuted = GroupCallParticipantsContext.State.DefaultParticipantsAreMuted(isMuted: isMuted, canChange: isMin ? state.defaultParticipantsAreMuted.canChange : canChange) state.messagesAreEnabled = GroupCallParticipantsContext.State.MessagesAreEnabled(isEnabled: messagesEnabled, canChange: isMin ? state.messagesAreEnabled.canChange : canChangeMessagesEnabled, sendPaidMessagesStars: sendPaidMessagesStars) state.title = title @@ -796,6 +797,7 @@ func _internal_joinGroupCall(account: Account, peerId: PeerId?, joinAs: PeerId?, state.isVideoEnabled = isMin ? state.isVideoEnabled : isVideoEnabled state.unmutedVideoLimit = Int(unmutedVideoLimit) state.defaultSendAs = defaultSendAs?.peerId + state.isStream = isStream default: break } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 14efb5e1ed..7c38eac56f 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -963,62 +963,65 @@ final class StoryItemContentComponent: Component { } if case .rtc = liveStream.kind, component.isEmbeddedInCamera { - } else { + } else if let mediaStreamCallState = self.mediaStreamCallState { var videoEndpointId: String? - if let mediaStreamCallState = self.mediaStreamCallState, mediaStreamCallState.isUnifiedStream { + if mediaStreamCallState.isUnifiedStream { videoEndpointId = "unified" } else if let mediaStreamCallVideoState = self.mediaStreamCallVideoState { videoEndpointId = mediaStreamCallVideoState.videoEndpointId } - let _ = mediaStream.update( - transition: mediaStreamTransition, - component: AnyComponent(MediaStreamVideoComponent( - call: mediaStreamCall, - videoEndpointId: videoEndpointId, - isVisible: true, - isAdmin: false, - peerTitle: "", - addInset: false, - isFullscreen: false, - videoLoading: false, - callPeer: nil, - activatePictureInPicture: ActionSlot(), - deactivatePictureInPicture: ActionSlot(), - bringBackControllerForPictureInPictureDeactivation: { f in - f() - }, - pictureInPictureClosed: { - }, - onVideoSizeRetrieved: { _ in - }, - onVideoPlaybackLiveChange: { [weak self] isLive in - guard let self else { - return - } - self.videoPlaybackStatus = MediaPlayerStatus( - generationTimestamp: CACurrentMediaTime(), - duration: .infinity, - dimensions: CGSize(), - timestamp: 0.0, - baseRate: 1.0, - seekId: 0, - status: isLive ? .playing : .buffering(initial: false, whilePlaying: true, progress: 0.0, display: true), - soundEnabled: true - ) - if !self.isSeeking { - self.updateVideoPlaybackProgress() + + if let videoEndpointId { + let _ = mediaStream.update( + transition: mediaStreamTransition, + component: AnyComponent(MediaStreamVideoComponent( + call: mediaStreamCall, + videoEndpointId: videoEndpointId, + isVisible: true, + isAdmin: false, + peerTitle: "", + addInset: false, + isFullscreen: false, + videoLoading: false, + callPeer: nil, + activatePictureInPicture: ActionSlot(), + deactivatePictureInPicture: ActionSlot(), + bringBackControllerForPictureInPictureDeactivation: { f in + f() + }, + pictureInPictureClosed: { + }, + onVideoSizeRetrieved: { _ in + }, + onVideoPlaybackLiveChange: { [weak self] isLive in + guard let self else { + return + } + self.videoPlaybackStatus = MediaPlayerStatus( + generationTimestamp: CACurrentMediaTime(), + duration: .infinity, + dimensions: CGSize(), + timestamp: 0.0, + baseRate: 1.0, + seekId: 0, + status: isLive ? .playing : .buffering(initial: false, whilePlaying: true, progress: 0.0, display: true), + soundEnabled: true + ) + if !self.isSeeking { + self.updateVideoPlaybackProgress() + } } + )), + environment: {}, + containerSize: availableSize + ) + let mediaStreamFrame = CGRect(origin: CGPoint(), size: availableSize) + if let mediaStreamView = mediaStream.view { + if mediaStreamView.superview == nil { + self.insertSubview(mediaStreamView, aboveSubview: self.imageView) } - )), - environment: {}, - containerSize: availableSize - ) - let mediaStreamFrame = CGRect(origin: CGPoint(), size: availableSize) - if let mediaStreamView = mediaStream.view { - if mediaStreamView.superview == nil { - self.insertSubview(mediaStreamView, aboveSubview: self.imageView) + mediaStreamTransition.setFrame(view: mediaStreamView, frame: mediaStreamFrame) } - mediaStreamTransition.setFrame(view: mediaStreamView, frame: mediaStreamFrame) } } } else { @@ -1113,7 +1116,7 @@ final class StoryItemContentComponent: Component { areMessagesEnabled: state.messagesAreEnabled, minMessagePrice: state.sendPaidMessageStars, isAdmin: state.canManageCall, - isUnifiedStream: state.connectionMode != .rtc + isUnifiedStream: state.isUnifiedStream ) if self.mediaStreamCallState != mappedState { self.mediaStreamCallState = mappedState diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index 295f98aa00..59f69e97fd 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -530,7 +530,7 @@ public final class OngoingGroupCallContext { #if os(iOS) if sharedAudioDevice == nil && !isStream { - self.audioDevice = OngoingCallContext.AudioDevice.create(enableSystemMute: false) + self.audioDevice = OngoingCallContext.AudioDevice.create(enableSystemMute: false, enableMicrophone: true) } else { self.audioDevice = sharedAudioDevice } diff --git a/submodules/TelegramVoip/Sources/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift index 84839a9bd3..49ee16db7d 100644 --- a/submodules/TelegramVoip/Sources/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -832,8 +832,8 @@ public final class OngoingCallContext { public final class AudioDevice { let impl: SharedCallAudioDevice - public static func create(enableSystemMute: Bool) -> AudioDevice? { - return AudioDevice(impl: SharedCallAudioDevice(disableRecording: false, enableSystemMute: enableSystemMute)) + public static func create(enableSystemMute: Bool, enableMicrophone: Bool) -> AudioDevice? { + return AudioDevice(impl: SharedCallAudioDevice(disableRecording: !enableMicrophone, enableSystemMute: enableSystemMute)) } private init(impl: SharedCallAudioDevice) {