1+ // Import "Extensions" from extension.js to allow usages
2+ import Extensions from "/WebServerAI/assets/AI/js/components/extenstions.js" ;
3+ import Events from "/WebServerAI/assets/AI/js/components/Events.js" ;
4+ import { getInfo , HTMLDecoder } from '../../assets/AI/js/components/utils.js' ;
5+
6+ // START LOAD-UP (Required)
7+ const url = new URL ( import . meta. url ) ,
8+ ext = new Extensions ( ) ,
9+ events = new Events ( ) ,
10+ buildName = ext . getBuildName ( url ) ,
11+ buildID = ext . getBuildID ( url ) ;
12+ ext . saveTemplate ( buildName , ext . parse ( buildName ) ) ;
13+ const info = getInfo ( buildName ) ;
14+
15+ let baseLow = 0.5 ;
16+
17+ if ( ext . isAllowed ( buildName ) ) {
18+ // Get the volume visualizer element
19+ events . submit ( ( e ) => {
20+ e = HTMLDecoder ( e ) ;
21+ events . cmdLine ( / s e t s o u n d ? m e a s u r e ; ? " ( .* ?) " t o " ( w i d t h | h e i g h t ) " / , e , ( soundmeasure ) => {
22+ if ( soundmeasure ) {
23+ const elem = document . querySelector ( soundmeasure [ 1 ] ) ,
24+ size = soundmeasure [ 2 ] ;
25+ if ( elem . classList . contains ( 'meter' ) ) {
26+ elem . classList . add ( 'meter-' + size ) ;
27+ if ( size === 'width' ) {
28+ elem . querySelector ( '.meter-bar' ) . style . height = '100%' ;
29+ elem . querySelector ( '.meter-bar' ) . style . width = '0px' ;
30+ } else {
31+ elem . querySelector ( '.meter-bar' ) . style . width = '100%' ;
32+ elem . querySelector ( '.meter-bar' ) . style . height = '0px' ;
33+ }
34+ elem . classList . remove ( 'meter-' + ( size === 'width' ? 'height' : 'width' ) ) ;
35+ } else {
36+ elem . querySelector ( '.meter' ) . classList . add ( 'meter-' + size ) ;
37+ if ( size === 'width' ) {
38+ elem . querySelector ( '.meter .meter-bar' ) . style . height = '100%' ;
39+ elem . querySelector ( '.meter .meter-bar' ) . style . width = '0px' ;
40+ } else {
41+ elem . querySelector ( '.meter .meter-bar' ) . style . width = '100%' ;
42+ elem . querySelector ( '.meter .meter-bar' ) . style . height = '0px' ;
43+ }
44+ elem . querySelector ( '.meter' ) . classList . remove ( 'meter-' + ( size === 'width' ? 'height' : 'width' ) ) ;
45+ }
46+ }
47+ } ) ;
48+ } ) ;
49+ window . addEventListener ( 'wsa-build' , ( ) => {
50+ ext . update ( buildName ) ;
51+ document . querySelectorAll ( '.soundmeasure' ) . forEach ( async ( e ) => {
52+ const stream = await navigator . mediaDevices . getUserMedia ( { audio : true , video : false } ) ;
53+ const audioContext = new AudioContext ( ) ;
54+ const mediaStreamAudioSourceNode = audioContext . createMediaStreamSource ( stream ) ;
55+ const analyserNode = audioContext . createAnalyser ( ) ;
56+ mediaStreamAudioSourceNode . connect ( analyserNode ) ;
57+ const pcmData = new Float32Array ( analyserNode . fftSize ) ;
58+
59+
60+
61+ const onFrame = ( ) => {
62+ const sensitivity = ( e . querySelector ( '.sensitivity' ) ? parseFloat ( e . querySelector ( '.sensitivity' ) . value ) : 1 ) ; // Adjust this value to change sensitivity
63+ analyserNode . getFloatTimeDomainData ( pcmData ) ;
64+ let sumSquares = 0.0 ;
65+
66+ for ( const amplitude of pcmData ) {
67+ sumSquares += ( amplitude * sensitivity ) * ( amplitude * sensitivity ) ;
68+ }
69+ let vol = Math . sqrt ( sumSquares / pcmData . length ) ,
70+ meter = e . querySelector ( '.meter' ) ;
71+ if ( vol < baseLow )
72+ meter . querySelector ( '.meter-bar' ) . setAttribute ( 'vol-status' , 'low' ) ;
73+ else if ( vol >= baseLow && vol < ( baseLow + 0.2 ) )
74+ meter . querySelector ( '.meter-bar' ) . setAttribute ( 'vol-status' , 'medium' ) ;
75+ else
76+ meter . querySelector ( '.meter-bar' ) . setAttribute ( 'vol-status' , 'high' ) ;
77+ //console.log(meter.classList);
78+ ( meter . classList . contains ( 'meter-width' ) ? meter . querySelector ( '.meter-bar' ) . style . width = ( ( vol * 100 > 100 ) ? 100 : vol * 100 ) + '%' : meter . querySelector ( '.meter-bar' ) . style . height = ( ( vol * 100 > 100 ) ? 100 : vol * 100 ) + '%' ) ;
79+ window . requestAnimationFrame ( onFrame ) ;
80+ } ;
81+
82+ window . requestAnimationFrame ( onFrame ) ;
83+ } ) ;
84+ } ) ;
85+ } else
86+ ext . noSupport ( buildName ) ;
0 commit comments