From 04781729fc6b61f06937283a901957a7095228f3 Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Fri, 16 Jun 2023 20:09:46 +0800 Subject: [PATCH] Fix/track not stop stats monitor correctly (#306) * feat: add preferCurrentTab support for flutter web. * fix: Stop Stats monitor correctly when Track.onDispose. --- lib/src/track/local/audio.dart | 7 ++++--- lib/src/track/local/local.dart | 21 --------------------- lib/src/track/local/video.dart | 9 +++++---- lib/src/track/remote/audio.dart | 7 ++++--- lib/src/track/remote/remote.dart | 22 ---------------------- lib/src/track/remote/video.dart | 7 ++++--- lib/src/track/track.dart | 28 ++++++++++++++++++++++++++++ 7 files changed, 45 insertions(+), 56 deletions(-) diff --git a/lib/src/track/local/audio.dart b/lib/src/track/local/audio.dart index 9c49b1b..51809cc 100644 --- a/lib/src/track/local/audio.dart +++ b/lib/src/track/local/audio.dart @@ -33,10 +33,10 @@ class LocalAudioTrack extends LocalTrack AudioSenderStats? prevStats; @override - Future monitorSender() async { - if (sender == null) { + Future monitorStats() async { + if (sender == null || events.isDisposed) { _currentBitrate = 0; - return; + return false; } final stats = await getSenderStats(); @@ -47,6 +47,7 @@ class LocalAudioTrack extends LocalTrack } prevStats = stats; + return true; } Future getSenderStats() async { diff --git a/lib/src/track/local/local.dart b/lib/src/track/local/local.dart index 1beb3f8..69387b9 100644 --- a/lib/src/track/local/local.dart +++ b/lib/src/track/local/local.dart @@ -17,7 +17,6 @@ import '../../types/other.dart'; import '../options.dart'; import '../remote/audio.dart'; import '../remote/video.dart'; -import '../stats.dart'; import '../track.dart'; import 'audio.dart'; import 'video.dart'; @@ -196,7 +195,6 @@ abstract class LocalTrack extends Track { } logger.fine('$objectId.publish()'); - startMonitor(); _published = true; return true; } @@ -210,26 +208,7 @@ abstract class LocalTrack extends Track { } logger.fine('$objectId.unpublish()'); - stopMonitor(); _published = false; return true; } - - Timer? _monitorTimer; - - Future monitorSender(); - - @internal - void startMonitor() { - _monitorTimer ??= - Timer.periodic(const Duration(milliseconds: monitorFrequency), (_) { - monitorSender(); - }); - } - - @internal - void stopMonitor() { - _monitorTimer?.cancel(); - _monitorTimer = null; - } } diff --git a/lib/src/track/local/video.dart b/lib/src/track/local/video.dart index 0ca08d3..4078cbb 100644 --- a/lib/src/track/local/video.dart +++ b/lib/src/track/local/video.dart @@ -23,17 +23,17 @@ class LocalVideoTrack extends LocalTrack with VideoTrack { final Map _bitrateFoLayers = {}; @override - Future monitorSender() async { - if (sender == null) { + Future monitorStats() async { + if (sender == null || events.isDisposed) { _currentBitrate = 0; - return; + return false; } List stats = []; try { stats = await getSenderStats(); } catch (e) { logger.warning('Failed to get sender stats: $e'); - return; + return false; } Map statsMap = {}; @@ -58,6 +58,7 @@ class LocalVideoTrack extends LocalTrack with VideoTrack { } prevStats = statsMap; + return true; } Future> getSenderStats() async { diff --git a/lib/src/track/remote/audio.dart b/lib/src/track/remote/audio.dart index 04268c6..236b738 100644 --- a/lib/src/track/remote/audio.dart +++ b/lib/src/track/remote/audio.dart @@ -66,10 +66,10 @@ class RemoteAudioTrack extends RemoteTrack get currentBitrate => _currentBitrate; @override - Future monitorReceiver() async { - if (receiver == null) { + Future monitorStats() async { + if (receiver == null && events.isDisposed) { _currentBitrate = 0; - return; + return false; } final stats = await getReceiverStats(); @@ -80,6 +80,7 @@ class RemoteAudioTrack extends RemoteTrack } prevStats = stats; + return true; } Future getReceiverStats() async { diff --git a/lib/src/track/remote/remote.dart b/lib/src/track/remote/remote.dart index 76e83ab..449a2f9 100644 --- a/lib/src/track/remote/remote.dart +++ b/lib/src/track/remote/remote.dart @@ -1,11 +1,9 @@ import 'dart:async'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:meta/meta.dart'; import '../../proto/livekit_models.pb.dart' as lk_models; import '../../types/other.dart'; -import '../stats.dart'; import '../track.dart'; abstract class RemoteTrack extends Track { @@ -25,7 +23,6 @@ abstract class RemoteTrack extends Track { final didStart = await super.start(); if (didStart) { await enable(); - startMonitor(); } return didStart; } @@ -36,25 +33,6 @@ abstract class RemoteTrack extends Track { if (didStop) { await disable(); } - stopMonitor(); return didStop; } - - Timer? _monitorTimer; - - Future monitorReceiver(); - - @internal - void startMonitor() { - _monitorTimer ??= - Timer.periodic(const Duration(milliseconds: monitorFrequency), (_) { - monitorReceiver(); - }); - } - - @internal - void stopMonitor() { - _monitorTimer?.cancel(); - _monitorTimer = null; - } } diff --git a/lib/src/track/remote/video.dart b/lib/src/track/remote/video.dart index f64f710..93552d8 100644 --- a/lib/src/track/remote/video.dart +++ b/lib/src/track/remote/video.dart @@ -31,10 +31,10 @@ class RemoteVideoTrack extends RemoteTrack with VideoTrack { } @override - Future monitorReceiver() async { - if (receiver == null) { + Future monitorStats() async { + if (receiver == null && events.isDisposed) { _currentBitrate = 0; - return; + return false; } final stats = await getReceiverStats(); @@ -45,6 +45,7 @@ class RemoteVideoTrack extends RemoteTrack with VideoTrack { } prevStats = stats; + return true; } Future getReceiverStats() async { diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index e6ef554..2548ec8 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:meta/meta.dart'; import 'package:uuid/uuid.dart'; @@ -10,6 +12,7 @@ import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/disposable.dart'; import '../types/other.dart'; +import 'stats.dart'; /// Wrapper around a MediaStreamTrack with additional metadata. /// Base for [AudioTrack] and [VideoTrack], @@ -55,6 +58,7 @@ abstract class Track extends DisposableChangeNotifier onDispose(() async { logger.fine('${objectId} onDispose()'); + await stop(); // dispose events await events.dispose(); }); @@ -93,6 +97,8 @@ abstract class Track extends DisposableChangeNotifier logger.fine('$objectId.start()'); + startMonitor(); + _active = true; return true; } @@ -106,6 +112,8 @@ abstract class Track extends DisposableChangeNotifier return false; } + stopMonitor(); + logger.fine('$objectId.stop()'); _active = false; @@ -137,6 +145,26 @@ abstract class Track extends DisposableChangeNotifier } } + Timer? _monitorTimer; + + Future monitorStats(); + + @internal + void startMonitor() { + _monitorTimer ??= Timer.periodic( + const Duration(milliseconds: monitorFrequency), (_) async { + if (!await monitorStats()) { + stopMonitor(); + } + }); + } + + @internal + void stopMonitor() { + _monitorTimer?.cancel(); + _monitorTimer = null; + } + @internal void updateMuted( bool muted, {