EventHandler: Add some events

This commit is contained in:
tt2468 2021-05-13 19:11:19 -07:00
parent 9a1b6dcd3a
commit ab12d5f39f
6 changed files with 212 additions and 23 deletions

View File

@ -75,6 +75,9 @@ set(obs-websocket_SOURCES
src/WebSocketProtocol.cpp src/WebSocketProtocol.cpp
src/WebSocketSession.cpp src/WebSocketSession.cpp
src/eventhandler/EventHandler.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.cpp
src/requesthandler/RequestHandler_General.cpp src/requesthandler/RequestHandler_General.cpp
src/requesthandler/rpc/Request.cpp src/requesthandler/rpc/Request.cpp

View File

@ -2,6 +2,13 @@
#include "../plugin-macros.generated.h" #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) : EventHandler::EventHandler(WebSocketServerPtr webSocketServer) :
_webSocketServer(webSocketServer) _webSocketServer(webSocketServer)
{ {
@ -13,8 +20,8 @@ EventHandler::EventHandler(WebSocketServerPtr webSocketServer) :
signal_handler_t* coreSignalHandler = obs_get_signal_handler(); signal_handler_t* coreSignalHandler = obs_get_signal_handler();
if (coreSignalHandler) { if (coreSignalHandler) {
//signal_handler_connect(coreSignalHandler, "source_create", OnSourceCreate, this); signal_handler_connect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
//signal_handler_connect(coreSignalHandler, "source_destroy", OnSourceDestroy, this); signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
} }
obs_enum_sources([](void* param, obs_source_t* source) { obs_enum_sources([](void* param, obs_source_t* source) {
@ -36,8 +43,8 @@ EventHandler::~EventHandler()
signal_handler_t* coreSignalHandler = obs_get_signal_handler(); signal_handler_t* coreSignalHandler = obs_get_signal_handler();
if (coreSignalHandler) { if (coreSignalHandler) {
//signal_handler_disconnect(coreSignalHandler, "source_destroy", OnSourceDestroy, this); signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceCreatedMultiHandler, this);
//signal_handler_disconnect(coreSignalHandler, "source_create", OnSourceCreate, this); signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
} }
obs_enum_sources([](void* param, obs_source_t* source) { obs_enum_sources([](void* param, obs_source_t* source) {
@ -49,13 +56,6 @@ EventHandler::~EventHandler()
blog(LOG_INFO, "[EventHandler::~EventHandler] Finished."); 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) void EventHandler::ConnectSourceSignals(obs_source_t *source)
{ {
if (!source || obs_source_removed(source)) if (!source || obs_source_removed(source))
@ -64,6 +64,8 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source)
DisconnectSourceSignals(source); DisconnectSourceSignals(source);
signal_handler_t* sh = obs_source_get_signal_handler(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) void EventHandler::DisconnectSourceSignals(obs_source_t *source)
@ -72,6 +74,8 @@ void EventHandler::DisconnectSourceSignals(obs_source_t *source)
return; return;
signal_handler_t* sh = obs_source_get_signal_handler(source); 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) { 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) { switch (event) {
// General // General
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
break;
case OBS_FRONTEND_EVENT_EXIT: case OBS_FRONTEND_EVENT_EXIT:
eventHandler->HandleExitStarted();
break; break;
case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED: case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED:
eventHandler->HandleStudioModeStateChanged(true);
break; break;
case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED: case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED:
eventHandler->HandleStudioModeStateChanged(false);
break; break;
// Config // Config
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED:
eventHandler->HandleCurrentSceneCollectionChanged();
break; break;
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED: case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED:
eventHandler->HandleSceneCollectionListChanged();
break; break;
case OBS_FRONTEND_EVENT_PROFILE_CHANGED: case OBS_FRONTEND_EVENT_PROFILE_CHANGED:
eventHandler->HandleCurrentProfileChanged();
break; break;
case OBS_FRONTEND_EVENT_PROFILE_LIST_CHANGED: case OBS_FRONTEND_EVENT_PROFILE_LIST_CHANGED:
eventHandler->HandleProfileListChanged();
break; break;
// Scenes // Scenes
case OBS_FRONTEND_EVENT_SCENE_CHANGED: case OBS_FRONTEND_EVENT_SCENE_CHANGED:
break; eventHandler->HandleCurrentSceneChanged();
case OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED:
break; break;
case OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED: case OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED:
eventHandler->HandleCurrentPreviewSceneChanged();
break;
case OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED:
eventHandler->HandleSceneListReindexed();
break; break;
// Transitions // Transitions
@ -148,3 +160,80 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
break; break;
} }
} }
void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data)
{
auto eventHandler = reinterpret_cast<EventHandler*>(data);
OBSSource source = GetCalldataPointer<obs_source_t>(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<EventHandler*>(data);
OBSSource source = GetCalldataPointer<obs_source_t>(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<EventHandler*>(data);
OBSSource source = GetCalldataPointer<obs_source_t>(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;
}
}

View File

@ -8,20 +8,20 @@
#include "../WebSocketServer.h" #include "../WebSocketServer.h"
#include "types/EventSubscriptions.h" #include "types/EventSubscriptions.h"
template <typename T> T* GetCalldataPointer(const calldata_t *data, const char* name) {
void* ptr = nullptr;
calldata_get_ptr(data, name, &ptr);
return reinterpret_cast<T*>(ptr);
}
std::string GetCalldataString(const calldata_t *data, const char* name);
class EventHandler class EventHandler
{ {
public: public:
EventHandler(WebSocketServerPtr webSocketServer); EventHandler(WebSocketServerPtr webSocketServer);
~EventHandler(); ~EventHandler();
template <typename T> T* GetCalldataPointer(const calldata_t *data, const char* name) {
void* ptr = nullptr;
calldata_get_ptr(data, name, &ptr);
return reinterpret_cast<T*>(ptr);
}
static std::string GetCalldataString(const calldata_t *data, const char* name);
private: private:
WebSocketServerPtr _webSocketServer; WebSocketServerPtr _webSocketServer;
os_cpu_usage_info_t *_cpuUsageInfo; os_cpu_usage_info_t *_cpuUsageInfo;
@ -29,5 +29,31 @@ class EventHandler
void ConnectSourceSignals(obs_source_t *source); void ConnectSourceSignals(obs_source_t *source);
void DisconnectSourceSignals(obs_source_t *source); void DisconnectSourceSignals(obs_source_t *source);
// Signal handler: frontend
static void OnFrontendEvent(enum obs_frontend_event event, void *private_data); 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();
}; };

View File

@ -0,0 +1,23 @@
#include "EventHandler.h"
#include "../plugin-macros.generated.h"
void EventHandler::HandleCurrentSceneCollectionChanged()
{
;
}
void EventHandler::HandleSceneCollectionListChanged()
{
;
}
void EventHandler::HandleCurrentProfileChanged()
{
;
}
void EventHandler::HandleProfileListChanged()
{
;
}

View File

@ -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);
}

View File

@ -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()
{
;
}