chore: update audio device for call when input device changes.

This commit is contained in:
duanweiwei1982@gmail.com 2022-10-05 21:38:45 +08:00
parent 3a8fedb02f
commit 27527f0417
3 changed files with 41 additions and 0 deletions

View File

@ -329,6 +329,7 @@ class CallSession {
bool waitForLocalAVStream = false;
int toDeviceSeq = 0;
int candidateSendTries = 0;
bool get isGroupCall => groupCallId != null;
final CachedStreamController<CallSession> onCallStreamsChanged =
CachedStreamController();
@ -596,6 +597,21 @@ class CallSession {
}
}
Future<void> 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

View File

@ -381,6 +381,15 @@ class GroupCall {
return newStream;
}
Future<void> 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;

View File

@ -129,6 +129,22 @@ class VoIP {
break;
}
});
delegate.mediaDevices.ondevicechange = _onDeviceChange;
}
Future<void> _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<void> onCallInvite(