Fix: mute Remote mute/unmute events (#54)

* fix

* format
This commit is contained in:
Hiroshi Horie
2021-12-12 14:01:58 +07:00
committed by GitHub
parent 2b88ffd5f9
commit b85ecc1588
6 changed files with 44 additions and 47 deletions
+5 -2
View File
@@ -66,13 +66,16 @@ class TrackVisibilityUpdatedEvent with TrackEvent, InternalEvent {
}); });
} }
// Used to notify muted state from Track to TrackPublication.
@internal @internal
class TrackMuteUpdatedEvent with TrackEvent, InternalEvent { class InternalTrackMuteUpdatedEvent with TrackEvent, InternalEvent {
final Track track; final Track track;
final bool muted; final bool muted;
const TrackMuteUpdatedEvent({ final bool shouldSendSignal;
const InternalTrackMuteUpdatedEvent({
required this.track, required this.track,
required this.muted, required this.muted,
required this.shouldSendSignal,
}); });
@override @override
@@ -1,7 +1,3 @@
import '../logger.dart';
import '../events.dart';
import '../extensions.dart';
import '../internal/events.dart';
import '../participant/local_participant.dart'; import '../participant/local_participant.dart';
import '../proto/livekit_models.pb.dart' as lk_models; import '../proto/livekit_models.pb.dart' as lk_models;
import '../track/local.dart'; import '../track/local.dart';
@@ -24,34 +20,6 @@ class LocalTrackPublication<T extends LocalTrack> extends TrackPublication<T> {
}); });
} }
@override
Future<bool> 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<TrackMuteUpdatedEvent>((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 /// Mute the track associated with this publication
Future<void> mute() async => await track?.mute(); Future<void> mute() async => await track?.mute();
@@ -93,7 +93,6 @@ class RemoteTrackPublication<T extends RemoteTrack>
@override @override
void updateFromInfo(lk_models.TrackInfo info) { void updateFromInfo(lk_models.TrackInfo info) {
super.updateFromInfo(info); super.updateFromInfo(info);
updateMuted(info.muted);
track?.updateMuted(info.muted); track?.updateMuted(info.muted);
} }
+28 -6
View File
@@ -1,6 +1,9 @@
import '../events.dart';
import '../internal/events.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import '../extensions.dart'; import '../extensions.dart';
import '../logger.dart';
import '../participant/participant.dart'; import '../participant/participant.dart';
import '../proto/livekit_models.pb.dart' as lk_models; import '../proto/livekit_models.pb.dart' as lk_models;
import '../support/disposable.dart'; import '../support/disposable.dart';
@@ -26,9 +29,7 @@ abstract class TrackPublication<T extends Track> extends Disposable {
/// The [Participant] this publication belongs to. /// The [Participant] this publication belongs to.
abstract final Participant participant; abstract final Participant participant;
// metadata-muted bool get muted => track?.muted ?? false;
bool _muted = false;
bool get muted => _muted;
bool simulcasted = false; bool simulcasted = false;
TrackDimension? dimension; TrackDimension? dimension;
@@ -64,9 +65,6 @@ abstract class TrackPublication<T extends Track> extends Disposable {
bool operator ==(Object other) => bool operator ==(Object other) =>
other is TrackPublication && sid == other.sid; other is TrackPublication && sid == other.sid;
@internal
void updateMuted(bool muted) => _muted = muted;
// Update track to new value, dispose previous if exists. // Update track to new value, dispose previous if exists.
// Returns true if value has changed. // Returns true if value has changed.
// Intended for internal use only. // Intended for internal use only.
@@ -76,6 +74,30 @@ abstract class TrackPublication<T extends Track> extends Disposable {
// dispose previous track (if exists) // dispose previous track (if exists)
await _track?.dispose(); await _track?.dispose();
_track = newValue; _track = newValue;
if (newValue != null) {
// listen for Track's muted events
final listener = newValue.createListener()
..on<InternalTrackMuteUpdatedEvent>(
(event) => _onTrackMuteUpdatedEvent(event));
// dispose listener when the track is disposed
newValue.onDispose(() => listener.dispose());
}
return true; 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);
}
} }
+2 -5
View File
@@ -4,7 +4,6 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import '../exceptions.dart'; import '../exceptions.dart';
import '../internal/events.dart';
import '../logger.dart'; import '../logger.dart';
import '../proto/livekit_models.pb.dart' as lk_models; import '../proto/livekit_models.pb.dart' as lk_models;
import '../types.dart'; import '../types.dart';
@@ -41,8 +40,7 @@ abstract class LocalTrack extends Track {
if (!Platform.isWindows) { if (!Platform.isWindows) {
await stop(); await stop();
} }
updateMuted(true); updateMuted(true, shouldSendSignal: true);
events.emit(TrackMuteUpdatedEvent(track: this, muted: muted));
return true; return true;
} }
@@ -54,8 +52,7 @@ abstract class LocalTrack extends Track {
await restartTrack(); await restartTrack();
} }
await enable(); await enable();
updateMuted(false); updateMuted(false, shouldSendSignal: true);
events.emit(TrackMuteUpdatedEvent(track: this, muted: muted));
return true; return true;
} }
+9 -1
View File
@@ -139,7 +139,15 @@ abstract class Track extends DisposableChangeNotifier
} }
@internal @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 @internal
void updateMediaStreamAndTrack( void updateMediaStreamAndTrack(