diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index bed5488..18f3cc1 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -76,7 +76,11 @@ class LocalParticipant extends Participant { ); await engine.negotiate(); - final pub = LocalTrackPublication(trackInfo, track, this); + final pub = LocalTrackPublication( + participant: this, + info: trackInfo, + track: track, + ); addTrackPublication(pub); [events, roomEvents].emit(LocalTrackPublishedEvent( @@ -159,7 +163,11 @@ class LocalParticipant extends Participant { ); await engine.negotiate(); - final pub = LocalTrackPublication(trackInfo, track, this); + final pub = LocalTrackPublication( + participant: this, + info: trackInfo, + track: track, + ); addTrackPublication(pub); [events, roomEvents].emit(LocalTrackPublishedEvent( diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 52b3b6b..ee014e0 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -143,9 +143,15 @@ class RemoteParticipant extends Participant { if (pub == null) { final RemoteTrackPublication pub; if (trackInfo.type == lk_models.TrackType.VIDEO) { - pub = RemoteTrackPublication(trackInfo, this); + pub = RemoteTrackPublication( + participant: this, + info: trackInfo, + ); } else if (trackInfo.type == lk_models.TrackType.AUDIO) { - pub = RemoteTrackPublication(trackInfo, this); + pub = RemoteTrackPublication( + participant: this, + info: trackInfo, + ); } else { throw UnexpectedStateException('Unknown track type'); } diff --git a/lib/src/publication/local_track_publication.dart b/lib/src/publication/local_track_publication.dart index ca0bba8..49d3396 100644 --- a/lib/src/publication/local_track_publication.dart +++ b/lib/src/publication/local_track_publication.dart @@ -8,16 +8,17 @@ import '../track/track.dart'; import 'track_publication.dart'; class LocalTrackPublication extends TrackPublication { - final LocalParticipant _participant; - @override covariant T? track; - LocalTrackPublication( - lk_models.TrackInfo info, - Track track, - this._participant, - ) : super.fromInfo(info) { + @override + final LocalParticipant participant; + + LocalTrackPublication({ + required this.participant, + required lk_models.TrackInfo info, + required Track track, + }) : super(info: info) { updateTrack(track); // register dispose func onDispose(() async { @@ -36,12 +37,12 @@ class LocalTrackPublication extends TrackPublication { // listen for track muted events ..on((event) { // send signal to server - _participant.engine.signalClient.sendMuteTrack(sid, event.muted); + participant.engine.signalClient.sendMuteTrack(sid, event.muted); // emit events final newEvent = event.muted - ? TrackMutedEvent(participant: _participant, track: this) - : TrackUnmutedEvent(participant: _participant, track: this); - [_participant.events, _participant.roomEvents].emit(newEvent); + ? TrackMutedEvent(participant: participant, track: this) + : TrackUnmutedEvent(participant: participant, track: this); + [participant.events, participant.roomEvents].emit(newEvent); }); // dispose listener when the track is disposed newValue.onDispose(() => listener.dispose()); diff --git a/lib/src/publication/remote_track_publication.dart b/lib/src/publication/remote_track_publication.dart index 1d69f1a..2649a7d 100644 --- a/lib/src/publication/remote_track_publication.dart +++ b/lib/src/publication/remote_track_publication.dart @@ -35,7 +35,9 @@ class RemoteTrackPublication extends TrackPublication { @override covariant T? track; - final RemoteParticipant _participant; + @override + final RemoteParticipant participant; + bool _enabled = true; lk_rtc.VideoQuality _videoQuality = lk_rtc.VideoQuality.HIGH; lk_rtc.VideoQuality get videoQuality => _videoQuality; @@ -46,11 +48,11 @@ class RemoteTrackPublication extends TrackPublication { Function(void)? _visibilityDidUpdate; Function? _cancelVisibilityDebounceFunc; - RemoteTrackPublication( - lk_models.TrackInfo info, - this._participant, [ + RemoteTrackPublication({ + required this.participant, + required lk_models.TrackInfo info, Track? track, - ]) : super.fromInfo(info) { + }) : super(info: info) { // register dispose func onDispose(() async { _cancelVisibilityDebounceFunc?.call(); @@ -142,7 +144,7 @@ class RemoteTrackPublication extends TrackPublication { } logger.fine('[Visibility] Sending to server ${settings.toProto3Json()}'); - _participant.engine.signalClient.sendUpdateTrackSettings(settings); + participant.engine.signalClient.sendUpdateTrackSettings(settings); } @internal @@ -154,7 +156,7 @@ class RemoteTrackPublication extends TrackPublication { // and the attached track is a video track if (didUpdate && newValue != null && - _participant.engine.connectOptions.optimizeVideo && + participant.engine.connectOptions.optimizeVideo && newValue.kind == lk_models.TrackType.VIDEO) { // // Attach visibility event listener (if video track) @@ -195,9 +197,8 @@ class RemoteTrackPublication extends TrackPublication { // Ideally, we should wait for WebRTC's onRemoveTrack event // but it does not work reliably across platforms. // So for now we will assume remove track succeeded. - [_participant.events, _participant.roomEvents] - .emit(TrackUnsubscribedEvent( - participant: _participant, + [participant.events, participant.roomEvents].emit(TrackUnsubscribedEvent( + participant: participant, track: track!, publication: this, )); @@ -212,7 +213,7 @@ class RemoteTrackPublication extends TrackPublication { trackSids: [sid], subscribe: subscribed, ); - _participant.engine.signalClient.sendUpdateSubscription(subscription); + participant.engine.signalClient.sendUpdateSubscription(subscription); } void _sendUpdateTrackSettings() { @@ -223,6 +224,6 @@ class RemoteTrackPublication extends TrackPublication { if (kind == lk_models.TrackType.VIDEO) { settings.quality = _videoQuality; } - _participant.engine.signalClient.sendUpdateTrackSettings(settings); + participant.engine.signalClient.sendUpdateTrackSettings(settings); } } diff --git a/lib/src/publication/track_publication.dart b/lib/src/publication/track_publication.dart index b9575ff..31ab910 100644 --- a/lib/src/publication/track_publication.dart +++ b/lib/src/publication/track_publication.dart @@ -1,10 +1,11 @@ import 'package:meta/meta.dart'; import '../extensions.dart'; +import '../participant/participant.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/disposable.dart'; -import '../types.dart'; import '../track/track.dart'; +import '../types.dart'; /// Represents a track that's published to the server. This class contains /// metadata associated with tracks. @@ -18,8 +19,12 @@ abstract class TrackPublication extends Disposable { final lk_models.TrackType kind; final TrackSource source; + // Relevant type must be implemented abstract Track? track; - // Track? get track => _track; + + // Relevant type must be implemented + /// The [Participant] this publication belongs to. + abstract final Participant participant; // metadata-muted bool _muted = false; @@ -30,8 +35,9 @@ abstract class TrackPublication extends Disposable { bool get subscribed => track != null; - TrackPublication.fromInfo(lk_models.TrackInfo info) - : sid = info.sid, + TrackPublication({ + required lk_models.TrackInfo info, + }) : sid = info.sid, name = info.name, kind = info.type, source = info.source.toLKType() { diff --git a/lib/src/room.dart b/lib/src/room.dart index bfa89cb..f939437 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -16,7 +16,6 @@ import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'rtc_engine.dart'; import 'support/disposable.dart'; -import 'publication/local_track_publication.dart'; import 'track/track.dart'; import 'types.dart';