From 40763fc15d1718a26208dee26df059b8d73ef939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 18 Apr 2019 14:04:47 +0200 Subject: [PATCH] events: new types SourceCreated and SourceDestroyed --- src/WSEvents.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ src/WSEvents.h | 1 + 2 files changed, 63 insertions(+) diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 7630f5c8..1675fa5b 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -56,6 +56,21 @@ const char* nsToTimestamp(uint64_t ns) { return ts; } +const char* sourceTypeToString(obs_source_type type) { + switch (type) { + case OBS_SOURCE_TYPE_INPUT: + return "input"; + case OBS_SOURCE_TYPE_SCENE: + return "scene"; + case OBS_SOURCE_TYPE_TRANSITION: + return "transition"; + case OBS_SOURCE_TYPE_FILTER: + return "filter"; + default: + return "unknown"; + } +} + template T* calldata_get_pointer(const calldata_t* data, const char* name) { void* ptr = nullptr; calldata_get_ptr(data, name, &ptr); @@ -732,6 +747,18 @@ void WSEvents::OnTransitionBegin(void* param, calldata_t* data) { instance->broadcastUpdate("TransitionBegin", fields); } +/** + * A source has been created. A source can be an input, a scene or a transition. + * + * @return {String} `sourceName` Source name + * @return {String} `sourceType` Source type. Can be "input", "scene", "transition" or "filter". + * @return {Object} `sourceSettings` Source settings + * + * @api events + * @name SourceCreated + * @category sources + * @since 4.6.0 + */ void WSEvents::OnSourceCreate(void* param, calldata_t* data) { auto self = reinterpret_cast(param); @@ -754,6 +781,41 @@ void WSEvents::OnSourceCreate(void* param, calldata_t* data) { if (sourceType == OBS_SOURCE_TYPE_TRANSITION) { signal_handler_connect(sh, "transition_start", OnTransitionBegin, self); } + + OBSDataAutoRelease sourceSettings = obs_source_get_settings(source); + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + obs_data_set_string(fields, "sourceType", sourceTypeToString(sourceType)); + obs_data_set_obj(fields, "sourceSettings", sourceSettings); + self->broadcastUpdate("SourceCreated", fields); +} + +/** + * A source has been destroyed/removed. A source can be an input, a scene or a transition. + * + * @return {String} `sourceName` Source name + * @return {String} `sourceType` Source type. Can be "input", "scene", "transition" or "filter". + * + * @api events + * @name SourceDestroyed + * @category sources + * @since 4.6.0 + */ +void WSEvents::OnSourceDestroy(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + obs_source_t* source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + obs_source_type sourceType = obs_source_get_type(source); + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + obs_data_set_string(fields, "sourceType", sourceTypeToString(sourceType)); + self->broadcastUpdate("SourceDestroyed", fields); } /** diff --git a/src/WSEvents.h b/src/WSEvents.h index 6f0b2ec1..f2ef01d7 100644 --- a/src/WSEvents.h +++ b/src/WSEvents.h @@ -109,6 +109,7 @@ private: static void OnTransitionBegin(void* param, calldata_t* data); static void OnSourceCreate(void* param, calldata_t* data); + static void OnSourceDestroy(void* param, calldata_t* data); static void OnSceneReordered(void* param, calldata_t* data); static void OnSceneItemAdd(void* param, calldata_t* data);