From b85ecc15882516904b7ea3496564bc85717d8168 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Dec 2021 14:01:58 +0700 Subject: [PATCH] Fix: mute Remote mute/unmute events (#54) * fix * format --- lib/src/internal/events.dart | 7 ++-- .../publication/local_track_publication.dart | 32 ----------------- .../publication/remote_track_publication.dart | 1 - lib/src/publication/track_publication.dart | 34 +++++++++++++++---- lib/src/track/local.dart | 7 ++-- lib/src/track/track.dart | 10 +++++- 6 files changed, 44 insertions(+), 47 deletions(-) diff --git a/lib/src/internal/events.dart b/lib/src/internal/events.dart index 2e0e624..34e0947 100644 --- a/lib/src/internal/events.dart +++ b/lib/src/internal/events.dart @@ -66,13 +66,16 @@ class TrackVisibilityUpdatedEvent with TrackEvent, InternalEvent { }); } +// Used to notify muted state from Track to TrackPublication. @internal -class TrackMuteUpdatedEvent with TrackEvent, InternalEvent { +class InternalTrackMuteUpdatedEvent with TrackEvent, InternalEvent { final Track track; final bool muted; - const TrackMuteUpdatedEvent({ + final bool shouldSendSignal; + const InternalTrackMuteUpdatedEvent({ required this.track, required this.muted, + required this.shouldSendSignal, }); @override diff --git a/lib/src/publication/local_track_publication.dart b/lib/src/publication/local_track_publication.dart index af77547..f0861de 100644 --- a/lib/src/publication/local_track_publication.dart +++ b/lib/src/publication/local_track_publication.dart @@ -1,7 +1,3 @@ -import '../logger.dart'; -import '../events.dart'; -import '../extensions.dart'; -import '../internal/events.dart'; import '../participant/local_participant.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../track/local.dart'; @@ -24,34 +20,6 @@ class LocalTrackPublication extends TrackPublication { }); } - @override - Future updateTrack(T? newValue) async { - final didUpdate = await super.updateTrack(newValue); - - if (newValue != null) { - // attach listener to track - final listener = newValue.createListener() - // listen for track muted events - ..on((event) { - // send signal to server - logger.fine('${this} sending mute signal ${sid}, ${event.muted}'); - participant.room.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.room.events].emit(newEvent); - }); - // dispose listener when the track is disposed - newValue.onDispose(() => listener.dispose()); - } - - return didUpdate; - } - - @override - bool get muted => track?.muted ?? super.muted; - /// Mute the track associated with this publication Future mute() async => await track?.mute(); diff --git a/lib/src/publication/remote_track_publication.dart b/lib/src/publication/remote_track_publication.dart index b626cff..ea1e71b 100644 --- a/lib/src/publication/remote_track_publication.dart +++ b/lib/src/publication/remote_track_publication.dart @@ -93,7 +93,6 @@ class RemoteTrackPublication @override void updateFromInfo(lk_models.TrackInfo info) { super.updateFromInfo(info); - updateMuted(info.muted); track?.updateMuted(info.muted); } diff --git a/lib/src/publication/track_publication.dart b/lib/src/publication/track_publication.dart index 4759482..1f3fefa 100644 --- a/lib/src/publication/track_publication.dart +++ b/lib/src/publication/track_publication.dart @@ -1,6 +1,9 @@ +import '../events.dart'; +import '../internal/events.dart'; import 'package:meta/meta.dart'; import '../extensions.dart'; +import '../logger.dart'; import '../participant/participant.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/disposable.dart'; @@ -26,9 +29,7 @@ abstract class TrackPublication extends Disposable { /// The [Participant] this publication belongs to. abstract final Participant participant; - // metadata-muted - bool _muted = false; - bool get muted => _muted; + bool get muted => track?.muted ?? false; bool simulcasted = false; TrackDimension? dimension; @@ -64,9 +65,6 @@ abstract class TrackPublication extends Disposable { bool operator ==(Object other) => other is TrackPublication && sid == other.sid; - @internal - void updateMuted(bool muted) => _muted = muted; - // Update track to new value, dispose previous if exists. // Returns true if value has changed. // Intended for internal use only. @@ -76,6 +74,30 @@ 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()); + } + return true; } + + void _onTrackMuteUpdatedEvent(InternalTrackMuteUpdatedEvent event) { + // send signal to server (if mute initiated by local user) + if (event.shouldSendSignal) { + logger.fine( + '${this} Sending mute signal... sid:${sid}, muted:${event.muted}'); + participant.room.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.room.events].emit(newEvent); + } } diff --git a/lib/src/track/local.dart b/lib/src/track/local.dart index 679e5c5..25c57d2 100644 --- a/lib/src/track/local.dart +++ b/lib/src/track/local.dart @@ -4,7 +4,6 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:meta/meta.dart'; import '../exceptions.dart'; -import '../internal/events.dart'; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../types.dart'; @@ -41,8 +40,7 @@ abstract class LocalTrack extends Track { if (!Platform.isWindows) { await stop(); } - updateMuted(true); - events.emit(TrackMuteUpdatedEvent(track: this, muted: muted)); + updateMuted(true, shouldSendSignal: true); return true; } @@ -54,8 +52,7 @@ abstract class LocalTrack extends Track { await restartTrack(); } await enable(); - updateMuted(false); - events.emit(TrackMuteUpdatedEvent(track: this, muted: muted)); + updateMuted(false, shouldSendSignal: true); return true; } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index 1be1d09..6f1bc4a 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -139,7 +139,15 @@ abstract class Track extends DisposableChangeNotifier } @internal - void updateMuted(bool muted) => _muted = muted; + void updateMuted(bool muted, {bool shouldSendSignal = false}) { + if (_muted == muted) return; + _muted = muted; + events.emit(InternalTrackMuteUpdatedEvent( + track: this, + muted: muted, + shouldSendSignal: shouldSendSignal, + )); + } @internal void updateMediaStreamAndTrack(