Fix: RemoteTrack's initial mute state (#59)

This commit is contained in:
Hiroshi Horie
2021-12-17 12:26:33 +07:00
committed by GitHub
parent fa063ac352
commit f458f052a5
2 changed files with 46 additions and 26 deletions
@@ -49,6 +49,9 @@ class RemoteTrackPublication<T extends RemoteTrack>
/// relevant event. /// relevant event.
StreamState get streamState => _streamState; StreamState get streamState => _streamState;
// latest TrackInfo
bool _metadataMuted = false;
@internal @internal
Future<void> updateStreamState(StreamState streamState) async { Future<void> updateStreamState(StreamState streamState) async {
// return if no change // return if no change
@@ -73,6 +76,8 @@ class RemoteTrackPublication<T extends RemoteTrack>
required lk_models.TrackInfo info, required lk_models.TrackInfo info,
T? track, T? track,
}) : super(info: info) { }) : super(info: info) {
logger.fine('RemoteTrackPublication.init track: $track, info: $info');
// register dispose func // register dispose func
onDispose(() async { onDispose(() async {
_cancelVisibilityDebounceFunc?.call(); _cancelVisibilityDebounceFunc?.call();
@@ -92,8 +97,11 @@ class RemoteTrackPublication<T extends RemoteTrack>
@internal @internal
@override @override
void updateFromInfo(lk_models.TrackInfo info) { void updateFromInfo(lk_models.TrackInfo info) {
logger.fine(
'RemoteTrackPublication.updateFromInfo sid: ${info.sid} muted: ${info.muted}');
super.updateFromInfo(info); super.updateFromInfo(info);
track?.updateMuted(info.muted); track?.updateMuted(info.muted);
_metadataMuted = info.muted;
} }
// called any time visibility info updates // called any time visibility info updates
@@ -169,23 +177,28 @@ class RemoteTrackPublication<T extends RemoteTrack>
@internal @internal
@override @override
Future<bool> updateTrack(covariant T? newValue) async { Future<bool> updateTrack(covariant T? newValue) async {
logger.fine('RemoteTrackPublication.updateTrack track: $newValue');
final didUpdate = await super.updateTrack(newValue); final didUpdate = await super.updateTrack(newValue);
final roomOptions = participant.room.roomOptions ?? const RoomOptions();
if (didUpdate && newValue != null) {
// if new Track has been set to this RemoteTrackPublication,
// update the Track's muted state from the latest info.
newValue.updateMuted(
_metadataMuted,
shouldNotify: false, // don't emit event since this is initial state
);
// Only listen for visibility updates if video optimization is on // Only listen for visibility updates if video optimization is on
// and the attached track is a video track // and the attached track is a video track
final roomOptions = participant.room.roomOptions ?? const RoomOptions(); if (roomOptions.optimizeVideo &&
//
if (didUpdate &&
newValue != null &&
roomOptions.optimizeVideo &&
newValue.kind == lk_models.TrackType.VIDEO) { newValue.kind == lk_models.TrackType.VIDEO) {
// // Attach visibility event listener
// Attach visibility event listener (if video track)
//
final listener = newValue.createListener(); final listener = newValue.createListener();
listener.on<TrackVisibilityUpdatedEvent>( listener.on<TrackVisibilityUpdatedEvent>(
_onVideoRendererVisibilityUpdateEvent); _onVideoRendererVisibilityUpdateEvent);
//
newValue.onDispose(() async { newValue.onDispose(() async {
await listener.dispose(); await listener.dispose();
// consider all views are disposed when track is null // consider all views are disposed when track is null
@@ -193,6 +206,7 @@ class RemoteTrackPublication<T extends RemoteTrack>
if (!isDisposed) _visibilityDidUpdate?.call(null); if (!isDisposed) _visibilityDidUpdate?.call(null);
}); });
} }
}
return didUpdate; return didUpdate;
} }
+7 -1
View File
@@ -139,15 +139,21 @@ abstract class Track extends DisposableChangeNotifier
} }
@internal @internal
void updateMuted(bool muted, {bool shouldSendSignal = false}) { void updateMuted(
bool muted, {
bool shouldNotify = true,
bool shouldSendSignal = false,
}) {
if (_muted == muted) return; if (_muted == muted) return;
_muted = muted; _muted = muted;
if (shouldNotify) {
events.emit(InternalTrackMuteUpdatedEvent( events.emit(InternalTrackMuteUpdatedEvent(
track: this, track: this,
muted: muted, muted: muted,
shouldSendSignal: shouldSendSignal, shouldSendSignal: shouldSendSignal,
)); ));
} }
}
@internal @internal
void updateMediaStreamAndTrack( void updateMediaStreamAndTrack(