Merge branch 'fix/audio-input-auto-selection' into 'main'

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

Closes famedly-web#587

See merge request famedly/company/frontend/famedlysdk!1144
This commit is contained in:
Nicolas Werner 2022-10-18 14:06:50 +00:00
commit 1656c51f05
3 changed files with 43 additions and 0 deletions

View File

@ -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';
@ -329,6 +330,7 @@ class CallSession {
bool waitForLocalAVStream = false;
int toDeviceSeq = 0;
int candidateSendTries = 0;
bool get isGroupCall => groupCallId != null;
final CachedStreamController<CallSession> onCallStreamsChanged =
CachedStreamController();
@ -596,6 +598,22 @@ class CallSession {
}
}
Future<void> updateAudioDevice([MediaStreamTrack? track]) async {
final sender = usermediaSenders
.firstWhereOrNull((element) => element.track!.kind == 'audio');
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().firstOrNull;
if (audioTrack != null) {
await sender?.replaceTrack(audioTrack);
}
}
}
void _updateRemoteSDPStreamMetadata(SDPStreamMetadata metadata) {
remoteSDPStreamMetadata = metadata;
remoteSDPStreamMetadata!.sdpStreamMetadatas

View File

@ -394,6 +394,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(