repo: janusweb
action: commit
revision: 
path_from: 
revision_from: 729857968f699d1c3a9b633bae3a283201ffef5b:
path_to: 
revision_to: 
git.thebackupbox.net
janusweb
git clone git://git.thebackupbox.net/janusweb
commit 729857968f699d1c3a9b633bae3a283201ffef5b
Author: James Baicoianu 
Date:   Mon Sep 20 12:44:01 2021 -0700

    Update avatar animation and label while speaking

diff --git a/media/assets/webui/apps/comms/comms.js b/media/assets/webui/apps/comms/comms.js
index 208611f545eb22c786c46c4c2cc9ea93cc0a90a3..
index ..0b86ce9d6545d2448da1e39771e68538fd1d8375 100644
--- a/media/assets/webui/apps/comms/comms.js
+++ b/media/assets/webui/apps/comms/comms.js
@@ -290,6 +290,7 @@ elation.elements.define('janus-comms-voip', class extends elation.elements.base
 janus.registerElement('playerlabel', {
   player_name: '',
   font: 'monospace',
+  threshold: .4,

   create() {
     this.currentcolor = V(255,255,255);
@@ -308,8 +309,8 @@ janus.registerElement('playerlabel', {
       //collision_id: 'cube',
       collision_scale: V(.85,7,.1),
       collision_pos: V(0,-3,0),
-      //collidable: true,
-      //pickable: true,
+      collidable: false,
+      pickable: true,
       scale: V(2,.25,1),
       image_id: imageid,
       billboard: 'y',
@@ -375,7 +376,9 @@ janus.registerElement('playerlabel', {
     console.log('got an audio source', source);
   },
   setAudioVolume(volume) {
-    if (volume > .1) {
+    let scale = 1 + (volume > this.threshold ? volume / 2.5 : 0);
+    this.scale.set(scale, scale, scale);
+    if (volume > this.threshold) {
       this.label.col = '#0f0';
       if (this.colorreset) {
         clearTimeout(this.colorreset);
diff --git a/media/assets/webui/apps/comms/voip.js b/media/assets/webui/apps/comms/voip.js
index f281f611ae1abeda5a297c41047ea138043b3b4c..
index ..92f24bb97746a25d8774920e3d7a16ed75823956 100644
--- a/media/assets/webui/apps/comms/voip.js
+++ b/media/assets/webui/apps/comms/voip.js
@@ -371,7 +371,7 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
     this.defineAttribute('userid', { type: 'string', });
     this.defineAttribute('muted', { type: 'boolean', default: true, });
     this.defineAttribute('speaking', { type: 'boolean', default: false });
-
+    this.defineAttribute('threshold', { type: 'float', default: .4 });
   }
   create() {
     this.userid = player.getNetworkUsername();
@@ -433,6 +433,26 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
 */
     this.stream = data;

+    let listener = player.engine.systems.sound.getRealListener();
+    let context = listener.context;
+    let analyser = context.createAnalyser();
+    let source = context.createMediaStreamSource(this.stream);
+    source.connect(analyser);
+
+    analyser.fftSize = 32;
+    this.analyser = analyser;
+    this.audiobuffer = new Uint8Array(analyser.frequencyBinCount);
+
+    setInterval(() => {
+      analyser.getByteFrequencyData(this.audiobuffer);
+      let sum = 0;
+      for (let i = 0; i < this.audiobuffer.length; i++) {
+        sum += this.audiobuffer[i];
+      }
+      let avg = sum / this.audiobuffer.length;
+      this.updateVolume(avg / 100);
+    }, 20);
+
 /*
     player.createObject('object', {
       id: 'cone',
@@ -462,14 +482,16 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
     this.averagevolume = (percent * .6 + this.averagevolume * .4)
     if (isNaN(this.averagevolume)) this.averagevolume = 0;
     //this.style.opacity = percent;
-    if (this.averagevolume > .1) {
+    if (this.averagevolume > this.threshold) {
       this.speaking = true;
+      player.defaultanimation = 'speak';
       if (this.colorreset) {
         clearTimeout(this.colorreset);
       } 
       this.colorreset = setTimeout(() => {
         this.speaking = false;
         this.colorreset = false;
+        player.defaultanimation = 'idle';
       }, 200);
     }
   }
@@ -484,6 +506,7 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
       'hasvideo': { type: 'boolean', default: false },
       'averagevolume': { type: 'float', default: 0 },
       'speaking': { type: 'boolean', default: false },
+      'threshold': { type: 'float', default: .4 },
     });
     this.lastposition = V();
     setTimeout(() => this.setAttribute('active', true), 100);
@@ -525,6 +548,26 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
       this.audio = audio;
       this.appendChild(audio);
       this.hasaudio = true;
+
+      let listener = player.engine.systems.sound.getRealListener();
+      let context = listener.context;
+      let analyser = context.createAnalyser();
+      let source = context.createMediaStreamSource(audio.srcObject);
+      source.connect(analyser);
+
+      analyser.fftSize = 32;
+      this.analyser = analyser;
+      this.audiobuffer = new Uint8Array(analyser.frequencyBinCount);
+
+      setInterval(() => {
+        analyser.getByteFrequencyData(this.audiobuffer);
+        let sum = 0;
+        for (let i = 0; i < this.audiobuffer.length; i++) {
+          sum += this.audiobuffer[i];
+        }
+        let avg = sum / this.audiobuffer.length;
+        this.updateVolume(avg / 100);
+      }, 20);
     }

     let remoteuser = janus.network.remoteplayers[this.id];
@@ -603,7 +646,9 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.

       elation.events.add(this.remoteuser, 'update', ev => {
         // Store user's last known position so we know where they were once they leave
-        this.remoteuser.localToWorld(this.lastposition.set(0,0,0));
+        if (this.lastposition) {
+          this.remoteuser.localToWorld(this.lastposition.set(0,0,0));
+        }
       });
     }

@@ -658,7 +703,7 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
     if (isNaN(this.averagevolume)) this.averagevolume = 0;
     //this.style.opacity = percent;
 //console.log('update volume', percent, this);
-    if (this.averagevolume > .1) {
+    if (this.averagevolume > this.threshold) {
       this.speaking = true;
       if (this.colorreset) {
         clearTimeout(this.colorreset);
@@ -669,10 +714,8 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
       }, 200);
     }

-    let scale = 1 + this.averagevolume / 2.5;
     if (this.label3d) {
       this.label3d.setAudioVolume(this.averagevolume);
-      this.label3d.scale.set(scale, scale, scale);
     }
   }
 });

-----END OF PAGE-----