1
- <!DOCTYPE html>
1
+ <!DOCTYPE html>
2
2
< html >
3
3
< head >
4
4
< meta charset ="utf-8 " />
98
98
let inputStates = { } ;
99
99
100
100
function mul_to_decibel ( inMul ) {
101
- const val = - ( Math . log10 ( inMul ) * 20 ) ;
101
+ const val = - ( Math . log10 ( inMul ) * 20 ) ;
102
102
return val < 60 ?val :Infinity ;
103
103
}
104
104
134
134
obs . on ( "InputVolumeMeters" , ( { inputs } ) => {
135
135
let i = 0 ;
136
136
for ( let { inputName, inputLevelsMul } of inputs ) {
137
- // if meter is missing, create it from the template
138
- if ( document . querySelector ( `#meter-${ i } ` ) == undefined ) {
137
+ // When this meter doesn't have an element yet, we create it from the template
138
+ if ( document . querySelector ( `#meter-${ i } ` ) == undefined ) {
139
139
let thisnode = document . querySelector ( 'template#metertemplate' ) . content . cloneNode ( true ) ;
140
140
thisnode . children [ 0 ] . id = 'meter-' + i ;
141
141
thisnode . children [ 0 ] . children [ 0 ] . innerText = inputName ;
142
142
document . querySelector ( '.wrapper' ) . appendChild ( thisnode ) ;
143
143
}
144
+
145
+ // If meter name is not the same (meaning inputs have been swapped places) we set the name
144
146
if ( document . querySelector ( `#meter-${ i } .Name` ) . innerText !== inputName ) document . querySelector ( `#meter-${ i } .Name` ) . innerText = inputName ;
147
+
148
+ // If we haven't seen this input before, we get it's settings
145
149
if ( ! ( inputName in inputStates ) ) {
146
- inputStates [ inputName ] = { muted : false , filters : [ ] } ;
150
+ inputStates [ inputName ] = { muted : false , volume : 0 , filters : [ ] } ;
147
151
obs . call ( 'GetInputMute' , { inputName } ) . then ( ( { inputMuted } ) => { inputStates [ inputName ] . muted = inputMuted ; } ) ;
152
+ obs . call ( 'GetInputVolume' , { inputName } ) . then ( ( { inputVolumeDb } ) => { inputStates [ inputName ] . volume = inputVolumeDb ; } ) ;
148
153
reloadSourceFilterList ( inputName ) ;
149
154
}
150
- let j = 0 ;
151
155
152
156
document . querySelector ( `#meter-${ i } ` ) . className = 'meter' + ( inputName in inputStates ? ( ( inputStates [ inputName ] . muted ? ' muted' : '' ) + ( inputStates [ inputName ] . filters . find ( f => f . filterKind === 'basic_eq_filter' ) ? ' EQEnabled' : '' ) + ( inputStates [ inputName ] . filters . find ( f => f . filterKind === 'compressor_filter' ) ? ' DYEnabled' : '' ) ) : '' ) ;
153
157
158
+ // Set the volume slider value at the bottom.
159
+ document . querySelector ( `#meter-${ i } >div.Volume` ) . innerText = ( ( inputName in inputStates && inputStates [ inputName ] . volume > - 100 ) ? Math . round ( inputStates [ inputName ] . volume * 10 ) / 10 : "-∞" ) + " dB" ;
160
+
154
161
// if no data inputlevel data is received, make sure to set the data to all zeros
155
162
if ( inputLevelsMul . length == 0 ) inputLevelsMul = [ [ 0 , 0 , 0 ] , [ 0 , 0 , 0 ] ]
156
163
if ( inputLevelsMul . length == 1 ) inputLevelsMul . push ( [ 0 , 0 , 0 ] ) ;
164
+
165
+ let j = 0 ;
157
166
for ( const level of inputLevelsMul ) {
158
167
if ( j >= 2 ) break ; // just do two channels
159
- const meterlevel = urlParams . has ( "metersource" ) ? level [ parseInt ( urlParams . get ( "metersource" ) ) ] : inputStates [ inputName ] . muted ? level [ 2 ] : level [ 1 ]
168
+ const meterlevel = urlParams . has ( "metersource" ) ? level [ parseInt ( urlParams . get ( "metersource" ) ) ] : inputStates [ inputName ] . muted ? level [ 2 ] : level [ 1 ] ; // level consists of [VU, POSTFADER, PREFADER]
160
169
const value = mul_to_decibel ( meterlevel ) ;
161
- document . querySelector ( `#meter-${ i } >div.Volume` ) . innerText = ( value == Infinity ) ? "-∞" : - Math . round ( value ) ;
162
170
if ( j == 0 ) document . querySelector ( `#meter-${ i } >div.VUMeter>div.Left` ) . style . setProperty ( '--amount' , value_to_perc ( value ) ) ;
163
171
if ( j == 1 ) document . querySelector ( `#meter-${ i } >div.VUMeter>div.Right` ) . style . setProperty ( '--amount' , value_to_perc ( value ) ) ;
164
172
j ++ ;
165
173
}
166
174
i ++ ;
167
175
if ( i >= 10 ) break ; // it cannot show more than 11... but just stop at 10
168
176
}
169
- // if more meters exist, delete them
170
- if ( document . querySelector ( `#meter-${ i } ` ) ) {
171
- const inputName = document . querySelector ( `#meter-${ i } .Name` ) . innerText ;
177
+
178
+ // If more meters exist, delete them
179
+ const allMeters = Array . from ( document . querySelectorAll ( '.meter' ) ) ;
180
+ const metersTooMuch = allMeters . filter ( ( e , idx ) => idx >= i ) ;
181
+ for ( const element of metersTooMuch ) {
182
+ const inputName = element . querySelector ( '.Name' ) ?. innerText ;
172
183
if ( inputName in inputStates ) delete inputStates [ inputName ] ;
173
- document . querySelector ( `#meter- ${ i } ` ) . remove ( ) ;
184
+ element . remove ( ) ;
174
185
}
175
186
176
187
updateNumberPosition ( ) ;
177
188
} ) ;
178
189
obs . on ( "InputMuteStateChanged" , ( { inputName, inputMuted } ) => {
179
190
if ( inputName in inputStates ) inputStates [ inputName ] . muted = inputMuted ;
180
191
} ) ;
192
+ obs . on ( "InputVolumeChanged" , ( { inputName, inputVolumeDb } ) => {
193
+ if ( inputName in inputStates ) inputStates [ inputName ] . volume = inputVolumeDb ;
194
+ } ) ;
181
195
obs . on ( "SourceFilterEnableStateChanged" , ( { sourceName } ) => reloadSourceFilterList ( sourceName ) ) ;
182
196
obs . on ( "SourceFilterCreated" , ( { sourceName } ) => reloadSourceFilterList ( sourceName ) ) ;
183
197
obs . on ( "SourceFilterRemoved" , ( { sourceName } ) => reloadSourceFilterList ( sourceName ) ) ;
232
246
< h1 > Not connected!</ h1 >
233
247
</ div >
234
248
</ body >
235
- </ html >
249
+ </ html >
0 commit comments