diff --git a/lib/src/publication/local.dart b/lib/src/publication/local.dart index 84075ec39..b76de77fa 100644 --- a/lib/src/publication/local.dart +++ b/lib/src/publication/local.dart @@ -31,8 +31,7 @@ class LocalTrackPublication extends TrackPublication { required this.participant, required lk_models.TrackInfo info, required T track, - }) : super(info: info) { - updateTrack(track); + }) : super(info: info, track: track) { // register dispose func onDispose(() async { // this object is responsible for disposing track diff --git a/lib/src/publication/remote.dart b/lib/src/publication/remote.dart index 5daa170f0..686ccc303 100644 --- a/lib/src/publication/remote.dart +++ b/lib/src/publication/remote.dart @@ -105,7 +105,7 @@ class RemoteTrackPublication required this.participant, required lk_models.TrackInfo info, T? track, - }) : super(info: info) { + }) : super(info: info, track: track) { logger.fine('RemoteTrackPublication.init track: $track, info: $info'); // register dispose func @@ -121,8 +121,6 @@ class RemoteTrackPublication cancelFunc: (func) => _cancelPendingTrackSettingsUpdateRequest = func, wait: const Duration(milliseconds: 1500), ); - - updateTrack(track); } @internal diff --git a/lib/src/publication/track_publication.dart b/lib/src/publication/track_publication.dart index 726679fba..eff2b2c7b 100644 --- a/lib/src/publication/track_publication.dart +++ b/lib/src/publication/track_publication.dart @@ -68,13 +68,16 @@ abstract class TrackPublication extends Disposable { TrackPublication({ required lk_models.TrackInfo info, + required T? track, }) : sid = info.sid, name = info.name, kind = info.type.toLKType(), source = info.source.toLKType(), _simulcasted = info.simulcast, _metadataMuted = info.muted, - _mimeType = info.mimeType { + _mimeType = info.mimeType, + _track = track { + if (track != null) _attachTrackListener(track); updateFromInfo(info); } @@ -110,19 +113,19 @@ abstract class TrackPublication extends Disposable { // dispose previous track (if exists) await _track?.dispose(); _track = newValue; - - if (newValue != null) { - // listen for Track's muted events - final listener = newValue.createListener() - ..on( - (event) => _onTrackMuteUpdatedEvent(event)); - // dispose listener when the track is disposed - newValue.onDispose(() => listener.dispose()); - } + if (newValue != null) _attachTrackListener(newValue); return true; } + void _attachTrackListener(T track) { + // listen for Track's muted events + final listener = track.createListener() + ..on((event) => _onTrackMuteUpdatedEvent(event)); + // dispose listener when the track is disposed + track.onDispose(() => listener.dispose()); + } + void _onTrackMuteUpdatedEvent(InternalTrackMuteUpdatedEvent event) { // send signal to server (if mute initiated by local user) if (event.shouldSendSignal) {