diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index da45f9d5e..60c08d13e 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -157,6 +157,7 @@ B6FE7EB71ADD62FA00A6D22F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */; }; B8041A9525C8FA1D003C2166 /* MediaLoaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8041A9425C8FA1D003C2166 /* MediaLoaderView.swift */; }; B8041AA725C90927003C2166 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */; }; + B806ECA126C4A7E4008BDA44 /* CallManager+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B806ECA026C4A7E4008BDA44 /* CallManager+UI.swift */; }; B80A579F23DFF1F300876683 /* NewClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */; }; B817AD9A26436593009DF825 /* SimplifiedConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */; }; B817AD9C26436F73009DF825 /* ThreadPickerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B817AD9B26436F73009DF825 /* ThreadPickerVC.swift */; }; @@ -1142,6 +1143,7 @@ B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; B8041A9425C8FA1D003C2166 /* MediaLoaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaLoaderView.swift; sourceTree = ""; }; B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingIndicatorCell.swift; sourceTree = ""; }; + B806ECA026C4A7E4008BDA44 /* CallManager+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CallManager+UI.swift"; sourceTree = ""; }; B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewClosedGroupVC.swift; sourceTree = ""; }; B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedConversationCell.swift; sourceTree = ""; }; B817AD9B26436F73009DF825 /* ThreadPickerVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadPickerVC.swift; sourceTree = ""; }; @@ -2338,6 +2340,7 @@ isa = PBXGroup; children = ( B8DE1FB326C22F2F0079C9CE /* CallManager.swift */, + B806ECA026C4A7E4008BDA44 /* CallManager+UI.swift */, ); path = Calls; sourceTree = ""; @@ -4765,6 +4768,7 @@ C32C5D23256DD4C0003C73A2 /* Mention.swift in Sources */, C32C5FD6256E0346003C73A2 /* Notification+Thread.swift in Sources */, C3BBE0C72554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift in Sources */, + B806ECA126C4A7E4008BDA44 /* CallManager+UI.swift in Sources */, C32C5C88256DD0D2003C73A2 /* Storage+Messaging.swift in Sources */, C32C59C7256DB41F003C73A2 /* TSThread.m in Sources */, C300A5B22554AF9800555489 /* VisibleMessage+Profile.swift in Sources */, diff --git a/SessionMessagingKit/Calls/CallManager+UI.swift b/SessionMessagingKit/Calls/CallManager+UI.swift new file mode 100644 index 000000000..7ef7af1ea --- /dev/null +++ b/SessionMessagingKit/Calls/CallManager+UI.swift @@ -0,0 +1,16 @@ +import WebRTC + +extension CallManager { + + func attachLocalRenderer(_ renderer: RTCVideoRenderer) { + localVideoTrack.add(renderer) + } + + func attachRemoteRenderer(_ renderer: RTCVideoRenderer) { + remoteVideoTrack?.add(renderer) + } + + func handleLocalFrameCaptured(_ videoFrame: RTCVideoFrame) { + localVideoSource.capturer(videoCapturer, didCapture: videoFrame) + } +} diff --git a/SessionMessagingKit/Calls/CallManager.swift b/SessionMessagingKit/Calls/CallManager.swift index 1660e9a67..50db4c794 100644 --- a/SessionMessagingKit/Calls/CallManager.swift +++ b/SessionMessagingKit/Calls/CallManager.swift @@ -4,7 +4,7 @@ import WebRTC /// See https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription for more information. public final class CallManager : NSObject, RTCPeerConnectionDelegate { - private lazy var factory: RTCPeerConnectionFactory = { + internal lazy var factory: RTCPeerConnectionFactory = { RTCInitializeSSL() let videoEncoderFactory = RTCVideoEncoderFactoryH264() let videoDecoderFactory = RTCVideoDecoderFactoryH264() @@ -13,7 +13,7 @@ public final class CallManager : NSObject, RTCPeerConnectionDelegate { /// Represents a WebRTC connection between the user and a remote peer. Provides methods to connect to a /// remote peer, maintain and monitor the connection, and close the connection once it's no longer needed. - private lazy var peerConnection: RTCPeerConnection = { + internal lazy var peerConnection: RTCPeerConnection = { let configuration = RTCConfiguration() // TODO: Configure // TODO: Do these constraints make sense? @@ -21,7 +21,7 @@ public final class CallManager : NSObject, RTCPeerConnectionDelegate { return factory.peerConnection(with: configuration, constraints: constraints, delegate: self) }() - private lazy var constraints: RTCMediaConstraints = { + internal lazy var constraints: RTCMediaConstraints = { let mandatory: [String:String] = [ kRTCMediaConstraintsOfferToReceiveAudio : kRTCMediaConstraintsValueTrue, kRTCMediaConstraintsOfferToReceiveVideo : kRTCMediaConstraintsValueTrue @@ -32,35 +32,35 @@ public final class CallManager : NSObject, RTCPeerConnectionDelegate { }() // Audio - private lazy var audioSource: RTCAudioSource = { + internal lazy var audioSource: RTCAudioSource = { // TODO: Do these constraints make sense? let constraints = RTCMediaConstraints(mandatoryConstraints: [:], optionalConstraints: [:]) return factory.audioSource(with: constraints) }() - private lazy var audioTrack: RTCAudioTrack = { + internal lazy var audioTrack: RTCAudioTrack = { return factory.audioTrack(with: audioSource, trackId: "ARDAMSa0") }() // Video - private lazy var localVideoSource: RTCVideoSource = { + internal lazy var localVideoSource: RTCVideoSource = { return factory.videoSource() }() - private lazy var localVideoTrack: RTCVideoTrack = { + internal lazy var localVideoTrack: RTCVideoTrack = { return factory.videoTrack(with: localVideoSource, trackId: "ARDAMSv0") }() - private lazy var videoCapturer: RTCVideoCapturer = { + internal lazy var videoCapturer: RTCVideoCapturer = { return RTCCameraVideoCapturer(delegate: localVideoSource) }() - private lazy var remoteVideoTrack: RTCVideoTrack? = { + internal lazy var remoteVideoTrack: RTCVideoTrack? = { return peerConnection.receivers.first { $0.track.kind == "video" }?.track as? RTCVideoTrack }() // Stream - private lazy var stream: RTCMediaStream = { + internal lazy var stream: RTCMediaStream = { let result = factory.mediaStream(withStreamId: "ARDAMS") result.addAudioTrack(audioTrack) result.addVideoTrack(localVideoTrack) @@ -79,7 +79,7 @@ public final class CallManager : NSObject, RTCPeerConnectionDelegate { } // MARK: Initialization - private override init() { + internal override init() { super.init() peerConnection.add(stream) // Configure audio session