66using System . Collections . Generic ;
77using System . Diagnostics ;
88using OBSWebsocketDotNet . Types . Events ;
9+ using System . Data . Common ;
10+ using System . Net . WebSockets ;
11+ using Websocket . Client ;
912
1013namespace OBSWebsocketDotNet
1114{
@@ -265,10 +268,31 @@ public partial class OBSWebsocket
265268 /// </summary>
266269 public event EventHandler < InputAudioMonitorTypeChangedEventArgs > InputAudioMonitorTypeChanged ;
267270
271+
272+ private event EventHandler < InputVolumeMetersEventArgs > inputVolumeMeters ;
268273 /// <summary>
269274 /// A high-volume event providing volume levels of all active inputs every 50 milliseconds.
270275 /// </summary>
271- public event EventHandler < InputVolumeMetersEventArgs > InputVolumeMeters ;
276+ public event EventHandler < InputVolumeMetersEventArgs > InputVolumeMeters
277+ {
278+ // This event needs special subscription, handle that here
279+ add
280+ {
281+ if ( inputVolumeMeters == null || inputVolumeMeters . GetInvocationList ( ) . Length == 0 )
282+ {
283+ RegisterEvent ( EventSubscription . InputVolumeMeters ) ;
284+ }
285+ inputVolumeMeters += value ;
286+ }
287+ remove
288+ {
289+ inputVolumeMeters -= value ;
290+ if ( inputVolumeMeters == null || inputVolumeMeters . GetInvocationList ( ) . Length == 0 )
291+ {
292+ UnRegisterEvent ( EventSubscription . InputVolumeMeters ) ;
293+ }
294+ }
295+ }
272296
273297 /// <summary>
274298 /// The replay buffer has been saved.
@@ -292,6 +316,57 @@ public partial class OBSWebsocket
292316
293317 #endregion
294318
319+
320+ #region EventSubscription
321+
322+ private EventSubscription registeredEvents = EventSubscription . All ;
323+
324+ private void RegisterEvent ( EventSubscription newSubscription )
325+ {
326+ registeredEvents |= newSubscription ;
327+ SendReidentify ( ) ;
328+ }
329+
330+ private void UnRegisterEvent ( EventSubscription removeSubscription )
331+ {
332+ registeredEvents &= ~ removeSubscription ;
333+ SendReidentify ( ) ;
334+ }
335+
336+ /// <summary>
337+ /// Send a Reidentify with new event subscriptions
338+ /// </summary>
339+ /// <returns>true if we sent the reidentify, false if failed</returns>
340+ protected bool SendReidentify ( )
341+ {
342+ if ( wsConnection == null || ! wsConnection . IsStarted ) return false ; // #TODO check if we are in Identified/Connected state, if we didn't send our Identify yet, we shouldn't send Reidentify now
343+
344+ var requestFields = new JObject
345+ {
346+ { "eventSubscriptions" , ( uint ) registeredEvents }
347+ } ;
348+
349+ try
350+ {
351+ // Throws ErrorResponseException if auth fails
352+ SendRequest ( MessageTypes . ReIdentify , null , requestFields , false ) ;
353+ }
354+ catch ( ErrorResponseException ex )
355+ {
356+ Disconnected ? . Invoke ( this , new ObsDisconnectionInfo (
357+ ObsCloseCodes . UnknownReason ,
358+ "Reidentify Failed" ,
359+ new DisconnectionInfo ( DisconnectionType . Error , WebSocketCloseStatus . ProtocolError , "Reidentify Failed" , String . Empty , new AuthFailureException ( ) )
360+ ) ) ;
361+ Disconnect ( ) ;
362+ return false ;
363+ }
364+
365+ return true ;
366+ }
367+
368+ #endregion
369+
295370 #region EventProcessing
296371
297372 /// <summary>
@@ -500,7 +575,7 @@ protected void ProcessEventType(string eventType, JObject body)
500575 break ;
501576
502577 case nameof ( InputVolumeMeters ) :
503- InputVolumeMeters ? . Invoke ( this , new InputVolumeMetersEventArgs ( JsonConvert . DeserializeObject < List < JObject > > ( ( string ) body [ "inputs" ] ) ) ) ;
578+ inputVolumeMeters ? . Invoke ( this , new InputVolumeMetersEventArgs ( JsonConvert . DeserializeObject < List < InputVolumeMeter > > ( ( string ) body [ "inputs" ] ) ) ) ;
504579 break ;
505580
506581 case nameof ( ReplayBufferSaved ) :
0 commit comments