diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp
index 4fbd1d73..85404737 100644
--- a/src/WSEvents.cpp
+++ b/src/WSEvents.cpp
@@ -62,7 +62,15 @@ void* calldata_get_ptr(const calldata_t* data, const char* name) {
return ptr;
}
-WSEvents* WSEvents::Instance = nullptr;
+WSEventsPtr WSEvents::_instance = WSEventsPtr(nullptr);
+
+WSEventsPtr WSEvents::Current() {
+ return _instance;
+}
+
+void WSEvents::ResetCurrent(WSServerPtr srv) {
+ _instance = WSEventsPtr(new WSEvents(srv));
+}
WSEvents::WSEvents(WSServerPtr srv) {
_srv = srv;
diff --git a/src/WSEvents.h b/src/WSEvents.h
index 086d8a4f..97187404 100644
--- a/src/WSEvents.h
+++ b/src/WSEvents.h
@@ -22,17 +22,27 @@ with this program. If not, see
#include
#include
+
#include
+#include
+
#include "WSServer.h"
-class WSEvents : public QObject {
- Q_OBJECT
- public:
+class WSEvents;
+typedef QSharedPointer WSEventsPtr;
+
+class WSEvents : public QObject
+{
+Q_OBJECT
+
+public:
+ static WSEventsPtr Current();
+ static void ResetCurrent(WSServerPtr srv);
+
explicit WSEvents(WSServerPtr srv);
~WSEvents();
static void FrontendEventHandler(
enum obs_frontend_event event, void* privateData);
- static WSEvents* Instance;
void connectSceneSignals(obs_source_t* scene);
void hookTransitionBeginEvent();
@@ -44,13 +54,15 @@ class WSEvents : public QObject {
bool HeartbeatIsActive;
- private slots:
+private slots:
void deferredInitOperations();
void StreamStatus();
void Heartbeat();
void TransitionDurationChanged(int ms);
- private:
+private:
+ static WSEventsPtr _instance;
+
WSServerPtr _srv;
OBSSource currentScene;
diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp
index c88abb35..10dd999b 100644
--- a/src/WSRequestHandler_General.cpp
+++ b/src/WSRequestHandler_General.cpp
@@ -121,12 +121,12 @@ void WSRequestHandler::HandleAuthenticate(WSRequestHandler* req) {
return;
}
- WSEvents::Instance->HeartbeatIsActive =
- obs_data_get_bool(req->data, "enable");
+ auto events = WSEvents::Current();
+
+ events->HeartbeatIsActive = obs_data_get_bool(req->data, "enable");
OBSDataAutoRelease response = obs_data_create();
- obs_data_set_bool(response, "enable",
- WSEvents::Instance->HeartbeatIsActive);
+ obs_data_set_bool(response, "enable", events->HeartbeatIsActive);
req->SendOKResponse(response);
}
diff --git a/src/WSRequestHandler_Streaming.cpp b/src/WSRequestHandler_Streaming.cpp
index cca33cee..fc3d660d 100644
--- a/src/WSRequestHandler_Streaming.cpp
+++ b/src/WSRequestHandler_Streaming.cpp
@@ -21,6 +21,8 @@
* @since 0.3
*/
void WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler* req) {
+ auto events = WSEvents::Current();
+
OBSDataAutoRelease data = obs_data_create();
obs_data_set_bool(data, "streaming", obs_frontend_streaming_active());
obs_data_set_bool(data, "recording", obs_frontend_recording_active());
@@ -28,13 +30,13 @@
const char* tc = nullptr;
if (obs_frontend_streaming_active()) {
- tc = WSEvents::Instance->GetStreamingTimecode();
+ tc = events->GetStreamingTimecode();
obs_data_set_string(data, "stream-timecode", tc);
bfree((void*)tc);
}
if (obs_frontend_recording_active()) {
- tc = WSEvents::Instance->GetRecordingTimecode();
+ tc = events->GetRecordingTimecode();
obs_data_set_string(data, "rec-timecode", tc);
bfree((void*)tc);
}
diff --git a/src/obs-websocket.cpp b/src/obs-websocket.cpp
index e04f0809..9939f8da 100644
--- a/src/obs-websocket.cpp
+++ b/src/obs-websocket.cpp
@@ -48,7 +48,7 @@ bool obs_module_load(void) {
auto config = Config::Current();
config->Load();
- WSEvents::Instance = new WSEvents(WSServer::Current());
+ WSEvents::ResetCurrent(WSServer::Current());
if (config->ServerEnabled) {
WSServer::Current()->start(config->ServerPort);