From 81b307e5ad6d7a020c233445e5310d453dbbc481 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Tue, 16 Jan 2024 00:39:26 -0800 Subject: [PATCH] eventhandler: Add `InputSettingsChanged` Fired when an input's settings change, like via the properties dialog or via `SetInputSettings`. Closes #1157 --- src/eventhandler/EventHandler.cpp | 19 +++++++++++++++++ src/eventhandler/EventHandler.h | 8 +++++--- src/eventhandler/EventHandler_Inputs.cpp | 26 ++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index 425930444..0823076ff 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -31,6 +31,7 @@ EventHandler::EventHandler() signal_handler_connect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this); signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this); signal_handler_connect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this); + signal_handler_connect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this); } else { blog(LOG_ERROR, "[EventHandler::EventHandler] Unable to get libobs signal handler!"); } @@ -50,6 +51,7 @@ EventHandler::~EventHandler() signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this); signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this); signal_handler_disconnect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this); + signal_handler_disconnect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this); } else { blog(LOG_ERROR, "[EventHandler::~EventHandler] Unable to get libobs signal handler!"); } @@ -588,6 +590,23 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data) } } +void EventHandler::SourceUpdatedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = static_cast(param); + + obs_source_t *source = GetCalldataPointer(data, "source"); + if (!source) + return; + + switch (obs_source_get_type(source)) { + case OBS_SOURCE_TYPE_INPUT: + eventHandler->HandleInputSettingsChanged(source); + break; + default: + break; + } +} + void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *) { auto eventHandler = static_cast(param); diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index 071f80715..2352d43a9 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -69,9 +69,10 @@ class EventHandler { static void SourceCreatedMultiHandler(void *param, calldata_t *data); static void SourceDestroyedMultiHandler(void *param, calldata_t *data); static void SourceRemovedMultiHandler(void *param, calldata_t *data); - - // Signal handler: source static void SourceRenamedMultiHandler(void *param, calldata_t *data); + static void SourceUpdatedMultiHandler(void *param, calldata_t *data); + + // Signal handler: media sources static void SourceMediaPauseMultiHandler(void *param, calldata_t *data); static void SourceMediaPlayMultiHandler(void *param, calldata_t *data); static void SourceMediaRestartMultiHandler(void *param, calldata_t *data); @@ -106,7 +107,7 @@ class EventHandler { void HandleInputCreated(obs_source_t *source); void HandleInputRemoved(obs_source_t *source); void HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName); - void HandleInputVolumeMeters(std::vector inputs); // AudioMeter::Handler callback + void HandleInputSettingsChanged(obs_source_t *source); static void HandleInputActiveStateChanged(void *param, calldata_t *data); // Direct callback static void HandleInputShowStateChanged(void *param, @@ -123,6 +124,7 @@ class EventHandler { calldata_t *data); // Direct callback static void HandleInputAudioMonitorTypeChanged(void *param, calldata_t *data); // Direct callback + void HandleInputVolumeMeters(std::vector inputs); // AudioMeter::Handler callback // Transitions void HandleCurrentSceneTransitionChanged(); diff --git a/src/eventhandler/EventHandler_Inputs.cpp b/src/eventhandler/EventHandler_Inputs.cpp index 07fc1858a..fde33e60f 100644 --- a/src/eventhandler/EventHandler_Inputs.cpp +++ b/src/eventhandler/EventHandler_Inputs.cpp @@ -93,6 +93,32 @@ void EventHandler::HandleInputNameChanged(obs_source_t *, std::string oldInputNa BroadcastEvent(EventSubscription::Inputs, "InputNameChanged", eventData); } +/** + * An input's settings have changed (been updated). + * + * Note: On some inputs, changing values in the properties dialog will cause an immediate update. Pressing the "Cancel" button will revert the settings, resulting in another event being fired. + * + * @dataField inputName | String | Name of the input + * @dataField inputSettings | Object | New settings object of the input + * + * @eventType InputSettingsChanged + * @eventSubscription Inputs + * @complexity 3 + * @rpcVersion -1 + * @initialVersion 5.4.0 + * @api events + * @category inputs + */ +void EventHandler::HandleInputSettingsChanged(obs_source_t *source) +{ + OBSDataAutoRelease inputSettings = obs_source_get_settings(source); + + json eventData; + eventData["inputName"] = obs_source_get_name(source); + eventData["inputSettings"] = Utils::Json::ObsDataToJson(inputSettings); + BroadcastEvent(EventSubscription::Inputs, "InputSettingsChanged", eventData); +} + /** * An input's active state has changed. *