Skip to content

Commit fb61111

Browse files
committed
Fix all the things
1 parent 86cf43b commit fb61111

3 files changed

Lines changed: 83 additions & 603 deletions

File tree

obs-websocket-dotnet/Events.cs

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
using System.Collections.Generic;
77
using System.Diagnostics;
88
using OBSWebsocketDotNet.Types.Events;
9+
using System.Data.Common;
10+
using System.Net.WebSockets;
11+
using Websocket.Client;
912

1013
namespace 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

Comments
 (0)