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(