changeMode method

Future<void> changeMode(
  1. Mode requestedMode
)

Implementation

Future<void> changeMode(Mode requestedMode) async {
  Mode currentMode = _mode;
  Span? changeModeSpan;
  Span? routerSpan;
  Span? requestSpan;

  try {
    if (videoSDKTelemetery != null) {
      changeModeSpan =
          videoSDKTelemetery!.trace(spanName: 'Changing Mode', attributes: [
        Attribute.fromString('peer.currentMode', currentMode.toString()),
        Attribute.fromString('peer.requestedMode', requestedMode.toString())
      ]);
    }
  } catch (error) {}

  try {
    if (currentMode == requestedMode) {
      //
      VideoSDKLog.createLog(
          message:
              "Error in changeMode() \n You are already in the $requestedMode mode",
          logLevel: "ERROR");

      //
      if (changeModeSpan != null) {
        videoSDKTelemetery!.completeSpan(
            span: changeModeSpan,
            status: StatusCode.error,
            message: 'Already in the $requestedMode mode');
      }

      //
      throw Exception("You are already in the $requestedMode mode");
    }
    _mode = requestedMode;
    if (requestedMode == Mode.CONFERENCE) {
      log("Starting mode change to Conference");
      _consume = true;
      _produce = true;

      try {
        if (changeModeSpan != null) {
          routerSpan = videoSDKTelemetery!.trace(
              spanName: 'Loading Router Capabilities', span: changeModeSpan);
        }
      } catch (error) {}

      dynamic routerRtpCapabilities =
          await _webSocket!.socket.request('getRouterRtpCapabilities', {});

      final rtpCapabilities = RtpCapabilities.fromMap(routerRtpCapabilities);
      rtpCapabilities.headerExtensions
          .removeWhere((he) => he.uri == 'urn:3gpp:video-orientation');

      _device = Device();

      await _device!.load(routerRtpCapabilities: rtpCapabilities);

      try {
        if (routerSpan != null) {
          videoSDKTelemetery!.completeSpan(
              span: routerSpan,
              message:
                  'Router Capabilities Loaded ${routerRtpCapabilities.toString()}',
              status: StatusCode.ok);
          routerSpan = null;
        }
      } catch (error) {}

      if (_device!.canProduce(RTCRtpMediaType.RTCRtpMediaTypeAudio) == true ||
          _device!.canProduce(RTCRtpMediaType.RTCRtpMediaTypeVideo) == true) {
        _produce = true;
      } else {
        _produce = false;
      }

      await _createSendTransport(parentSpan: changeModeSpan);

      await _createReceiveTransport(parentSpan: changeModeSpan);

      try {
        if (changeModeSpan != null) {
          requestSpan = videoSDKTelemetery!.trace(
              spanName: 'Sending changeMode request to server',
              span: changeModeSpan);
        }
      } catch (error) {}

      _webSocket?.socket
          .request("changeMode", {"mode": requestedMode.parseToString()});

      try {
        if (requestSpan != null) {
          videoSDKTelemetery!.completeSpan(
              span: requestSpan,
              message: 'ChangeMode Request To Server Sent Successfully',
              status: StatusCode.ok);
          requestSpan = null;
        }
      } catch (error) {}

      if (_produce) {
        if (_micEnabled) {
          await _enableMicImpl(
            parentSpan: changeModeSpan,
          );
        } else {
          if (_customMicrophoneAudioTrack != null) {
            _customMicrophoneAudioTrack?.dispose();
          }
        }
        if (_camEnabled) {
          await _enableCamImpl(parentSpan: changeModeSpan);
        } else {
          if (_customCameraVideoTrack != null) {
            _customCameraVideoTrack?.dispose();
          }
        }
      }

      _eventEmitter.emit("participant-mode-changed-${localParticipant.id}",
          {'participantId': localParticipant.id, 'mode': 'CONFERENCE'});
      _eventEmitter.emit("participant-mode-changed",
          {'participantId': localParticipant.id, 'mode': 'CONFERENCE'});

      try {
        if (changeModeSpan != null) {
          videoSDKTelemetery!.traceAutoComplete(
              span: changeModeSpan,
              spanName:
                  "Emitting 'PEER_MODE_CHANGED' for Peer : ${localParticipant.id}");
          requestSpan = null;
        }
      } catch (error) {}
    } else if (requestedMode == Mode.VIEWER) {
      try {
        if (changeModeSpan != null) {
          requestSpan = videoSDKTelemetery!.trace(
              spanName: 'Sending changeMode request to server',
              span: changeModeSpan);
        }
      } catch (error) {}

      _webSocket?.socket
          .request("changeMode", {"mode": requestedMode.parseToString()});

      try {
        if (requestSpan != null) {
          videoSDKTelemetery!.completeSpan(
              span: requestSpan,
              message: 'ChangeMode Request To Server Sent Successfully',
              status: StatusCode.ok);
          requestSpan = null;
        }
      } catch (error) {}

      _consume = false;
      _produce = false;

      _sendTransport?.close();
      _sendTransport = null;

      _recvTransport?.close();
      _recvTransport = null;
    }

    if (changeModeSpan != null) {
      videoSDKTelemetery!.completeSpan(
          span: changeModeSpan,
          status: StatusCode.ok,
          message: 'Change Mode Successfully');
    }
  } catch (error) {
    //
    VideoSDKLog.createLog(
        message: "Error in changeMode() \n ${error.toString()}",
        logLevel: "ERROR");

    //
    log('Error Changing Mode ${error.toString()}');

    if (routerSpan != null) {
      videoSDKTelemetery!.completeSpan(
          span: routerSpan,
          status: StatusCode.error,
          message: 'Router Capabilities Loading Failed');
    }
    if (requestSpan != null) {
      videoSDKTelemetery!.completeSpan(
          span: requestSpan,
          status: StatusCode.error,
          message: 'Sending Request to the Server Failed');
    }
    if (changeModeSpan != null) {
      videoSDKTelemetery!.completeSpan(
          span: changeModeSpan,
          status: StatusCode.error,
          message: 'Change Mode Failed \n ${error.toString()}');
    }
  }
}