Add files via upload

This commit is contained in:
Steve Seguin 2021-02-01 09:58:31 -05:00 committed by GitHub
parent c4aed40be6
commit 9172ebade1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 409 additions and 365 deletions

View File

@ -55,7 +55,7 @@
}
</style>
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<link rel="stylesheet" href="./main.css?ver=43" />
<link rel="stylesheet" href="./main.css?ver=45" />
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter.min.js"></script>
</head>
<body id="main" class="hidden">
@ -67,7 +67,7 @@
<link itemprop="url" href="./media/obsNinja_logo_full.png" />
</span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=26"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=174"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=176"></script>
<input id="zoomSlider" type="range" style="display: none;" />
<div id="header">
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px;">
@ -76,7 +76,7 @@
</span>
</a>
<div id="head1" style="display: inline-block; padding:1px; position: relative;">
<input type="text" autocorrect="off" autocapitalize="none" id="joinroomID" autofocus name="joinroomID" size="22" placeholder="Join by Room Name here" alt="Enter a room name to join" title="Enter a room name to quick join" onkeyup="jumptoroom(event)"/>
<input type="text" autocorrect="off" autocapitalize="none" id="joinroomID" name="joinroomID" size="22" placeholder="Join by Room Name here" alt="Enter a room name to join" title="Enter a room name to quick join" onkeyup="jumptoroom(event)"/>
<button onclick="jumptoroom();" role="button" aria-pressed="false" alt="Join room" title="Join room" >GO</button>
</div>
<div id="head3" style="display: inline-block;" class="advanced">
@ -651,8 +651,7 @@
The VP9 codec on Chromium-based browsers seems to lag when screen-sharing at the moment. Use the OBS Virtual Camera as a capture source instead.
</li>
<br />
🥳 Site Updated: Jan 30th, 2021. The previous version can be found at
🥳 Site Updated: <a href="https://github.com/steveseguin/obsninja/wiki/v16-release-notes">Fed 1st, 2021</a>. The previous version can be found at
<a href="https://obs.ninja/v15/">https://obs.ninja/v15/</a> if you are having new issues.
<br />
@ -1158,7 +1157,7 @@
}
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
session.version = "16.0";
session.version = "16.1";
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
session.defaultPassword = "someEncryptionKey123"; // Disabling improves compatibility and is helpful for debugging.
@ -1223,7 +1222,7 @@
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
<script type="text/javascript" crossorigin="anonymous" id="mixer-js" src="./mixer.js?ver=2"></script>
-->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=160"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=162"></script>
<script type="text/javascript">
setTimeout(function(){ // lazy load
var script = document.createElement('script');

137
main.css
View File

@ -483,24 +483,17 @@ button.glyphicon-button.active.focus {
position: absolute;
pointer-events: auto;
}
#container.vidcon {
height:100%;
}
@media only screen and (max-width: 700px){
#subControlButtons {
padding: 2px 4px;
transform: scale(0.9);
}
#controlButtons {
height: 54px;
transform: scale(0.8) translateY(20%);
}
}
@media only screen and (max-width: 400px){
#subControlButtons {
padding: 1px 2px;
zoom: .9;
transform: scale(0.8);
}
#controlButtons {
height: 48px;
transform: scale(0.8) translateY(20%);
}
}
@media only screen and (max-width: 300px){
@ -509,40 +502,80 @@ button.glyphicon-button.active.focus {
}
}
@media only screen and (max-height: 700px){
#subControlButtons {
padding: 0;
bottom: 0em;
transform: scale(0.9);
}
#controlButtons {
height: 54px;
}
}
@media only screen and (max-height: 540px){
#subControlButtons {
padding: 0;
bottom: 0em;
transform: scale(0.85);
transform: scale(0.90);
}
#controlButtons {
height: 51px;
#gridlayout>#container.vidcon {
height:90%
}
#controlButtons {
height:54px;
}
}
@media only screen and (max-height: 400px){
#subControlButtons {
padding: 0;
bottom: 0em;
transform: scale(0.8);
transform: scale(0.85);
}
#controlButtons {
height: 48px;
}
#header{
display:none;
}
#gridlayout>#container.vidcon {
height:85%
}
#controlButtons {
height:50px;
}
}
@media only screen and (max-height: 240px){
#gridlayout>#container.vidcon {
height:78%
}
#subControlButtons {
transform: scale(0.77);
}
#controlButtons {
height:46.2px;
}
}
@media only screen and (max-height: 190px){
#gridlayout>#container.vidcon {
height:75%
}
#subControlButtons {
transform: scale(0.73);
}
#controlButtons {
height:42px
}
}
@media only screen and (max-height: 160px){
#gridlayout>#container.vidcon {
height:70%
}
#subControlButtons {
transform: scale(0.65);
}
#controlButtons {
height:38px
}
}
@media only screen and (max-height: 120px){
#gridlayout>#container.vidcon {
height:70%
}
#subControlButtons {
transform: scale(0.52);
}
#controlButtons {
height:30px
}
}
@keyframes pulse {
0% {
@ -1210,6 +1243,7 @@ img {
}
.popup .menu { margin: 2px; }
.my-float {
margin-top: 7px;
opacity: 0.9;
@ -1218,42 +1252,7 @@ img {
font-size: 32px;
color: white;
}
@media only screen and (max-height: 650px) {
.my-float {
margin-top: 4px;
margin-left: 1px;
}
.toggleSize {
font-size: 24px;
color: white;
}
.float {
opacity: 0.8;
width: 30px;
height: 30px;
background-color: #6666;
color: #FFF;
border-radius: 38px;
text-align: center;
margin: 5px;
pointer-events: auto;
}
.float2 {
opacity: 0.8;
width: 30px;
height: 30px;
background-color: #8888;
color: #FFF;
border-radius: 38px;
text-align: center;
z-index: 10;
margin: 5px;
pointer-events: auto;
}
}
img {
max-width: 100%;
}

622
main.js
View File

@ -1,11 +1,7 @@
/*
* Copyright (c) 2020 Steve Seguin. All Rights Reserved.
*
* Use of this source code is governed by the APGLv3 open-source license
* that can be found in the LICENSE file in the root of the source
* tree. Alternative licencing options can be made available on request.
*
*/
* Copyright (c) 2020 Steve Seguin. All Rights Reserved.
*
*/
/*jshint esversion: 6 */
var formSubmitting = true;
@ -25,9 +21,11 @@ function addEventToAll(targets, trigger, callback) { // js helper
var triggers = trigger.split(" ");
for (let i = 0; i < target.length; i++) {
for (let j = 0; j < triggers.length; j++) {
target[i].addEventListener(triggers[j], function(e) {
callback(e, target[i]);
});
setTimeout(function(t1,t2){
t1.addEventListener(t2, function(e) {
callback(e, t1);
});
},0,target[i],triggers[j]);
}
}
}
@ -751,6 +749,26 @@ if (urlParams.has('mute') || urlParams.has('muted') || urlParams.has('m')) {
session.muted = true;
}
if (urlParams.has('videomute') || urlParams.has('videomuted') || urlParams.has('vm')) {
session.videoMutedFlag = true;
}
if (urlParams.has('deaf') || urlParams.has('deafen')) {
session.directorSpeakerMuted=true; // false == true in this case.
}
if (urlParams.has('blind')) {
session.directorDisplayMuted=true; // false == true in this case.
}
if (urlParams.has('dpi') || urlParams.has('dpr')) {
session.devicePixelRatio = urlParams.get('dpi') || urlParams.get('dpr') || 2.0;
} else if (window.devicePixelRatio && window.devicePixelRatio!==1){
session.devicePixelRatio = window.devicePixelRatio; // this annoys me to no end.
}
if (urlParams.has('speakermute') || urlParams.has('mutespeaker') || urlParams.has('sm') || urlParams.has('ms')) {
session.speakerMuted = true;
getById("mutespeakertoggle").className = "las la-volume-mute my-float toggleSize";
@ -2152,309 +2170,310 @@ if (urlParams.has('queue')) {
session.queue = true;
}
window.onmessage = function(e) { // iFRAME support
log(e);
try {
if ("function" in e.data) { // these are calling in-app functions, with perhaps a callback -- TODO: add callbacks
var ret = null;
if (e.data.function === "previewWebcam") {
ret = previewWebcam();
} else if (e.data.function === "changeHTML") {
ret = getById(e.data.target);
ret.innerHTML = e.data.value;
} else if (e.data.function === "publishScreen") {
ret = publishScreen();
} else if (e.data.function === "eval") {
eval(e.data.value); // eval == evil ; feedback welcomed
}
}
} catch (err) {
errorlog(err);
}
if ("sendChat" in e.data) {
sendChat(e.data.sendChat); // sends to all peers; more options down the road
}
// Chat out gets called via getChatMessage function
// Related code: parent.postMessage({"chat": {"msg":-----,"type":----,"time":---} }, "*");
if ("mic" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.mic === true) { // unmute
session.muted = false; // set
log(session.muted);
toggleMute(true); // apply
} else if (e.data.mic === false) { // mute
session.muted = true; // set
log(session.muted);
toggleMute(true); // apply
} else if (e.data.mic === "toggle") { // toggle
toggleMute();
}
}
if ("camera" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.camera === true) { // unmute
session.videoMuted = false; // set
log(session.videoMuted);
toggleVideoMute(true); // apply
} else if (e.data.camera === false) { // mute
session.videoMuted = true; // set
log(session.videoMuted);
toggleVideoMute(true); // apply
} else if (e.data.camera === "toggle") { // toggle
toggleVideoMute();
}
}
if ("mute" in e.data) {
if (e.data.mute === true) { // unmute
session.speakerMuted = true; // set
toggleSpeakerMute(true); // apply
} else if (e.data.mute === false) { // mute
session.speakerMuted = false; // set
toggleSpeakerMute(true); // apply
} else if (e.data.mute === "toggle") { // toggle
toggleSpeakerMute();
}
} else if ("speaker" in e.data) { // same thing as mute.
if (e.data.speaker === true) { // unmute
session.speakerMuted = false; // set
toggleSpeakerMute(true); // apply
} else if (e.data.speaker === false) { // mute
session.speakerMuted = true; // set
toggleSpeakerMute(true); // apply
} else if (e.data.speaker === "toggle") { // toggle
toggleSpeakerMute();
}
}
if ("volume" in e.data) {
for (var i in session.rpcs) {
try {
session.rpcs[i].videoElement.volume = parseFloat(e.data.volume);
} catch (e) {
errorlog(e);
}
}
}
if ("bitrate" in e.data) {
for (var i in session.rpcs) {
try {
session.requestRateLimit(parseInt(e.data.bitrate), i);
} catch (e) {
errorlog(e);
}
}
}
if ("sceneState" in e.data) { // TRUE OR FALSE - tells the connected peers if they are live or not via a tally light change.
var visibility = e.data.sceneState;
var bundle = {};
bundle.sceneUpdate = [];
for (var UUID in session.rpcs) {
if (session.rpcs[UUID].visibility !== visibility) { // only move forward if there is a change; the event likes to double fire you see.
session.rpcs[UUID].visibility = visibility;
var msg = {};
msg.visibility = visibility;
if (session.rpcs[UUID].videoElement.style.display == "none") { // Flag will be left alone, but message will say its disabled.
msg.visibility = false;
if (isIFrame) { // reduce CPU load if not needed.
window.onmessage = function(e) { // iFRAME support
log(e);
try {
if ("function" in e.data) { // these are calling in-app functions, with perhaps a callback -- TODO: add callbacks
var ret = null;
if (e.data.function === "previewWebcam") {
ret = previewWebcam();
} else if (e.data.function === "changeHTML") {
ret = getById(e.data.target);
ret.innerHTML = e.data.value;
} else if (e.data.function === "publishScreen") {
ret = publishScreen();
} else if (e.data.function === "eval") {
eval(e.data.value); // eval == evil ; feedback welcomed
}
}
} catch (err) {
errorlog(err);
}
msg.UUID = UUID;
session.sendRequest(msg, UUID);
bundle.sceneUpdate.push(msg);
if ("sendChat" in e.data) {
sendChat(e.data.sendChat); // sends to all peers; more options down the road
}
// Chat out gets called via getChatMessage function
// Related code: parent.postMessage({"chat": {"msg":-----,"type":----,"time":---} }, "*");
if ("mic" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.mic === true) { // unmute
session.muted = false; // set
log(session.muted);
toggleMute(true); // apply
} else if (e.data.mic === false) { // mute
session.muted = true; // set
log(session.muted);
toggleMute(true); // apply
} else if (e.data.mic === "toggle") { // toggle
toggleMute();
}
}
session.sendRequest(bundle); // we want all publishing peers to know the state
}
if ("sendMessage" in e.data) { // webrtc send to viewers
session.sendMessage(e.data);
}
if ("camera" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.camera === true) { // unmute
session.videoMuted = false; // set
log(session.videoMuted);
toggleVideoMute(true); // apply
} else if (e.data.camera === false) { // mute
session.videoMuted = true; // set
log(session.videoMuted);
toggleVideoMute(true); // apply
} else if (e.data.camera === "toggle") { // toggle
toggleVideoMute();
}
}
if ("sendRequest" in e.data) { // webrtc send to publishers
session.sendRequest(e.data);
}
if ("sendPeers" in e.data) { // webrtc send message to every connected peer; like send and request; a hammer vs a knife.
session.sendPeers(e.data);
}
if ("reload" in e.data) {
location.reload();
}
if ("getStats" in e.data) {
var stats = {};
stats.total_outbound_connections = Object.keys(session.pcs).length;
stats.total_inbound_connections = Object.keys(session.rpcs).length;
stats.inbound_stats = {};
for (var i in session.rpcs) {
stats.inbound_stats[session.rpcs[i].streamID] = session.rpcs[i].stats;
if ("mute" in e.data) {
if (e.data.mute === true) { // unmute
session.speakerMuted = true; // set
toggleSpeakerMute(true); // apply
} else if (e.data.mute === false) { // mute
session.speakerMuted = false; // set
toggleSpeakerMute(true); // apply
} else if (e.data.mute === "toggle") { // toggle
toggleSpeakerMute();
}
} else if ("speaker" in e.data) { // same thing as mute.
if (e.data.speaker === true) { // unmute
session.speakerMuted = false; // set
toggleSpeakerMute(true); // apply
} else if (e.data.speaker === false) { // mute
session.speakerMuted = true; // set
toggleSpeakerMute(true); // apply
} else if (e.data.speaker === "toggle") { // toggle
toggleSpeakerMute();
}
}
for (var uuid in session.pcs) {
setTimeout(function(UUID) {
session.pcs[UUID].getStats().then(function(stats) {
stats.forEach(stat => {
if (stat.type == "outbound-rtp") {
if (stat.kind == "video") {
if ("volume" in e.data) {
for (var i in session.rpcs) {
try {
session.rpcs[i].videoElement.volume = parseFloat(e.data.volume);
} catch (e) {
errorlog(e);
}
}
}
if ("qualityLimitationReason" in stat) {
session.pcs[UUID].stats.quality_Limitation_Reason = stat.qualityLimitationReason;
if ("bitrate" in e.data) {
for (var i in session.rpcs) {
try {
session.requestRateLimit(parseInt(e.data.bitrate), i);
} catch (e) {
errorlog(e);
}
}
}
if ("sceneState" in e.data) { // TRUE OR FALSE - tells the connected peers if they are live or not via a tally light change.
var visibility = e.data.sceneState;
var bundle = {};
bundle.sceneUpdate = [];
for (var UUID in session.rpcs) {
if (session.rpcs[UUID].visibility !== visibility) { // only move forward if there is a change; the event likes to double fire you see.
session.rpcs[UUID].visibility = visibility;
var msg = {};
msg.visibility = visibility;
if (session.rpcs[UUID].videoElement.style.display == "none") { // Flag will be left alone, but message will say its disabled.
msg.visibility = false;
}
msg.UUID = UUID;
session.sendRequest(msg, UUID);
bundle.sceneUpdate.push(msg);
}
}
session.sendRequest(bundle); // we want all publishing peers to know the state
}
if ("sendMessage" in e.data) { // webrtc send to viewers
session.sendMessage(e.data);
}
if ("sendRequest" in e.data) { // webrtc send to publishers
session.sendRequest(e.data);
}
if ("sendPeers" in e.data) { // webrtc send message to every connected peer; like send and request; a hammer vs a knife.
session.sendPeers(e.data);
}
if ("reload" in e.data) {
location.reload();
}
if ("getStats" in e.data) {
var stats = {};
stats.total_outbound_connections = Object.keys(session.pcs).length;
stats.total_inbound_connections = Object.keys(session.rpcs).length;
stats.inbound_stats = {};
for (var i in session.rpcs) {
stats.inbound_stats[session.rpcs[i].streamID] = session.rpcs[i].stats;
}
for (var uuid in session.pcs) {
setTimeout(function(UUID) {
session.pcs[UUID].getStats().then(function(stats) {
stats.forEach(stat => {
if (stat.type == "outbound-rtp") {
if (stat.kind == "video") {
if ("qualityLimitationReason" in stat) {
session.pcs[UUID].stats.quality_Limitation_Reason = stat.qualityLimitationReason;
}
if ("framesPerSecond" in stat) {
session.pcs[UUID].stats.resolution = stat.frameWidth + " x " + stat.frameHeight + " @ " + stat.framesPerSecond;
}
if ("encoderImplementation" in stat) {
session.pcs[UUID].stats.encoder = stat.encoderImplementation;
}
}
if ("framesPerSecond" in stat) {
session.pcs[UUID].stats.resolution = stat.frameWidth + " x " + stat.frameHeight + " @ " + stat.framesPerSecond;
} else if (stat.type == "remote-candidate") {
if ("relayProtocol" in stat) {
if ("ip" in stat) {
session.pcs[UUID].stats.remote_relay_IP = stat.ip;
}
session.pcs[UUID].stats.remote_relayProtocol = stat.relayProtocol;
}
if ("encoderImplementation" in stat) {
session.pcs[UUID].stats.encoder = stat.encoderImplementation;
if ("candidateType" in stat) {
session.pcs[UUID].stats.remote_candidateType = stat.candidateType;
}
} else if (stat.type == "local-candidate") {
if ("relayProtocol" in stat) {
if ("ip" in stat) {
session.pcs[UUID].stats.local_relayIP = stat.ip;
}
session.pcs[UUID].stats.local_relayProtocol = stat.relayProtocol;
}
if ("candidateType" in stat) {
session.pcs[UUID].stats.local_candidateType = stat.candidateType;
}
}
} else if (stat.type == "remote-candidate") {
if ("relayProtocol" in stat) {
if ("ip" in stat) {
session.pcs[UUID].stats.remote_relay_IP = stat.ip;
}
session.pcs[UUID].stats.remote_relayProtocol = stat.relayProtocol;
}
if ("candidateType" in stat) {
session.pcs[UUID].stats.remote_candidateType = stat.candidateType;
}
} else if (stat.type == "local-candidate") {
if ("relayProtocol" in stat) {
if ("ip" in stat) {
session.pcs[UUID].stats.local_relayIP = stat.ip;
}
session.pcs[UUID].stats.local_relayProtocol = stat.relayProtocol;
}
if ("candidateType" in stat) {
session.pcs[UUID].stats.local_candidateType = stat.candidateType;
}
}
return;
});
return;
});
return;
});
}, 0, uuid);
}
setTimeout(function() {
stats.outbound_stats = {};
for (var i in session.pcs) {
stats.outbound_stats[i] = session.pcs[i].stats;
}, 0, uuid);
}
parent.postMessage({
"stats": stats
}, "*");
}, 1000);
}
setTimeout(function() {
stats.outbound_stats = {};
for (var i in session.pcs) {
stats.outbound_stats[i] = session.pcs[i].stats;
}
parent.postMessage({
"stats": stats
}, "*");
}, 1000);
}
if ("getLoudness" in e.data) {
log("GOT LOUDNESS REQUEST");
if (e.data.getLoudness == true) {
var loudness = {};
if ("getLoudness" in e.data) {
log("GOT LOUDNESS REQUEST");
if (e.data.getLoudness == true) {
var loudness = {};
for (var i in session.rpcs) {
loudness[session.rpcs[i].streamID] = session.rpcs[i].stats.Audio_Loudness;
}
parent.postMessage({
"loudness": loudness
}, "*");
session.pushLoudness = true;
} else {
session.pushLoudness = false;
}
}
if ("getStreamIDs" in e.data) {
log("GOT LOUDNESS REQUEST");
if (e.data.getStreamIDs == true) {
var streamIDs = {};
for (var i in session.rpcs) {
streamIDs[session.rpcs[i].streamID] = session.rpcs[i].label;
}
parent.postMessage({
"streamIDs": streamIDs
}, "*");
}
}
if ("close" in e.data) {
for (var i in session.rpcs) {
loudness[session.rpcs[i].streamID] = session.rpcs[i].stats.Audio_Loudness;
try {
session.rpcs[i].close();
} catch (e) {
errorlog(e);
}
}
parent.postMessage({
"loudness": loudness
}, "*");
session.pushLoudness = true;
} else {
session.pushLoudness = false;
}
}
if ("getStreamIDs" in e.data) {
log("GOT LOUDNESS REQUEST");
if (e.data.getStreamIDs == true) {
var streamIDs = {};
for (var i in session.rpcs) {
streamIDs[session.rpcs[i].streamID] = session.rpcs[i].label;
}
parent.postMessage({
"streamIDs": streamIDs
}, "*");
}
}
if ("close" in e.data) {
for (var i in session.rpcs) {
if ("style" in e.data) {
try {
session.rpcs[i].close();
const style = document.createElement('style');
style.textContent = e.data.style;
document.head.append(style);
log(style);
} catch (e) {
errorlog(e);
}
}
}
if ("style" in e.data) {
try {
const style = document.createElement('style');
style.textContent = e.data.style;
document.head.append(style);
log(style);
} catch (e) {
errorlog(e);
if ("automixer" in e.data) {
if (e.data.automixer == true) {
session.manual = false;
try {
updateMixer();
} catch (e) {}
} else if (e.data.automixer == false) {
session.manual = true;
}
}
}
if ("automixer" in e.data) {
if (e.data.automixer == true) {
session.manual = false;
try {
updateMixer();
} catch (e) {}
} else if (e.data.automixer == false) {
session.manual = true;
}
}
if ("target" in e.data) {
log(e.data);
for (var i in session.rpcs) {
try {
if ("streamID" in session.rpcs[i]) {
if ((session.rpcs[i].streamID == e.data.target) || (e.data.target == "*")) {
try {
if ("settings" in e.data) {
for (const property in e.data.settings) {
session.rpcs[i].videoElement[property] = e.data.settings[property];
if ("target" in e.data) {
log(e.data);
for (var i in session.rpcs) {
try {
if ("streamID" in session.rpcs[i]) {
if ((session.rpcs[i].streamID == e.data.target) || (e.data.target == "*")) {
try {
if ("settings" in e.data) {
for (const property in e.data.settings) {
session.rpcs[i].videoElement[property] = e.data.settings[property];
}
}
}
if ("add" in e.data) {
getById("gridlayout").appendChild(session.rpcs[i].videoElement);
if ("add" in e.data) {
getById("gridlayout").appendChild(session.rpcs[i].videoElement);
} else if ("remove" in e.data) {
try {
session.rpcs[i].videoElement.parentNode.removeChild(session.rpcs[i].videoElement);
} catch (e) {
} else if ("remove" in e.data) {
try {
session.rpcs[i].videoElement.parentNode.parentNode.removeChild(session.rpcs[i].videoElement.parentNode);
} catch (e) {}
session.rpcs[i].videoElement.parentNode.removeChild(session.rpcs[i].videoElement);
} catch (e) {
try {
session.rpcs[i].videoElement.parentNode.parentNode.removeChild(session.rpcs[i].videoElement.parentNode);
} catch (e) {}
}
}
} catch (e) {
errorlog(e);
}
} catch (e) {
errorlog(e);
}
}
} catch (e) {
errorlog(e);
}
} catch (e) {
errorlog(e);
}
}
}
};
};
}
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
@ -3339,12 +3358,12 @@ function toggleSpeakerMute(apply = false) { // TODO: I need to have this be MUTE
for (var UUID in session.rpcs) {
if (session.rpcs[UUID].videoElement) {
if (UUID === session.directorUUID) {
session.rpcs[UUID].videoElement.muted = false; // unmute director
log("MAKE SURE DIRECTOR ISN'T MUTED");
} else {
//if (UUID === session.directorUUID) {
// session.rpcs[UUID].videoElement.muted = false; // unmute director
// log("MAKE SURE DIRECTOR ISN'T MUTED");
//} else {
session.rpcs[UUID].videoElement.muted = session.speakerMuted;
}
// }
}
}
@ -3514,6 +3533,9 @@ function toggleVideoMute(apply = false) { // TODO: I need to have this be MUTE,
});
}
}
var msg = {};
msg.videoMuted = session.videoMuted;
session.sendMessage(msg);
}
var toggleSettingsState = false;
@ -3619,10 +3641,15 @@ function hangup2() {
getById("settingsbutton").classList.add("advanced");
getById("mutebutton").classList.add("advanced");
getById("hangupbutton2").classList.add("advanced");
getById("chatbutton").classList.remove("advanced");
//getById("chatbutton").classList.remove("advanced");
getById("controlButtons").style.display = "inherit";
getById("mutespeakerbutton").classList.remove("advanced");
//getById("mutespeakerbutton").classList.add("advanced");
getById("mutevideobutton").classList.add("advanced");
getById("screenshare2button").classList.add("advanced");
getById("screensharebutton").classList.add("float");
getById("screensharebutton").classList.remove("float2");
if (session.showDirector == false) {
getById("miniPerformer").innerHTML = '<button id="press2talk" onmousedown="event.preventDefault(); event.stopPropagation();" style="width:auto;margin-left:5px;height:45px;border-radius: 38px;" class="float" onclick="press2talk(true);" title="You can also enable the director`s Video Output afterwards by clicking the Setting`s button"><i class="las la-headset"></i><span data-translate="push-to-talk-enable"> enable director`s microphone or video<br />(only guests can see this feed)</span></button>';
} else {
@ -3834,14 +3861,34 @@ function remoteSpeakerMute(ele, event) {
var msg = {};
if (ele.dataset.mute == 0) {
msg.speakerMute = ele.dataset.mute;
msg.speakerMute = false;
} else {
msg.speakerMute = 0;
msg.speakerMute = true;
}
msg.UUID = ele.dataset.UUID;
session.sendRequest(msg, ele.dataset.UUID);
}
function updateRemoteSpeakerMute(UUID) {
var ele = document.querySelectorAll('[data-action-type="toggle-remote-speaker"][data--u-u-i-d="' + UUID + '"]');
if (ele[0]) {
ele[0].classList.add("pressed");
ele[0].dataset.mute = 1;
ele[0].className = "pressed";
ele[0].children[1].innerHTML = "Un-deafen";
}
}
function updateRemoteDisplayMute(UUID) {
var ele = document.querySelectorAll('[data-action-type="toggle-remote-display"][data--u-u-i-d="' + UUID + '"]');
if (ele[0]) {
ele[0].classList.add("pressed");
ele[0].dataset.mute = 1;
ele[0].className = "pressed";
ele[0].children[1].innerHTML = "Un-blind";
}
}
function remoteDisplayMute(ele, event) {
log("display mute");
if (!((event.ctrlKey) || (event.metaKey))) {
@ -3858,9 +3905,9 @@ function remoteDisplayMute(ele, event) {
var msg = {};
if (ele.dataset.mute == 0) {
msg.displayMute = ele.dataset.mute;
msg.displayMute = false;
} else {
msg.displayMute = 0;
msg.displayMute = true;
}
msg.UUID = ele.dataset.UUID;
session.sendRequest(msg, ele.dataset.UUID);
@ -6117,7 +6164,6 @@ function gotDevices2(deviceInfos) {
enumerateDevices().then(gotDevices2).then(function() {
ScreenShareState = false;
pokeIframeAPI("screen-share-ended");
getById("screensharebutton").classList.add("float");
getById("screensharebutton").classList.remove("float2");
});
@ -11422,7 +11468,7 @@ addEventToAll("#audioSource", 'mousedown touchend focusin focusout', function(e,
}, parentElement = getById('multiselect-trigger').parentNode);
}
e.stopPropagation();
e.preventDefault();
//e.preventDefault();
});
addEventToAll("#audioSource3", 'mousedown touchend focusin focusout', function(e, ele) {
var state = getById('multiselect-trigger3').dataset.state || 0;
@ -11444,7 +11490,7 @@ addEventToAll("#audioSource3", 'mousedown touchend focusin focusout', function(e
}, getById('multiselect-trigger3').parentNode);
}
e.stopPropagation();
e.preventDefault();
//e.preventDefault();
});
addEventToAll("#multiselect-trigger", 'mousedown touchend focusin focusout', function(e, ele) {
var state = ele.dataset.state || 0;

File diff suppressed because one or more lines are too long