From cbf665ffaf171bcf2a387523115c768cbe7d50b7 Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Tue, 19 Dec 2023 14:19:35 +0800 Subject: [PATCH] feat: add AudioSourceStats. (#427) * feat: add AudioSourceStats. * import sorter. * update. --- lib/src/events.dart | 2 +- lib/src/stats/audio_source_stats.dart | 51 +++++++++++++++++++++++++++ lib/src/{track => stats}/stats.dart | 17 +++++---- lib/src/track/local/audio.dart | 7 ++-- lib/src/track/local/video.dart | 2 +- lib/src/track/remote/audio.dart | 7 ++-- lib/src/track/remote/video.dart | 2 +- lib/src/track/track.dart | 2 +- 8 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 lib/src/stats/audio_source_stats.dart rename lib/src/{track => stats}/stats.dart (93%) diff --git a/lib/src/events.dart b/lib/src/events.dart index 963fcadf1..34dae53eb 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -21,7 +21,7 @@ import 'participant/remote.dart'; import 'publication/local.dart'; import 'publication/remote.dart'; import 'publication/track_publication.dart'; -import 'track/stats.dart'; +import 'stats/stats.dart'; import 'track/track.dart'; import 'types/other.dart'; import 'types/participant_permissions.dart'; diff --git a/lib/src/stats/audio_source_stats.dart b/lib/src/stats/audio_source_stats.dart new file mode 100644 index 000000000..38876d749 --- /dev/null +++ b/lib/src/stats/audio_source_stats.dart @@ -0,0 +1,51 @@ +// Copyright 2023 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; + +import 'stats.dart'; + +class AudioSourceStats { + final num? audioLevel; + final num? totalAudioEnergy; + final num? totalSamplesDuration; + final num? echoReturnLoss; + final num? echoReturnLossEnhancement; + final String? trackIdentifier; + final bool remoteSource; + + AudioSourceStats({ + required this.echoReturnLossEnhancement, + required this.audioLevel, + required this.totalAudioEnergy, + required this.totalSamplesDuration, + required this.echoReturnLoss, + required this.trackIdentifier, + required this.remoteSource, + }); + + factory AudioSourceStats.fromReport(rtc.StatsReport report) { + return AudioSourceStats( + echoReturnLossEnhancement: + getNumValFromReport(report.values, 'echoReturnLossEnhancement'), + audioLevel: getNumValFromReport(report.values, 'audioLevel'), + totalAudioEnergy: getNumValFromReport(report.values, 'totalAudioEnergy'), + totalSamplesDuration: + getNumValFromReport(report.values, 'totalSamplesDuration'), + echoReturnLoss: getNumValFromReport(report.values, 'echoReturnLoss'), + trackIdentifier: getStringValFromReport(report.values, 'trackIdentifier'), + remoteSource: getBoolValFromReport(report.values, 'remoteSource'), + ); + } +} diff --git a/lib/src/track/stats.dart b/lib/src/stats/stats.dart similarity index 93% rename from lib/src/track/stats.dart rename to lib/src/stats/stats.dart index 8e7a9bcb2..e95d0caf2 100644 --- a/lib/src/track/stats.dart +++ b/lib/src/stats/stats.dart @@ -14,7 +14,7 @@ import 'package:flutter/foundation.dart'; -import '../proto/livekit_models.pb.dart'; +import 'audio_source_stats.dart'; const monitorFrequency = 2000; @@ -54,12 +54,11 @@ class SenderStats extends CodecStats { class AudioSenderStats extends SenderStats { AudioSenderStats(String streamId, num timestamp) : super(streamId, timestamp); - TrackType type = TrackType.AUDIO; + AudioSourceStats? audioSourceStats; } class VideoSenderStats extends SenderStats { VideoSenderStats(String streamId, num timestamp) : super(streamId, timestamp); - TrackType type = TrackType.VIDEO; num? firCount; @@ -107,7 +106,6 @@ class ReceiverStats extends CodecStats { class AudioReceiverStats extends ReceiverStats { AudioReceiverStats(String streamId, num timestamp) : super(streamId, timestamp); - TrackType type = TrackType.AUDIO; num? concealedSamples; @@ -120,14 +118,14 @@ class AudioReceiverStats extends ReceiverStats { num? totalAudioEnergy; num? totalSamplesDuration; + + AudioSourceStats? audioSourceStats; } class VideoReceiverStats extends ReceiverStats { VideoReceiverStats(String streamId, num timestamp) : super(streamId, timestamp); - TrackType type = TrackType.VIDEO; - num? framesDecoded; num? framesDropped; @@ -212,3 +210,10 @@ String? getStringValFromReport(Map values, String key) { } return null; } + +bool getBoolValFromReport(Map values, String key) { + if (values.containsKey(key) && values[key] is bool) { + return values[key] as bool; + } + return false; +} diff --git a/lib/src/track/local/audio.dart b/lib/src/track/local/audio.dart index a3d4272e1..482e64e05 100644 --- a/lib/src/track/local/audio.dart +++ b/lib/src/track/local/audio.dart @@ -21,10 +21,11 @@ import 'package:meta/meta.dart'; import '../../events.dart'; import '../../logger.dart'; import '../../proto/livekit_models.pb.dart' as lk_models; +import '../../stats/audio_source_stats.dart'; +import '../../stats/stats.dart'; import '../../types/other.dart'; import '../audio_management.dart'; import '../options.dart'; -import '../stats.dart'; import 'local.dart'; class LocalAudioTrack extends LocalTrack @@ -101,7 +102,9 @@ class LocalAudioTrack extends LocalTrack senderStats.channels = getNumValFromReport(c.values, 'channels'); senderStats.clockRate = getNumValFromReport(c.values, 'clockRate'); } - break; + } else if (v.type == 'media-source') { + senderStats ??= AudioSenderStats(v.id, v.timestamp); + senderStats.audioSourceStats = AudioSourceStats.fromReport(v); } } return senderStats; diff --git a/lib/src/track/local/video.dart b/lib/src/track/local/video.dart index 7096021bf..2bcb8d350 100644 --- a/lib/src/track/local/video.dart +++ b/lib/src/track/local/video.dart @@ -21,10 +21,10 @@ import '../../events.dart'; import '../../logger.dart'; import '../../proto/livekit_models.pb.dart' as lk_models; import '../../proto/livekit_rtc.pb.dart' as lk_rtc; +import '../../stats/stats.dart'; import '../../support/platform.dart'; import '../../types/other.dart'; import '../options.dart'; -import '../stats.dart'; import 'audio.dart'; import 'local.dart'; diff --git a/lib/src/track/remote/audio.dart b/lib/src/track/remote/audio.dart index ad11248a7..0e2555e4b 100644 --- a/lib/src/track/remote/audio.dart +++ b/lib/src/track/remote/audio.dart @@ -19,10 +19,11 @@ import '../../events.dart'; import '../../internal/events.dart'; import '../../logger.dart'; import '../../proto/livekit_models.pb.dart' as lk_models; +import '../../stats/audio_source_stats.dart'; +import '../../stats/stats.dart'; import '../../types/other.dart'; import '../audio_management.dart'; import '../local/local.dart'; -import '../stats.dart'; import 'remote.dart'; import '../web/_audio_api.dart' if (dart.library.html) '../web/_audio_html.dart' @@ -150,7 +151,9 @@ class RemoteAudioTrack extends RemoteTrack receiverStats.channels = getNumValFromReport(c.values, 'channels'); receiverStats.clockRate = getNumValFromReport(c.values, 'clockRate'); } - break; + } else if (v.type == 'track') { + receiverStats ??= AudioReceiverStats(v.id, v.timestamp); + receiverStats.audioSourceStats = AudioSourceStats.fromReport(v); } } return receiverStats; diff --git a/lib/src/track/remote/video.dart b/lib/src/track/remote/video.dart index 49b79f41c..6d726820b 100644 --- a/lib/src/track/remote/video.dart +++ b/lib/src/track/remote/video.dart @@ -19,9 +19,9 @@ import 'package:meta/meta.dart'; import '../../events.dart'; import '../../logger.dart'; import '../../proto/livekit_models.pb.dart' as lk_models; +import '../../stats/stats.dart'; import '../../types/other.dart'; import '../local/local.dart'; -import '../stats.dart'; import 'remote.dart'; class RemoteVideoTrack extends RemoteTrack with VideoTrack { diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index b1ad1d8d3..b02c5a192 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -24,9 +24,9 @@ import '../internal/events.dart'; import '../logger.dart'; import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; +import '../stats/stats.dart'; import '../support/disposable.dart'; import '../types/other.dart'; -import 'stats.dart'; /// Wrapper around a MediaStreamTrack with additional metadata. /// Base for [AudioTrack] and [VideoTrack],