switchCamera method

  1. @override
Future<bool> switchCamera({
  1. String? deviceId,
})
inherited

For web implementation, make sure to pass the target deviceId

Implementation

@override
Future<bool> switchCamera({String? deviceId}) async {
  if (CallType.VIDEO_CALL != callType) {
    return Future.error(IllegalStateException(
        "Can't perform operation [switchCamera] for AUDIO call"));
  }

  try {
    if (localStream == null) {
      return Future.error(IllegalStateException(
          "Can't perform operation [switchCamera], cause 'localStream' not initialised"));
    } else {
      this.selectedVideoInputDevice = deviceId;

      if (selectedVideoInputDevice != null) {
        var newMediaStream = await navigator.mediaDevices.getUserMedia({
          'audio': false,
          'video': kIsWeb
              ? {'deviceId': selectedVideoInputDevice}
              : getVideoConfig(deviceId: selectedVideoInputDevice),
        });

        var oldVideoTrack = localStream!.getVideoTracks()[0];

        await localStream?.removeTrack(oldVideoTrack);
        oldVideoTrack.stop();

        await localStream?.addTrack(newMediaStream.getVideoTracks()[0]);

        channels.forEach((userId, peerConnection) async {
          await peerConnection
              .replaceVideoTrack(newMediaStream.getVideoTracks()[0]);
        });

        this.onLocalStreamReceived?.call(localStream!);

        return Future.value(true);
      } else {
        final videoTrack = localStream!.getVideoTracks()[0];
        return Helper.switchCamera(videoTrack, null, localStream);
      }
    }
  } catch (error) {
    return Future.error(error);
  }
}