var audioStream = undefined; var videoStream = undefined; var screenStream = undefined; var allAudioStream = undefined; var rtcConfig = { 'iceServers':'' }; function generateUniqueID(){ return '662cbd7e3c04d' } 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) } }) }