loudness iframe api improved + &pushloudness and &getloudness added

This commit is contained in:
SteveSeguin 2022-08-04 22:01:00 -04:00
parent e6dee5ca09
commit 7f191a0b93
4 changed files with 86 additions and 57 deletions

View File

@ -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 {

View File

@ -2208,11 +2208,11 @@
// session.defaultBackgroundImages = ["./media/bg_sample1.webp", "./media/bg_sample2.webp"]; // for &effects=5 (virtual backgrounds)
</script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=388"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=389"></script>
<!--
// If you wish to change branding, blank offers a good clean start.
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
-->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=402"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=403"></script>
</body>
</html>

113
lib.js
View File

@ -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){

24
main.js
View File

@ -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
}
}
}