From 27527f04172c00e71ef60f88402e891bc1cc4043 Mon Sep 17 00:00:00 2001 From: "duanweiwei1982@gmail.com" Date: Wed, 5 Oct 2022 21:38:45 +0800 Subject: [PATCH 1/2] chore: update audio device for call when input device changes. --- lib/src/voip/call.dart | 16 ++++++++++++++++ lib/src/voip/group_call.dart | 9 +++++++++ lib/src/voip/voip.dart | 16 ++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/lib/src/voip/call.dart b/lib/src/voip/call.dart index 3ea1e5a4..6575b644 100644 --- a/lib/src/voip/call.dart +++ b/lib/src/voip/call.dart @@ -329,6 +329,7 @@ class CallSession { bool waitForLocalAVStream = false; int toDeviceSeq = 0; int candidateSendTries = 0; + bool get isGroupCall => groupCallId != null; final CachedStreamController onCallStreamsChanged = CachedStreamController(); @@ -596,6 +597,21 @@ class CallSession { } } + Future updateAudioDevice([MediaStreamTrack? track]) async { + final sender = usermediaSenders + .where((element) => element.track!.kind == 'audio') + .first; + await sender.track!.stop(); + if (track != null) { + await sender.replaceTrack(track); + } else { + final stream = + await voip.delegate.mediaDevices.getUserMedia({'audio': true}); + final audioTrack = stream.getAudioTracks().first; + await sender.replaceTrack(audioTrack); + } + } + void _updateRemoteSDPStreamMetadata(SDPStreamMetadata metadata) { remoteSDPStreamMetadata = metadata; remoteSDPStreamMetadata!.sdpStreamMetadatas diff --git a/lib/src/voip/group_call.dart b/lib/src/voip/group_call.dart index b4b8ef46..2a096691 100644 --- a/lib/src/voip/group_call.dart +++ b/lib/src/voip/group_call.dart @@ -381,6 +381,15 @@ class GroupCall { return newStream; } + Future updateAudioDevice() async { + final stream = + await voip.delegate.mediaDevices.getUserMedia({'audio': true}); + final audioTrack = stream.getAudioTracks().first; + for (final call in calls) { + await call.updateAudioDevice(audioTrack); + } + } + void updateLocalUsermediaStream(WrappedMediaStream stream) { if (localUserMediaStream != null) { final oldStream = localUserMediaStream!.stream; diff --git a/lib/src/voip/voip.dart b/lib/src/voip/voip.dart index f48e30e6..63a2b82f 100644 --- a/lib/src/voip/voip.dart +++ b/lib/src/voip/voip.dart @@ -129,6 +129,22 @@ class VoIP { break; } }); + + delegate.mediaDevices.ondevicechange = _onDeviceChange; + } + + Future _onDeviceChange(dynamic _) async { + Logs().v('[VOIP] _onDeviceChange'); + for (final call in calls.values) { + if (call.state == CallState.kConnected && !call.isGroupCall) { + await call.updateAudioDevice(); + } + } + for (final groupCall in groupCalls.values) { + if (groupCall.state == GroupCallState.Entered) { + await groupCall.updateAudioDevice(); + } + } } Future onCallInvite( From e50c0ec64165c8729ce098008716a3f6fb8e0a40 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Wed, 12 Oct 2022 19:11:53 +0800 Subject: [PATCH 2/2] chore: null safety. --- lib/src/voip/call.dart | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/src/voip/call.dart b/lib/src/voip/call.dart index 6575b644..7f887be3 100644 --- a/lib/src/voip/call.dart +++ b/lib/src/voip/call.dart @@ -20,6 +20,7 @@ import 'dart:async'; import 'dart:core'; import 'dart:math'; +import 'package:collection/collection.dart'; import 'package:webrtc_interface/webrtc_interface.dart'; import 'package:matrix/matrix.dart'; @@ -599,16 +600,17 @@ class CallSession { Future updateAudioDevice([MediaStreamTrack? track]) async { final sender = usermediaSenders - .where((element) => element.track!.kind == 'audio') - .first; - await sender.track!.stop(); + .firstWhereOrNull((element) => element.track!.kind == 'audio'); + await sender?.track?.stop(); if (track != null) { - await sender.replaceTrack(track); + await sender?.replaceTrack(track); } else { final stream = await voip.delegate.mediaDevices.getUserMedia({'audio': true}); - final audioTrack = stream.getAudioTracks().first; - await sender.replaceTrack(audioTrack); + final audioTrack = stream.getAudioTracks().firstOrNull; + if (audioTrack != null) { + await sender?.replaceTrack(audioTrack); + } } }