Fix/track not stop stats monitor correctly (#306)

* feat: add preferCurrentTab support for flutter web.

* fix: Stop Stats monitor correctly when Track.onDispose.
This commit is contained in:
CloudWebRTC
2023-06-16 20:09:46 +08:00
committed by GitHub
parent 193f89806f
commit 04781729fc
7 changed files with 45 additions and 56 deletions
+4 -3
View File
@@ -33,10 +33,10 @@ class LocalAudioTrack extends LocalTrack
AudioSenderStats? prevStats;
@override
Future<void> monitorSender() async {
if (sender == null) {
Future<bool> 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<AudioSenderStats?> getSenderStats() async {
-21
View File
@@ -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<void> monitorSender();
@internal
void startMonitor() {
_monitorTimer ??=
Timer.periodic(const Duration(milliseconds: monitorFrequency), (_) {
monitorSender();
});
}
@internal
void stopMonitor() {
_monitorTimer?.cancel();
_monitorTimer = null;
}
}
+5 -4
View File
@@ -23,17 +23,17 @@ class LocalVideoTrack extends LocalTrack with VideoTrack {
final Map<String, num> _bitrateFoLayers = {};
@override
Future<void> monitorSender() async {
if (sender == null) {
Future<bool> monitorStats() async {
if (sender == null || events.isDisposed) {
_currentBitrate = 0;
return;
return false;
}
List<VideoSenderStats> stats = [];
try {
stats = await getSenderStats();
} catch (e) {
logger.warning('Failed to get sender stats: $e');
return;
return false;
}
Map<String, VideoSenderStats> statsMap = {};
@@ -58,6 +58,7 @@ class LocalVideoTrack extends LocalTrack with VideoTrack {
}
prevStats = statsMap;
return true;
}
Future<List<VideoSenderStats>> getSenderStats() async {
+4 -3
View File
@@ -66,10 +66,10 @@ class RemoteAudioTrack extends RemoteTrack
get currentBitrate => _currentBitrate;
@override
Future<void> monitorReceiver() async {
if (receiver == null) {
Future<bool> 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<AudioReceiverStats?> getReceiverStats() async {
-22
View File
@@ -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<void> monitorReceiver();
@internal
void startMonitor() {
_monitorTimer ??=
Timer.periodic(const Duration(milliseconds: monitorFrequency), (_) {
monitorReceiver();
});
}
@internal
void stopMonitor() {
_monitorTimer?.cancel();
_monitorTimer = null;
}
}
+4 -3
View File
@@ -31,10 +31,10 @@ class RemoteVideoTrack extends RemoteTrack with VideoTrack {
}
@override
Future<void> monitorReceiver() async {
if (receiver == null) {
Future<bool> 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<VideoReceiverStats?> getReceiverStats() async {
+28
View File
@@ -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<bool> 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, {