diff --git a/iframe.html b/iframe.html index 37a8258..b1c0839 100644 --- a/iframe.html +++ b/iframe.html @@ -415,7 +415,7 @@ if ("loudness" in e.data){ - console.log(e.data); + //console.log(e.data); if (document.getElementById("loudness")){ outputWindow = document.getElementById("loudness"); } else { diff --git a/index.html b/index.html index 07ab25a..ef5592f 100644 --- a/index.html +++ b/index.html @@ -2208,11 +2208,11 @@ // session.defaultBackgroundImages = ["./media/bg_sample1.webp", "./media/bg_sample2.webp"]; // for &effects=5 (virtual backgrounds) - + - + diff --git a/lib.js b/lib.js index fd989a8..64a7670 100644 --- a/lib.js +++ b/lib.js @@ -25476,65 +25476,74 @@ function updateIncomingVideoElement(UUID, video=true, audio=true){ } }); } - if (audio){ - if (session.audioEffects===true){ - var tracks = session.rpcs[UUID].streamSrc.getAudioTracks(); - if (tracks.length){ - var track = tracks[0]; - track = addAudioPipeline(UUID, track) - - var added = false; - var tracks2 = session.rpcs[UUID].videoElement.srcObject.getAudioTracks(); - tracks2.forEach(trk2 =>{ - if (trk2.label && (trk2.label == "MediaStreamAudioDestinationNode")){ // an old morphed node; delete it. - session.rpcs[UUID].videoElement.srcObject.removeTrack(trk2); - } else if (track.id == trk2.id){ // maybe it didn't morph; already added either way - added = true; - } else if ((trk2.id == tracks[0].id) && (track.id != tracks[0].id)){ // remove original audio track that is now morphed - session.rpcs[UUID].videoElement.srcObject.removeTrack(trk2); - } - }); - if (!added){ - session.rpcs[UUID].videoElement.srcObject.addTrack(track); + updateIncomingAudioElement(UUID) // do the same for audio now. + } +} + +function updateIncomingAudioElement(UUID){ // this can be called when turning on/off inbound audio processing. + if (!session.rpcs[UUID] || !session.rpcs[UUID].videoElement || !session.rpcs[UUID].streamSrc){return;} + + if (!session.rpcs[UUID].videoElement.srcObject) { + session.rpcs[UUID].videoElement.srcObject = createMediaStream(); + } + + if ((session.audioEffects===true) || session.pushLoudness){ + var tracks = session.rpcs[UUID].streamSrc.getAudioTracks(); + if (tracks.length){ + var track = tracks[0]; + track = addAudioPipeline(UUID, track) + + var added = false; + var tracks2 = session.rpcs[UUID].videoElement.srcObject.getAudioTracks(); + tracks2.forEach(trk2 =>{ + if (trk2.label && (trk2.label == "MediaStreamAudioDestinationNode")){ // an old morphed node; delete it. + session.rpcs[UUID].videoElement.srcObject.removeTrack(trk2); + } else if (track.id == trk2.id){ // maybe it didn't morph; already added either way + added = true; + } else if ((trk2.id == tracks[0].id) && (track.id != tracks[0].id)){ // remove original audio track that is now morphed + session.rpcs[UUID].videoElement.srcObject.removeTrack(trk2); } - - } else { - session.rpcs[UUID].videoElement.srcObject.getAudioTracks().forEach(trk=>{ // make sure to remove all tracks. - session.rpcs[UUID].videoElement.srcObject.remove(trk); - }); + }); + if (!added){ + session.rpcs[UUID].videoElement.srcObject.addTrack(track); } } else { - var expected = []; - tracks = session.rpcs[UUID].videoElement.srcObject.getAudioTracks(); // add audio tracks - session.rpcs[UUID].streamSrc.getAudioTracks().forEach((trk)=>{ - var added = false; - tracks.forEach(trk2 =>{ - if (trk2.id == trk.id){ - added=true; - expected.push(trk2); // - } - }); - if (!added){ - session.rpcs[UUID].videoElement.srcObject.addTrack(trk); - } - }); - tracks.forEach((trk)=>{ - var added = false; - expected.forEach((trk2)=>{ - if (trk2.id == trk.id){ - added=true; - } - }); - if (!added){ // not expected. so lets delete. - warnlog("this shouldn't happen that often, audio track orphaned. removing it"); - session.rpcs[UUID].videoElement.srcObject.removeTrack(trk); - } + session.rpcs[UUID].videoElement.srcObject.getAudioTracks().forEach(trk=>{ // make sure to remove all tracks. + session.rpcs[UUID].videoElement.srcObject.remove(trk); }); } - resetupAudioOut(session.rpcs[UUID].videoElement, true); + + } else { + var expected = []; + tracks = session.rpcs[UUID].videoElement.srcObject.getAudioTracks(); // add audio tracks + session.rpcs[UUID].streamSrc.getAudioTracks().forEach((trk)=>{ + var added = false; + tracks.forEach(trk2 =>{ + if (trk2.id == trk.id){ + added=true; + expected.push(trk2); // + } + }); + if (!added){ + session.rpcs[UUID].videoElement.srcObject.addTrack(trk); + } + }); + tracks.forEach((trk)=>{ + var added = false; + expected.forEach((trk2)=>{ + if (trk2.id == trk.id){ + added=true; + } + }); + if (!added){ // not expected. so lets delete. + warnlog("this shouldn't happen that often, audio track orphaned. removing it"); + session.rpcs[UUID].videoElement.srcObject.removeTrack(trk); + } + }); } + resetupAudioOut(session.rpcs[UUID].videoElement, true); } @@ -25585,6 +25594,8 @@ function addAudioPipeline(UUID, track){ // INBOUND AUDIO EFFECTS } else if (session.quietOthers){ log("adding a loudness meter node to audio"); source = audioMeterGuest(source, UUID, trackid); + } else if (session.pushLoudness){ + source = audioMeterGuest(source, UUID, trackid); } if (session.rpcs[UUID].channelOffset !== false){ diff --git a/main.js b/main.js index 402467e..fa0cbe6 100644 --- a/main.js +++ b/main.js @@ -273,6 +273,9 @@ async function main(){ // main asyncronous thread; mostly initializes the user s session.pushEffectsData=true; } + if (urlParams.has('pushloudness') || urlParams.has('getloudness')) { // this sets the loudness IFRAME API output, if available. + session.pushLoudness = true; + } if (urlParams.has('notmobile')){ session.mobile = false; @@ -4233,9 +4236,17 @@ async function main(){ // main asyncronous thread; mostly initializes the user s if ("getLoudness" in e.data) { log("GOT LOUDNESS REQUEST"); if (e.data.getLoudness == true) { - session.pushLoudness = true; - var loudness = {}; + if (!session.pushLoudness && (session.audioEffects!==true)){ + session.pushLoudness = true; + for (var i in session.rpcs) { + updateIncomingAudioElement(i); // this can be called when turning on/off inbound audio processing. + } + } else { + session.pushLoudness = true; + } + + var loudness = {}; for (var i in session.rpcs) { loudness[session.rpcs[i].streamID] = session.rpcs[i].stats.Audio_Loudness; } @@ -4245,7 +4256,14 @@ async function main(){ // main asyncronous thread; mostly initializes the user s }, session.iframetarget); } else { - session.pushLoudness = false; + if (session.pushLoudness && !session.audioEffects){ // turn off audio processing + session.pushLoudness = false; + for (var i in session.rpcs) { + updateIncomingAudioElement(i) + } + } else { + session.pushLoudness = false; // can't turn off audio processing + } } }