From ab12d5f39fcec11c61b0a1a7c2c6bfc2159aeddc Mon Sep 17 00:00:00 2001 From: tt2468 Date: Thu, 13 May 2021 19:11:19 -0700 Subject: [PATCH] EventHandler: Add some events --- CMakeLists.txt | 3 + src/eventhandler/EventHandler.cpp | 119 +++++++++++++++++++--- src/eventhandler/EventHandler.h | 42 ++++++-- src/eventhandler/EventHandler_Config.cpp | 23 +++++ src/eventhandler/EventHandler_General.cpp | 15 +++ src/eventhandler/EventHandler_Scenes.cpp | 33 ++++++ 6 files changed, 212 insertions(+), 23 deletions(-) create mode 100644 src/eventhandler/EventHandler_Config.cpp create mode 100644 src/eventhandler/EventHandler_General.cpp create mode 100644 src/eventhandler/EventHandler_Scenes.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7725f139..beb54327 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,6 +75,9 @@ set(obs-websocket_SOURCES src/WebSocketProtocol.cpp src/WebSocketSession.cpp src/eventhandler/EventHandler.cpp + src/eventhandler/EventHandler_General.cpp + src/eventhandler/EventHandler_Config.cpp + src/eventhandler/EventHandler_Scenes.cpp src/requesthandler/RequestHandler.cpp src/requesthandler/RequestHandler_General.cpp src/requesthandler/rpc/Request.cpp diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index 7bb86aa3..59ba98bc 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -2,6 +2,13 @@ #include "../plugin-macros.generated.h" +std::string GetCalldataString(const calldata_t *data, const char* name) +{ + const char* value = nullptr; + calldata_get_string(data, name, &value); + return value; +} + EventHandler::EventHandler(WebSocketServerPtr webSocketServer) : _webSocketServer(webSocketServer) { @@ -13,8 +20,8 @@ EventHandler::EventHandler(WebSocketServerPtr webSocketServer) : signal_handler_t* coreSignalHandler = obs_get_signal_handler(); if (coreSignalHandler) { - //signal_handler_connect(coreSignalHandler, "source_create", OnSourceCreate, this); - //signal_handler_connect(coreSignalHandler, "source_destroy", OnSourceDestroy, this); + signal_handler_connect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this); + signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this); } obs_enum_sources([](void* param, obs_source_t* source) { @@ -36,8 +43,8 @@ EventHandler::~EventHandler() signal_handler_t* coreSignalHandler = obs_get_signal_handler(); if (coreSignalHandler) { - //signal_handler_disconnect(coreSignalHandler, "source_destroy", OnSourceDestroy, this); - //signal_handler_disconnect(coreSignalHandler, "source_create", OnSourceCreate, this); + signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceCreatedMultiHandler, this); + signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this); } obs_enum_sources([](void* param, obs_source_t* source) { @@ -49,13 +56,6 @@ EventHandler::~EventHandler() blog(LOG_INFO, "[EventHandler::~EventHandler] Finished."); } -std::string EventHandler::GetCalldataString(const calldata_t *data, const char* name) -{ - const char* value = nullptr; - calldata_get_string(data, name, &value); - return value; -} - void EventHandler::ConnectSourceSignals(obs_source_t *source) { if (!source || obs_source_removed(source)) @@ -64,6 +64,8 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source) DisconnectSourceSignals(source); signal_handler_t* sh = obs_source_get_signal_handler(source); + + signal_handler_connect(sh, "rename", SourceRenamedMultiHandler, this); } void EventHandler::DisconnectSourceSignals(obs_source_t *source) @@ -72,6 +74,8 @@ void EventHandler::DisconnectSourceSignals(obs_source_t *source) return; signal_handler_t* sh = obs_source_get_signal_handler(source); + + signal_handler_disconnect(sh, "rename", SourceRenamedMultiHandler, this); } void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_data) { @@ -79,31 +83,39 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ switch (event) { // General - case OBS_FRONTEND_EVENT_FINISHED_LOADING: - break; case OBS_FRONTEND_EVENT_EXIT: + eventHandler->HandleExitStarted(); break; case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED: + eventHandler->HandleStudioModeStateChanged(true); break; case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED: + eventHandler->HandleStudioModeStateChanged(false); break; // Config case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: + eventHandler->HandleCurrentSceneCollectionChanged(); break; case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED: + eventHandler->HandleSceneCollectionListChanged(); break; case OBS_FRONTEND_EVENT_PROFILE_CHANGED: + eventHandler->HandleCurrentProfileChanged(); break; case OBS_FRONTEND_EVENT_PROFILE_LIST_CHANGED: + eventHandler->HandleProfileListChanged(); break; // Scenes case OBS_FRONTEND_EVENT_SCENE_CHANGED: - break; - case OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED: + eventHandler->HandleCurrentSceneChanged(); break; case OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED: + eventHandler->HandleCurrentPreviewSceneChanged(); + break; + case OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED: + eventHandler->HandleSceneListReindexed(); break; // Transitions @@ -148,3 +160,80 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ break; } } + +void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(data); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + obs_source_type sourceType = obs_source_get_type(source); + switch (sourceType) { + case OBS_SOURCE_TYPE_INPUT: + eventHandler->HandleSceneCreated(source); + break; + case OBS_SOURCE_TYPE_FILTER: + break; + case OBS_SOURCE_TYPE_TRANSITION: + break; + case OBS_SOURCE_TYPE_SCENE: + break; + default: + break; + } +} + +void EventHandler::SourceRemovedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(data); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + obs_source_type sourceType = obs_source_get_type(source); + switch (sourceType) { + case OBS_SOURCE_TYPE_INPUT: + eventHandler->HandleSceneRemoved(source); + break; + case OBS_SOURCE_TYPE_FILTER: + break; + case OBS_SOURCE_TYPE_TRANSITION: + break; + case OBS_SOURCE_TYPE_SCENE: + break; + default: + break; + } +} + +void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(data); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + std::string oldSourceName = GetCalldataString(data, "old_name"); + std::string sourceName = GetCalldataString(data, "new_name"); + if (oldSourceName.empty() || sourceName.empty()) + return; + + obs_source_type sourceType = obs_source_get_type(source); + switch (sourceType) { + case OBS_SOURCE_TYPE_INPUT: + eventHandler->HandleSceneNameChanged(source, oldSourceName, sourceName); + break; + case OBS_SOURCE_TYPE_FILTER: + break; + case OBS_SOURCE_TYPE_TRANSITION: + break; + case OBS_SOURCE_TYPE_SCENE: + break; + default: + break; + } +} diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index d46dc123..34ca1a4c 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -8,20 +8,20 @@ #include "../WebSocketServer.h" #include "types/EventSubscriptions.h" +template T* GetCalldataPointer(const calldata_t *data, const char* name) { + void* ptr = nullptr; + calldata_get_ptr(data, name, &ptr); + return reinterpret_cast(ptr); +} + +std::string GetCalldataString(const calldata_t *data, const char* name); + class EventHandler { public: EventHandler(WebSocketServerPtr webSocketServer); ~EventHandler(); - template T* GetCalldataPointer(const calldata_t *data, const char* name) { - void* ptr = nullptr; - calldata_get_ptr(data, name, &ptr); - return reinterpret_cast(ptr); - } - - static std::string GetCalldataString(const calldata_t *data, const char* name); - private: WebSocketServerPtr _webSocketServer; os_cpu_usage_info_t *_cpuUsageInfo; @@ -29,5 +29,31 @@ class EventHandler void ConnectSourceSignals(obs_source_t *source); void DisconnectSourceSignals(obs_source_t *source); + // Signal handler: frontend static void OnFrontendEvent(enum obs_frontend_event event, void *private_data); + + // Signal handler: libobs + static void SourceCreatedMultiHandler(void *param, calldata_t *data); + static void SourceRemovedMultiHandler(void *param, calldata_t *data); + + // Signal handler: source + static void SourceRenamedMultiHandler(void *param, calldata_t *data); + + // General + void HandleExitStarted(); + void HandleStudioModeStateChanged(bool enabled); + + // Config + void HandleCurrentSceneCollectionChanged(); + void HandleSceneCollectionListChanged(); + void HandleCurrentProfileChanged(); + void HandleProfileListChanged(); + + // Scenes + void HandleSceneCreated(obs_source_t *source); + void HandleSceneRemoved(obs_source_t *source); + void HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName); + void HandleCurrentSceneChanged(); + void HandleCurrentPreviewSceneChanged(); + void HandleSceneListReindexed(); }; diff --git a/src/eventhandler/EventHandler_Config.cpp b/src/eventhandler/EventHandler_Config.cpp new file mode 100644 index 00000000..93b7df4b --- /dev/null +++ b/src/eventhandler/EventHandler_Config.cpp @@ -0,0 +1,23 @@ +#include "EventHandler.h" + +#include "../plugin-macros.generated.h" + +void EventHandler::HandleCurrentSceneCollectionChanged() +{ + ; +} + +void EventHandler::HandleSceneCollectionListChanged() +{ + ; +} + +void EventHandler::HandleCurrentProfileChanged() +{ + ; +} + +void EventHandler::HandleProfileListChanged() +{ + ; +} diff --git a/src/eventhandler/EventHandler_General.cpp b/src/eventhandler/EventHandler_General.cpp new file mode 100644 index 00000000..4599456e --- /dev/null +++ b/src/eventhandler/EventHandler_General.cpp @@ -0,0 +1,15 @@ +#include "EventHandler.h" + +#include "../plugin-macros.generated.h" + +void EventHandler::HandleExitStarted() +{ + _webSocketServer->BroadcastEvent(EventSubscriptions::General, "ExitStarted"); +} + +void EventHandler::HandleStudioModeStateChanged(bool enabled) +{ + json eventData; + eventData["studioModeEnabled"] = enabled; + _webSocketServer->BroadcastEvent(EventSubscriptions::General, "StudioModeStateChanged", eventData); +} diff --git a/src/eventhandler/EventHandler_Scenes.cpp b/src/eventhandler/EventHandler_Scenes.cpp new file mode 100644 index 00000000..bddb29df --- /dev/null +++ b/src/eventhandler/EventHandler_Scenes.cpp @@ -0,0 +1,33 @@ +#include "EventHandler.h" + +#include "../plugin-macros.generated.h" + +void EventHandler::HandleSceneCreated(obs_source_t *source) +{ + ; +} + +void EventHandler::HandleSceneRemoved(obs_source_t *source) +{ + ; +} + +void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName) +{ + ; +} + +void EventHandler::HandleCurrentSceneChanged() +{ + ; +} + +void EventHandler::HandleCurrentPreviewSceneChanged() +{ + ; +} + +void EventHandler::HandleSceneListReindexed() +{ + ; +}