- Notifications
You must be signed in to change notification settings - Fork 30
[Enhancement]Incoming video pause #888
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Public Interface+ public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async |
Generated by 🚫 Danger |
SDK Size
|
58c8bc0 to 1cc43aa Compare Public Interface+ public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause + public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant |
Public Interface+ public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async |
martinmitrevski left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should have this on by default, without it, it breaks the experience on low-end networks. We can offer an opt out if needed.
There is opt-out as integrators can simply pass an empty array for the clientCapabilities. Let me align that with React too. |
fee2556 to d65a70a Compare
martinmitrevski left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good codewise ✅ Let's test it a bit and also check the failing tests.
Public Interface+ extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self + public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async |
d65a70a to 6d66e1f Compare Public Interface+ public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause + extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async |
Public Interface+ extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self + public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func updateClientCapabilities(_ clientCapabilities: Set<ClientCapability>)async |
Public Interface+ public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause + extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self public class Call: @unchecked Sendable, WSEventsSubscriber + public func enableClientCapabilities(_ capabilities: Set<ClientCapability>)async + public func disableClientCapabilities(_ capabilities: Set<ClientCapability>)async public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant |
9e6ad49 to 4883ad4 Compare Public Interface+ extension TrackType + + public static let audio: Self + public static let video: Self + public static let screenshare: Self + public struct TrackType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable + + public let rawValue: String + + + public init(rawValue: String) + public init(stringLiteral value: String) + public enum ClientCapability: Hashable, Sendable, CaseIterable + + case subscriberVideoPause public struct CallParticipant: Identifiable, Sendable, Hashable - public var userId: String + public var pausedTracks: Set<TrackType> - public var name: String + public var userId: String - public var profileImageURL: URL? + public var name: String - public var isPinned: Bool + public var profileImageURL: URL? - public var isPinnedRemotely: Bool + public var isPinned: Bool - public var shouldDisplayTrack: Bool + public var isPinnedRemotely: Bool - + public var shouldDisplayTrack: Bool - + - public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?) + - + public init(id: String,userId: String,roles: [String],name: String,profileImageURL: URL?,trackLookupPrefix: String?,hasVideo: Bool,hasAudio: Bool,isScreenSharing: Bool,showTrack: Bool,track: RTCVideoTrack? = nil,trackSize: CGSize = CGSize(width: 1024, height: 720),screenshareTrack: RTCVideoTrack? = nil,isSpeaking: Bool = false,isDominantSpeaker: Bool,sessionId: String,connectionQuality: ConnectionQuality,joinedAt: Date,audioLevel: Float,audioLevels: [Float],pin: PinInfo?,pausedTracks: Set<TrackType>) - + - public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool + - public func withUpdated(trackSize: CGSize)-> CallParticipant + public static func ==(lhs: CallParticipant,rhs: CallParticipant)-> Bool - public func withUpdated(track: RTCVideoTrack?)-> CallParticipant + public func withUpdated(trackSize: CGSize)-> CallParticipant - public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant + public func withUpdated(track: RTCVideoTrack?)-> CallParticipant - public func withUpdated(audio: Bool)-> CallParticipant + public func withUpdated(screensharingTrack: RTCVideoTrack?)-> CallParticipant - public func withUpdated(video: Bool)-> CallParticipant + public func withUpdated(audio: Bool)-> CallParticipant - public func withUpdated(screensharing: Bool)-> CallParticipant + public func withUpdated(video: Bool)-> CallParticipant - public func withUpdated(showTrack: Bool)-> CallParticipant + public func withUpdated(screensharing: Bool)-> CallParticipant - public func withUpdated(trackLookupPrefix: String)-> CallParticipant + public func withUpdated(showTrack: Bool)-> CallParticipant - public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant + public func withUpdated(trackLookupPrefix: String)-> CallParticipant - public func withUpdated(dominantSpeaker: Bool)-> CallParticipant + public func withUpdated(isSpeaking: Bool,audioLevel: Float)-> CallParticipant - public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(dominantSpeaker: Bool)-> CallParticipant - public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withUpdated(connectionQuality: ConnectionQuality)-> CallParticipant + public func withUpdated(pin: PinInfo?)-> CallParticipant + public func withPausedTrack(_ trackType: TrackType)-> CallParticipant + public func withUnpausedTrack(_ trackType: TrackType)-> CallParticipant public class Call: @unchecked Sendable, WSEventsSubscriber + public func enableClientCapabilities(_ capabilities: Set<ClientCapability>)async + public func disableClientCapabilities(_ capabilities: Set<ClientCapability>)async |
|



🔗 Issue Links
Resolves https://linear.app/stream/issue/IOS-994/featureinbound-video-pause
🎯 Goal
Provide a way for the SFU to instruct the client which tracks are remotely paused.
📝 Summary
Docs preview: https://github.com/GetStream/docs-content/pull/452
🧪 Manual Testing Notes
☑️ Contributor Checklist