changeMode method
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()}');
}
}
}