var audioStream = undefined;
var videoStream = undefined;
var screenStream = undefined;
var allAudioStream = undefined;
var rtcConfig = {
'iceServers':''
};
function generateUniqueID(){
return '68190dc9739b0'
}
function changeAudioInput(){
Client.mute()
.then(()=>{
window.simulcast.state.audioOn = false;
window.simulcast.state.activeMeeting.updateStatus();
Client.sendAudioStreams()
.then(()=>{
window.simulcast.state.audioOn = true;
window.simulcast.state.activeMeeting.updateStatus();
});
});
}
function onMediaCaptureError(error,mediaType){
window.simulcast.state.activeMeeting.errorFromMediaCapture(error,mediaType);
}
function changeVideoInput(){
Client.stopCamera()
.then(()=>{
window.simulcast.state.videoOn = false;
window.simulcast.state.activeMeeting.updateStatus();
Client.sendCameraStreams()
.then(()=>{
// console.log("setting video stream");
window.simulcast.state.videoOn = true;
setVideoStreamForPeer(UUID.id,videoStream);
window.simulcast.state.activeMeeting.updateStatus();
});
});
}
var isAdmin = '0';
var supportedBrowsers = {
"internet explorer": ">12",
"microsoft edge": ">18",
"safari": ">12",
"firefox": ">=60",
"chrome": ">=55",
"chromium": ">=55",
"opera": ">=62",
"samsung internet for android": ">=11.1.1.52"
}
var videoConstraints = {
video: {
deviceId : {
ideal: "default"
},
width : { ideal: 640 },
aspectRatio : 1.334,
frameRate:30,
}
};
var audioConstraints = {
audio: {
deviceId: {
ideal: "default"
}
}
}
function speakerOn(){
var trackA = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackA");
var trackB = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackB");
var trackC = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackC");
var floatVideElement = document.getElementById("flt-vid-"+window.simulcast.state.activeMeeting.currentPresenterId.replace("@","-").replaceAll('.','-'));
if(trackA && trackA.paused){
trackA.volume = 1;
trackA.play()
}
if(trackB && trackB.paused){
trackB.volume = 1;
trackB.play()
}
if(trackC && trackC.paused){
trackC.volume = 1;
trackC.play()
}
if(floatVideElement && floatVideElement.paused){
floatVideElement.play()
}
window.simulcast.state.speakerOn = true
}
function speakerOff(){
var trackA = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackA");
var trackB = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackB");
var trackC = document.getElementById("aud-"+window.simulcast.state.activeMeeting.uuid.id+"-TrackC");
if(trackA && !trackA.paused){
trackA.pause()
}
if(trackB && !trackB.paused){
trackB.pause()
}
if(trackC && !trackC.paused){
trackC.pause()
}
window.simulcast.state.speakerOn = false;
}
var audioStatusInProgress = false;
function muteMe(){
if(audioStatusInProgress) return;
audioStatusInProgress = true;
Client.mute()
.then(()=>{
audioStatusInProgress = false;
window.simulcast.state.audioOn = false;
audioStream = undefined;
window.simulcast.state.activeMeeting.updateStatus();
});
}
function unmuteMe(){
if(audioStatusInProgress) return;
audioStatusInProgress = true;
try {
audioStream = undefined;
navigator.mediaDevices.getUserMedia(audioConstraints)
.then(str => {
// _this.initializePubSub();
audioStream = str;
//do this
//https://stackoverflow.com/questions/62289946/webrtc-how-to-adjust-microphone-volume-on-a-video-stream
Client.sendAudioStreams()
.then(()=>{
audioStatusInProgress = false;
window.simulcast.state.audioOn = true;
window.simulcast.state.activeMeeting.updateStatus();
window.simulcast.mixins.getMediaDevices(false);
//we are doing it after 1 second, as server will take some time to produce a new stream
/* setTimeout(() => {
Client.subscribeToTrack("audio-mixer@"+window.simulcast.state.activeMeeting.NAME, "peer-"+UUID.id)
.then((error)=>{
Client.getConsumer("audio-mixer@"+window.simulcast.state.activeMeeting.NAME, "cam-audio")
.then((consumer)=>{
if(consumer){
Client.pauseConsumer(consumer);
}
})
})
.catch((error)=>{
});
}, 1000);
*/
});
})
.catch(err => {
if(err.name === "NotAllowedError"){
// alert('Looks like you deinied access. Allow acess to your mic by adjusting your media settings in the URL bar.');
new Promise((resolve, reject) => {
$(window.simulcast.modals.permissionDenied.refs.tryAgainRef).click(() => {
window.simulcast.modals.permissionDenied.exposed.hide().then(() => {
resolve()
})
})
window.simulcast.modals.permissionDenied.exposed.show();
})
} else {
audioStatusInProgress = false;
alert('Could not get Media!! Please check your mic');
}
window.simulcast.state.activeMeeting.errorFromMediaCapture(err.toString(),"audio");
console.log(err.toString());
});
} catch (error) {
new Promise((resolve, reject) => {
$(window.simulcast.modals.permissionDenied.refs.tryAgainRef).click(() => {
window.simulcast.modals.permissionDenied.exposed.hide().then(() => {
resolve();
})
})
window.simulcast.modals.permissionDenied.exposed.show();
})
window.simulcast.exposed.initializePubSub();
}
}
var videoStatusInProgress = false;
function stopVideoCapture(){
if(videoStatusInProgress) return;
videoStatusInProgress = true;
Client.stopCamera()
.then(()=>{
videoStatusInProgress = false;
window.simulcast.state.videoOn = false;
segmentationInitialized = false;
setVideoStreamForPeer(UUID.id,undefined);
videoStream = undefined;
window.simulcast.state.activeMeeting.updateStatus();
if(window.simulcast.state.SPEAKER_CENTRIC_MODE)
window.simulcast.state.showPresentationScreen(false);
});
}
function setAudioStreamForPeer(peerUuid,stream){
var audElement = document.getElementById("aud-"+peerUuid);
console.log("setting stream of aud-"+peerUuid);
if(audElement)
audElement.srcObject = stream;
//on iPad video is paused at start
// setTimeout(function(){
if (audElement && audElement.paused) {
var promise = audElement.play();
if(peerUuid.indexOf("Track") > -1){
if (promise !== undefined) {
promise.then(_ => {
window.simulcast.state.speakerOn = true;
}).catch(error => {
window.simulcast.state.speakerOn = false;
window.simulcast.exposed.askToPlayBlockedAudio();
});
}
}
}
// },200);
}
function setVideoStreamForPeer(peerUuid, stream, segmentationStarted = false ){
var correctId = peerUuid.replace("@","-").replaceAll('.','-');
var vidElement = document.getElementById("vid-"+correctId);
var floatVideElement = document.getElementById("flt-vid-"+correctId);
var prefsVideElement = document.getElementById("prefs-vid-"+correctId);
if($("#conferencing-container").css("display") == "block"){
vidElement = $("#conferencing-container").find("#vid-"+correctId)[0];
}
else{
vidElement = $(".participant-list").find("#vid-"+correctId)[0];
}
if(vidElement)
vidElement.srcObject = stream;
if(floatVideElement)
floatVideElement.srcObject = stream;
if(prefsVideElement && !segmentationInitialized)
prefsVideElement.srcObject = stream;
//on iPad video is paused at start
// setTimeout(function(){
if (vidElement && vidElement.paused) {
vidElement.play();
}
if (floatVideElement && floatVideElement.paused) {
floatVideElement.play();
}
if (prefsVideElement && prefsVideElement.paused) {
prefsVideElement.play();
}
// },200);
}
const constraints = window.constraints = {
audio: false,
video: true
};
function startVideoCapture(){
try {
if(videoStatusInProgress) return;
videoStatusInProgress = true;
if(window.simulcast.state.activeMeeting.canPresent){
Client.CAM_VIDEO_SIMULCAST_ENCODINGS[0].maxBitrate = 2000000;
videoConstraints.video.width.ideal = 640;
videoConstraints.video.frameRate = 30;
};
//null the stream so that sendCamera captures a new stream
videoStream = undefined;
navigator.mediaDevices.getUserMedia(videoConstraints)
.then(str => {
// _this.initializePubSub();
console.log("Capturing Camera");
if(window.simulcast.state.SPEAKER_CENTRIC_MODE)
window.simulcast.state.showPresentationScreen(true);
videoStream = str;
setVideoStreamForPeer(UUID.id, videoStream);
runSegmentation().then(()=>{
//SHUBHAM set the canvas stream to videostream
//window.simulcast.state.videoOn = true;
videoStream = canvasElement.captureStream();
setVideoStreamForPeer(UUID.id, videoStream, true);
//settimeout(()=>{
//setVideoStreamForPeer(UUID.id, videoStream, true);
//},1);
Client.sendCustomCameraStreams()
.then(()=>{
videoStatusInProgress = false;
console.log("setting stream");
// setVideoStreamForPeer(UUID.id,videoStream);
window.simulcast.state.activeMeeting.updateStatus();
window.simulcast.mixins.getMediaDevices(false);
});
})
})
.catch(err => {
videoStatusInProgress = false;
if(err.name === "NotAllowedError"){
// alert('Looks like you deinied access. Allow acess to your mic by adjusting your media settings in the URL bar.');
new Promise((resolve, reject) => {
$(window.simulcast.modals.permissionDenied.refs.tryAgainRef).click(() => {
window.simulcast.modals.permissionDenied.exposed.hide().then(() => {
resolve()
})
})
window.simulcast.modals.permissionDenied.exposed.show();
})
} else {
videoStatusInProgress = false;
alert('Could not get Media!! Please check your Camera');
}
window.simulcast.state.activeMeeting.errorFromMediaCapture(err.toString(),"video");
console.log(err.toString());
});
} catch (error) {
videoStatusInProgress = false;
new Promise((resolve, reject) => {
$(window.simulcast.modals.permissionDenied.refs.tryAgainRef).click(() => {
window.simulcast.modals.permissionDenied.exposed.hide().then(() => {
resolve();
})
})
window.simulcast.modals.permissionDenied.exposed.show();
})
window.simulcast.exposed.initializePubSub();
}
}
function startScreenShare(){
Client.startScreenshare()
.then(()=>{
//window.simulcast.maincontent.videoThumbnail.exposed.changePosition('top-left');
if(window.simulcast.state.SPEAKER_CENTRIC_MODE)
window.simulcast.mixins.switchView();
if(window.simulcast.state.activeMeeting.currentPresentationId || window.simulcast.state.activeMeeting.currentPresentationId != '')
window.simulcast.state.activeMeeting.setPresentation();
setTimeout(() => {
presentationOffset = $('.screen-sharing .recording-capture-area-marker').position();
setPresenterVideoPositionTo('top-left');
}, 1000);
})
.catch((error) =>{
if(error.message == "Permission denied by system"){
if(/Macintosh/.test(navigator.userAgent)){
let options = {
title:'Can\'t share your screen' ,
text: 'Google Chrome might not have screen-recording permission on your computer. Go to System Preferences.',
showOkButton:true,
showConfirmButton:false,
showCancelButton:false,
}
window.simulcast.modals.confirmModal.exposed.show(options);
}
else{
//its a windows machine
}
}
});
}
function stopScreenShare(){
Client.stopScreenShare()
.then(()=>{
});
}
function reconnect(){
segmentationInitialized = false;
window.simulcast.maincontent.exposed.showMessageContainer = false;
console.error("RECONNECTING....");
//stop and start audio again
//connect with all partipants
let message = {
type: 'RECONNECT'
}
window.simulcast.state.activeMeeting.sendMessage(message);
var audioOn = window.simulcast.state.audioOn;
var videoOn = window.simulcast.state.videoOn;
//reset the state, so that other users streams can switch off
window.simulcast.state.audioOn = false;
window.simulcast.state.videoOn = false;
if(window.simulcast.state.screenShare){
let message = {
type: 'SCREEN_SHARE_VIDEO_STOP'
}
window.simulcast.state.activeMeeting.sendMessage(message);
message = {
type: 'SCREEN_SHARE_AUDIO_STOP'
}
window.simulcast.state.activeMeeting.sendMessage(message);
window.simulcast.state.screenShare = false;
window.simulcast.state.activeMeeting.updateStatus();
//stopScreenShare();
}
//remove pulsating state
$(".pulse-ring").css("display","none");
document.getElementById("my-microphone").classList.remove( 'in-use' );
Client.leaveRoom()
.then((error)=>{
Client.joinRoom()
.then(()=>{
console.log("setting stream");
//clear all existing queues, as you may be comming here after reconnect
audioQueue = [];
videoQueue = [];
window.simulcast.state.activeMeeting.reconnecting = false;
subscribe(UUID.id,"TrackA");
subscribe(UUID.id,"TrackB");
subscribe(UUID.id,"TrackC");
if( audioOn){
Client.sendAudioStreams()
.then(()=>{
console.log("setting stream");
window.simulcast.state.audioOn = true;
window.simulcast.state.activeMeeting.updateStatus();
});
}
if(videoOn){
Client.sendCameraStreams()
.then(()=>{
console.log("setting stream");
window.simulcast.state.videoOn = true;
setVideoStreamForPeer(UUID.id,videoStream);
window.simulcast.state.activeMeeting.updateStatus();
});
}
for(var email in window.simulcast.state.participants){
var participant = window.simulcast.state.participants[email];
if(participant && email != UUID.id){
if(participant.audioOn ){
// subscribe(email,"cam-audio");
}
if(participant.screenOn ){
subscribe(email,"screen-audio");
}
if(participant.videoOn){
subscribe(email,"cam-video");
}
if(participant.screenOn){
subscribe(email,"screen-video");
}
}
}
})
})
}
function emptyVideo(width = 50, height = 40) {
const canvas = Object.assign(document.createElement("canvas"), {width, height});
const ctx = canvas.getContext('2d');
ctx.fillRect(0, 0, width, height);
/*
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.arc(50, 50, 25, 0, 2 * Math.PI, false);
ctx.fillStyle = "#ff0000";
ctx.fill();
ctx.moveTo(50, 50);
ctx.fillStyle = "#ffffff";
ctx.font = "15pt Arial";
ctx.fillText("M", 33, 56);
ctx.fillText("M", 51, 56);
*/
return canvas.captureStream(1);
};
var noise = emptyVideo().getTracks()[0];
let black = () => {
var width = 180, height = 180;
let canvas = Object.assign(document.createElement("canvas"), {width, height});
canvas.getContext('2d').fillRect(0, 0, width, height);
let stream = canvas.captureStream();
return Object.assign(stream.getVideoTracks()[0], {enabled: false});
}
let silence = () => {
let ctx = new AudioContext(), oscillator = ctx.createOscillator();
let dst = oscillator.connect(ctx.createMediaStreamDestination());
oscillator.start();
return Object.assign(dst.stream.getAudioTracks()[0], {enabled: false});
}
function startBackupAudioRecording(){
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(1000);
const audioChunks = [];
mediaRecorder.addEventListener("dataavailable", event => {
console.log("got blob",event);
audioChunks.push(event.data);
});
});
}
function setPresenterVideoPositionTo(position, floaterWidth){
var TOP_PADDING = 5;
var LEFT_PADDING = 3;
var contentHeight = 0;
var contentWidth = 0;
var floatingVideoLeft,floatingVideoTop,left,top;
if(window.simulcast.state.SPEAKER_CENTRIC_MODE)
{
TOP_PADDING = 4;
LEFT_PADDING = 0;
window.presenterOffset = $(".container>.recording-capture-area-marker").offset();
window.presenterOffset.top = presenterOffset.top - 40;
var centerWidth = $(".container>.recording-capture-area-marker").width();
var centerHeight = $(".container>.recording-capture-area-marker").height();
contentHeight = $('.speaker-centric-mode').height();
contentWidth = $('.speaker-centric-mode').width();
var tempLeft = $('.content-centric-view').offset().left
switch(position){
case 'top-left':
floatingVideoLeft = 0;
floatingVideoTop = 0;
left = (presenterOffset.left*Math.max(presenterScale,1)+LEFT_PADDING);
top = ((presenterOffset.top - 44)*Math.max(presenterScale,1)+TOP_PADDING);
break;
case 'top-right':
floatingVideoLeft = (presenterOffset.left + (centerWidth-Number(contentWidth))) *1/presenterScale;
floatingVideoTop = 0;
left = (presenterOffset.left*Math.max(presenterScale,1)+LEFT_PADDING) + centerWidth - Number(floaterWidth);
top = ((presenterOffset.top - 44) *Math.max(presenterScale,1)+TOP_PADDING);
floatingVideoLeft = left;
break;
case 'bottom-left':
floatingVideoLeft = 0;
floatingVideoTop = (centerHeight -Number(contentHeight))*1/presenterScale;
left = (presenterOffset.left*Math.max(presenterScale,1)+LEFT_PADDING);
top = ((presenterOffset.top - 44)*Math.max(presenterScale,1)+TOP_PADDING) + centerHeight -Number(contentHeight);
break;
case 'bottom-right':
floatingVideoLeft = (presenterOffset.left + (centerWidth-Number(contentWidth)))*1/presenterScale;
floatingVideoTop = (centerHeight -Number(contentHeight))*1/presenterScale;
left = (presenterOffset.left*Math.max(presenterScale,1)+LEFT_PADDING) + centerWidth - Number(floaterWidth);
top = ((presenterOffset.top - 44)*Math.max(presenterScale,1)+TOP_PADDING) + centerHeight -Number(contentHeight);
floatingVideoLeft = left;
break;
}
}
else if(window.simulcast.state.screenShare){
var centerWidth = $('.screen-sharing > .recording-capture-area-marker').width();
var centerHeight = $('.screen-sharing > .recording-capture-area-marker').height();
switch(position){
case 'top-left':
floatingVideoLeft = 0;
floatingVideoTop = 0;
left = (presentationOffset.left + LEFT_PADDING);
top = (presentationOffset.top + TOP_PADDING);
break;
case 'top-right':
floatingVideoLeft = centerWidth-Number(floaterWidth);
floatingVideoTop = 0;
left = (presentationOffset.left+LEFT_PADDING) + centerWidth - Number(floaterWidth)*presentationScale;
top = (presentationOffset.top+TOP_PADDING);
break;
case 'bottom-left':
floatingVideoLeft = 0;
floatingVideoTop = centerHeight -Number(floaterWidth);
left = (presentationOffset.left+LEFT_PADDING);
top = (presentationOffset.top+TOP_PADDING) + centerHeight -Number(floaterWidth)*presentationScale;
break;
case 'bottom-right':
floatingVideoLeft = centerWidth-Number(floaterWidth);
floatingVideoTop = centerHeight -Number(floaterWidth);
left = (presentationOffset.left+LEFT_PADDING) + centerWidth - Number(floaterWidth)*presentationScale;
top = (presentationOffset.top+TOP_PADDING) + centerHeight -Number(floaterWidth)*presentationScale;
break;
}
}
else{
var centerWidth = presentationWidth == 1?$(".presentation-selector").width():presentationWidth;
var centerHeight = presentationHeight == 1?$(".presentation-selector").height():presentationHeight;
switch(position){
case 'top-left':
floatingVideoLeft = 0;
floatingVideoTop = 0;
left = (presentationOffset.left*Math.max(presentationScale,1)+LEFT_PADDING);
top = (presentationOffset.top*Math.max(presentationScale,1)+TOP_PADDING);
break;
case 'top-right':
floatingVideoLeft = centerWidth-Number(floaterWidth);
floatingVideoTop = 0;
left = (presentationOffset.left*Math.max(presentationScale,1)+LEFT_PADDING) + centerWidth*presentationScale - Number(floaterWidth)*presentationScale;
top = (presentationOffset.top*Math.max(presentationScale,1)+TOP_PADDING);
break;
case 'bottom-left':
floatingVideoLeft = 0;
floatingVideoTop = centerHeight -Number(floaterWidth);
left = (presentationOffset.left*Math.max(presentationScale,1)+LEFT_PADDING);
top = (presentationOffset.top*Math.max(presentationScale,1)+TOP_PADDING) + centerHeight*presentationScale -Number(floaterWidth)*presentationScale;
break;
case 'bottom-right':
floatingVideoLeft = centerWidth-Number(floaterWidth);
floatingVideoTop = centerHeight -Number(floaterWidth);
left = (presentationOffset.left*Math.max(presentationScale,1)+LEFT_PADDING) + centerWidth*presentationScale - Number(floaterWidth)*presentationScale;
top = (presentationOffset.top*Math.max(presentationScale,1)+TOP_PADDING) + centerHeight*presentationScale -Number(floaterWidth)*presentationScale;
break;
}
}
let message = {
type: 'VIDEO_THUMBNAIL_POSITION_CHANGE',
floatingVideoLeft: floatingVideoLeft,
floatingVideoTop: floatingVideoTop
}
window.simulcast.state.activeMeeting.sendMessage(message);
emitter.emit("VIDEO_THUMBNAIL_POSITION_CHANGE", {floatingVideoLeft:left, floatingVideoTop:top})
}
var audioQueue = [];
var videoQueue = [];
var unsubscribeQueue = [];
var executing = false;
var unsubscribing = false;
function subscribe(peerId,media){
console.error("subscribing(" +media+") for "+peerId);
window.simulcast.state.activeMeeting.logMessagesForRecorder.push("subscribing(" +media+") for "+peerId);
if(media.indexOf("Track") > -1){
console.log("CONNECTING AUDIO TO "+media + "...");
// $(document.getElementsByName("connecting-"+peerId)).css("display","block");
audioQueue.push(peerId +"$"+media);
}
else
videoQueue.push(peerId +"$"+media);
setTimeout(() => {
execute();
}, 100);
let logData = {};
logData.action = "SUBSCRIBE " + media + " FROM " + peerId;
logData.type = "MEDIA"
window.simulcast.state.activeMeeting.logMessage(logData);
}
function unsubscribe(peerId,media){
unsubscribeQueue.push(peerId +"$"+media);
window.simulcast.state.activeMeeting.logMessagesForRecorder.push("UNSUBSCRIBING(" +media+") for "+peerId);
setTimeout(() => {
unsubscribeList();
}, 100);
let logData = {};
logData.action = "UNSUBSCRIBE " + media + " FROM " + peerId;
logData.type = "MEDIA"
window.simulcast.state.activeMeeting.logMessage(logData);
}
function execute(){
console.log("ENTERED EXECUTE");
if(executing)
return;
console.log("EXECUTING");
var params = "";
//we are giving audio the first priority
if(audioQueue.length > 0){
executing = true;
params = audioQueue.shift().split("$");
Client.subscribeToTrack(params[0],params[1])
.then((error)=>{
/* if(params[1] == "cam-audio"){
console.log("CONNECTED TO "+params[0] + "***");
console.log('document.getElementsByName("connecting-'+params[0]+'")');
$(document.getElementsByName("connecting-"+params[0])).css("display","none");
}
*/
executing = false;
execute();
})
.catch((error)=>{
executing = false;
//we need to make limited attempt, and then stop
if(error.toString().indexOf("Room not yet joined") > -1){
//the room is not yet created. ignore this subscription, as he will be anyway subscribed later
}
else{
var attempt = 1;
if(params.length > 2)
attempt = Number(params[2]) + 1;
//remove existing records
audioQueue = audioQueue.filter(function(track) {
return track.indexOf(params[0]+"$"+params[1]);
});
if(attempt < 4){
audioQueue.push(params[0]+"$"+params[1]+"$"+attempt);
setTimeout(() => {
execute();
}, 1000);
}
else{
console.log("maximum attempted");
}
console.error("subscribeToTrack to audio track Exception");
console.error(error);
window.simulcast.state.activeMeeting.logMessagesForRecorder.push("Exception in AUDIO SUBSCRIBE::"+error.toString());
}
});
}
else if(videoQueue.length > 0){
executing = true;
var params = videoQueue.shift().split("$");
Client.subscribeToTrack(params[0],params[1])
.then(()=>{
executing = false;
execute();
})
.catch((error)=>{
executing = false;
var attempt = 1;
if(params.length > 2)
attempt = Number(params[2]) + 1;
videoQueue = videoQueue.filter(function(track) {
return track.indexOf(params[0]+"$"+params[1]);
});
if(attempt < 4){
videoQueue.push(params[0]+"$"+params[1]+"$"+attempt);
setTimeout(() => {
execute();
}, 1000);
}
else{
console.log("maximum attempted");
}
console.error("subscribeToTrack to video track Exception");
console.error(error);
window.simulcast.state.activeMeeting.logMessagesForRecorder.push("Exception in VIDEO SUBSCRIBE::"+error.toString());
});
}
hideloader();
}
function unsubscribeList(){
console.log("ENTERED UNSUBSCRIBING");
if(unsubscribing)
return;
console.log("UNSUBSCRIBING");
//we are giving audio the first priority
if(unsubscribeQueue.length > 0){
unsubscribing = true;
var params = unsubscribeQueue.shift().split("$");
Client.unsubscribeFromTrack(params[0],params[1])
.then(()=>{
unsubscribing = false;
if(params[1] == "cam-video")
setVideoStreamForPeer(params[0],undefined);
unsubscribeList();
});
}
}
///
silence = () => {
let ctx = new AudioContext();
let oscillator = ctx.createOscillator();
oscillator.frequency.value = 0
let dst = oscillator.connect(ctx.createMediaStreamDestination());
//oscillator.start();
//return Object.assign(dst.stream.getAudioTracks()[0], {enabled: false});
return dst.stream;
}
if(top.recordingMode){
sources = {};
var silentStream = silence();
window.audioContext = new AudioContext();
window.mixedAudio = window.audioContext.createMediaStreamDestination();
sources["main"] = window.audioContext.createMediaStreamSource(silentStream);
sources["main"].connect(window.mixedAudio);
}
function warn(message){
console.log('%cWarning:'+' %c'+message, 'background: #fff; color: #fda563','background: #fda563; color: #f0f');
}
function debug(message){
console.log('%cDebug:'+' %c'+message, 'background: #fff; color: #1e73f9','background: #fff; color: #f0f');
}
var WebFontConfig;
var recordingMode = false;
var areFontsLoaded = false;
var RECORDING_ENABLED = true;
var STUDIO_MODE = false;
var CONFERENCING_MODE = false;
var ONLY_EDITOR_MODE = false;
var CONTENT_ID = "";
// var CREATE_COPY = "";
// var ELEMENT_ID = "";
// var PRESENTATION_ID = "";
// var SLIDE_ID = "";
var CREATE_COPY = "0";
var ELEMENT_ID = "";
var PRESENTATION_ID = "";
var SLIDE_ID = "";
/* var ONLY_EDITOR_MODE = ( "" != ""?true:false);*/
var NEW_CONTENT_ID = "";
var INSTANCE_NAME = INSTANCE_BRAND_NAME;
var mediaCaptured = false;
const IS_PARTICIPANT = false;
const IS_HOST = false;
const IS_PRESENTER = false;
var clientSettings = {
}
function hideloader(){
$(document.getElementById('splashScreen')).css({"visibility":"hidden",
"opacity":"0"});
}
function isMobile() {
let isMobile = (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
return isMobile ;
}
var g_clientId = '';
var personalFolderId = '';
var video_title = window.title;
var video_desc = "";
var video_ext = "mp4";
var SIMULCAST_ALLOW_COMMENTS = false;
var share_prefs_data = {}
var currentUserId = ''
var engageFolderPath = ''
$(window).resize(function () {
// var offset = targetRecordBtutton.offset();
// $(".gvlcdf")[0].style.setProperty('--ug-left',(offset.left-10) + "px")
// $(".gvlcdf")[0].style.setProperty('--ug-top',(offset.top-10) + "px")
setTimeout(() => {
document.documentElement.style.setProperty("--zScreenWidth",$(window).width());
document.documentElement.style.setProperty("--zScreenHeight",$(window).height());
}, 10);
})
$('body').on('contextmenu', function (e) {
return false
})
function returnNofSpaces(str) {
var arr = str.split('/')
var ele = ''
for (var j = 0; j < arr.length; j++) {
ele += ' '
}
return ele
}
function getReadablepath(str) {
var ele = ''
str = String(str)
if (str != 'undefined' && str != '') {
var n = str.indexOf('/')
if (n > -1) {
var arr = str.split('/')
for (var j = 0; j < arr.length; j++) {
var fName = $('#foldr_' + arr[j]).data('name')
if (typeof fName == 'undefined') continue
if (j == parseInt(arr.length - 1)) ele += fName
else ele += fName + ' > '
}
}
}
return ele
}
window['folderid'] = ''
window['edits'] = ''
function discardfile() {
window.simulcast.state.discardRecording()
$('#save-dialog').css('display', 'none')
}
function savefile() {
var title = $('#txtTitle').val()
var description = $('#txtDesc').val()
var folderid = window['folderid']
var startTime = $($("[sign='']")[0])
.find('span')
.text()
.split(':')
.reduce((acc, time) => 60 * acc + +time)
var duration = $($("[sign='']")[1])
.find('span')
.text()
.split(':')
.reduce((acc, time) => 60 * acc + +time)
if (folderid == '' || title == '') {
alert('Please provide title and folder location')
return
}
window.simulcast.$refs.mainContentRef.$refs.toolsRef.saveRecording(
title,
description,
folderid
)
//this will hide floater video
window.simulcast.state.meetingTerminated = true
//close the studio
Client.leaveRoom().then(error => {
})
}
function makeFileCopy() {
$('#error-message').html('')
$('#error-message').addClass('hide')
var title = $('#txtTitle').val()
var description = $('#txtDesc').val()
var folderid = window['folderid']
if (title.trim() == '') {
$('#error-message').html('Please provide a title')
$('#error-message').removeClass('hide')
return
}
if (folderid == '') {
$('#error-message').html('Please select a folder')
$('#error-message').removeClass('hide')
return
}
$('#save-as-dialog').modal('hide')
$('#waiting-dialog')
.find('.modal-header h3')
.text('Sending edits for processing....')
$('#waiting-dialog').modal({
backdrop: 'static',
keyboard: false
})
$.post(
'editVideo.php',
{
cid: g_clientId,
uid: currentUserId,
id: CONTENT_ID,
t: title,
desc: description,
fid: folderid,
action: 'multi-edits',
edits: window['edits'],
duration: window['vidduration'],
createcopy: true,
presid: PRESENTATION_ID,
slideid: SLIDE_ID,
elementid: ELEMENT_ID,
ext: video_ext
},
function (data) {
$('#waiting-dialog').modal('hide')
var data = JSON.parse(data)
if (data.stat == true) {
NEW_CONTENT_ID = data.id
//we notify presntation window of the new video ID. It is is been handled in presentation/index.php
top.postMessage(
{
action: 'VIDEO_EDITED',
id: NEW_CONTENT_ID,
elid: ELEMENT_ID
},
'*'
)
setTimeout(function () {
let options = {
title: 'Success',
text: "Your edits are submitted successfully for processing. We'll email you a link when ready.",
showOkButton: true,
showConfirmButton: false,
showCancelButton: false
}
window.videoEditor.refs.confirmModalRef.show(
options
)
}, 10)
}
}
)
}
function selectPresentation() {
window.open('', 'ZOOMIFIER').focus()
}
function openPresentation(presentationObj) {
window.simulcast.state.activeMeeting.setPresentation(presentationObj)
}
function getCurrentState() {
return window.simulcast.state.activeMeeting.lastCachedState
}
var videoThumbPosX = 0
var videoThumbPosY = 0
var presentationOffset = { left: 0, top: 0 }
var presenterOffset = { left: 0, top: 0 }
var presentationScale = 1
var presenterScale = 1
var presentationWidth = 1
var presentationHeight = 1
//this variable is used in activemeetingproxy
var win = window
function countdown(parent, callback) {
// This is the function we will call every 1000 ms using setInterval
function count() {
if (paragraph) {
// Remove the paragraph if there is one
paragraph.remove()
}
if (texts.length === 0) {
// If we ran out of text, use the callback to get started
// Also, remove the interval
// Also, return since we dont want this function to run anymore.
clearInterval(interval)
callback()
return
}
// Get the first item of the array out of the array.
// Your array is now one item shorter.
var text = texts.shift()
// Create a paragraph to add to the DOM
// This new paragraph will trigger an animation
paragraph = document.createElement('span')
paragraph.textContent = text
paragraph.className = text + ' nums'
parent.appendChild(paragraph)
}
// These are all the text we want to display
var texts = ['3', '2', '1']
// This will store the paragraph we are currently displaying
var paragraph = null
// Initiate an interval, but store it in a variable so we can remove it later.
var interval = setInterval(count, 1000)
}
//used for sahre component
function editorInitialized(editor) {
// console.error("caught");
$(editor).contents().find('body').css('font-family', 'Arial')
$(editor).contents().find('body').css('font-size', '14px')
}
function openNarrationInCustomshow(
title,
description,
folderid,
narrationId
) {
// window.location.href = "https://engage.fullfeel.io/presentation/index.php?id=fc492f6f657fa981"
var data = {
categoryId: folderid,
title: title,
narrationId: narrationId
}
$('#waiting-dialog')
.find('.modal-header h3')
.text('Creating CustomShow...')
$('#waiting-dialog').modal({
backdrop: 'static',
keyboard: false
})
$.ajax({
type: 'POST',
url: '/presentation/createCustomshow.php',
data: JSON.stringify(data),
dataType: 'json',
success: result => {
$("#waiting-dialog").modal('hide');
console.log(result)
// result.contentId
// openEditorEx(result.contentId,folderid,"")
window.open(
ZOOMIFIER_ENGAGE_URL + 'presentation/index.php?' +
'id=' +
result.contentId +
'&slide=0&publish=&fid=' +
folderid,'_blank' )
},
error: result => {
$('#waiting-dialog').modal('hide')
console.error('Error in generating Thumbnail.Error ::')
console.error(result)
}
})
}