diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index 07638dc0..a4359568 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -115,6 +115,7 @@ void EventHandler::BroadcastEvent(uint64_t requiredIntent, std::string eventType _broadcastCallback(requiredIntent, eventType, eventData, rpcVersion); } +// Connect source signals for Inputs, Scenes, and Transitions. Filters are automatically connected. void EventHandler::ConnectSourceSignals(obs_source_t *source) // Applies to inputs and scenes { if (!source || obs_source_removed(source)) @@ -128,21 +129,17 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source) // Applies to inpu obs_source_type sourceType = obs_source_get_type(source); // Inputs - signal_handler_connect(sh, "activate", HandleInputActiveStateChanged, this); - signal_handler_connect(sh, "deactivate", HandleInputActiveStateChanged, this); - signal_handler_connect(sh, "show", HandleInputShowStateChanged, this); - signal_handler_connect(sh, "hide", HandleInputShowStateChanged, this); - signal_handler_connect(sh, "mute", HandleInputMuteStateChanged, this); - signal_handler_connect(sh, "volume", HandleInputVolumeChanged, this); - signal_handler_connect(sh, "audio_balance", HandleInputAudioBalanceChanged, this); - signal_handler_connect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); - signal_handler_connect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); - signal_handler_connect(sh, "audio_monitoring", HandleInputAudioMonitorTypeChanged, this); - signal_handler_connect(sh, "filter_add", HandleSourceFilterCreated, this); - signal_handler_connect(sh, "filter_remove", HandleSourceFilterRemoved, this); - signal_handler_connect(sh, "reorder_filters", HandleSourceFilterListReindexed, this); - if (sourceType == OBS_SOURCE_TYPE_INPUT) { + signal_handler_connect(sh, "activate", HandleInputActiveStateChanged, this); + signal_handler_connect(sh, "deactivate", HandleInputActiveStateChanged, this); + signal_handler_connect(sh, "show", HandleInputShowStateChanged, this); + signal_handler_connect(sh, "hide", HandleInputShowStateChanged, this); + signal_handler_connect(sh, "mute", HandleInputMuteStateChanged, this); + signal_handler_connect(sh, "volume", HandleInputVolumeChanged, this); + signal_handler_connect(sh, "audio_balance", HandleInputAudioBalanceChanged, this); + signal_handler_connect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); + signal_handler_connect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); + signal_handler_connect(sh, "audio_monitoring", HandleInputAudioMonitorTypeChanged, this); signal_handler_connect(sh, "media_started", HandleMediaInputPlaybackStarted, this); signal_handler_connect(sh, "media_ended", HandleMediaInputPlaybackEnded, this); signal_handler_connect(sh, "media_pause", SourceMediaPauseMultiHandler, this); @@ -163,8 +160,32 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source) // Applies to inpu signal_handler_connect(sh, "item_select", HandleSceneItemSelected, this); signal_handler_connect(sh, "item_transform", HandleSceneItemTransformChanged, this); } + + // Scenes and Inputs + if (sourceType == OBS_SOURCE_TYPE_INPUT || sourceType == OBS_SOURCE_TYPE_SCENE) { + signal_handler_connect(sh, "reorder_filters", HandleSourceFilterListReindexed, this); + signal_handler_connect(sh, "filter_add", FilterAddMultiHandler, this); + signal_handler_connect(sh, "filter_remove", FilterRemoveMultiHandler, this); + auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ + auto eventHandler = static_cast(param); + eventHandler->ConnectSourceSignals(filter); + }; + obs_source_enum_filters(source, enumFilters, this); + } + + // Transitions + if (sourceType == OBS_SOURCE_TYPE_TRANSITION) { + signal_handler_connect(sh, "transition_start", HandleSceneTransitionStarted, this); + } + + // Filters + if (sourceType == OBS_SOURCE_TYPE_FILTER) { + signal_handler_connect(sh, "enable", HandleSourceFilterEnableStateChanged, this); + signal_handler_connect(sh, "rename", HandleSourceFilterNameChanged, this); + } } +// Disconnect source signals for Inputs, Scenes, and Transitions. Filters are automatically disconnected. void EventHandler::DisconnectSourceSignals(obs_source_t *source) { if (!source) @@ -172,70 +193,77 @@ void EventHandler::DisconnectSourceSignals(obs_source_t *source) signal_handler_t* sh = obs_source_get_signal_handler(source); + obs_source_type sourceType = obs_source_get_type(source); + // Inputs - signal_handler_disconnect(sh, "activate", HandleInputActiveStateChanged, this); - signal_handler_disconnect(sh, "deactivate", HandleInputActiveStateChanged, this); - signal_handler_disconnect(sh, "show", HandleInputShowStateChanged, this); - signal_handler_disconnect(sh, "hide", HandleInputShowStateChanged, this); - signal_handler_disconnect(sh, "mute", HandleInputMuteStateChanged, this); - signal_handler_disconnect(sh, "volume", HandleInputVolumeChanged, this); - signal_handler_disconnect(sh, "audio_balance", HandleInputAudioBalanceChanged, this); - signal_handler_disconnect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); - signal_handler_disconnect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); - signal_handler_disconnect(sh, "audio_monitoring", HandleInputAudioMonitorTypeChanged, this); - signal_handler_disconnect(sh, "media_started", HandleMediaInputPlaybackStarted, this); - signal_handler_disconnect(sh, "media_ended", HandleMediaInputPlaybackEnded, this); - signal_handler_disconnect(sh, "media_pause", SourceMediaPauseMultiHandler, this); - signal_handler_disconnect(sh, "media_play", SourceMediaPlayMultiHandler, this); - signal_handler_disconnect(sh, "media_restart", SourceMediaRestartMultiHandler, this); - signal_handler_disconnect(sh, "media_stopped", SourceMediaStopMultiHandler, this); - signal_handler_disconnect(sh, "media_next", SourceMediaNextMultiHandler, this); - signal_handler_disconnect(sh, "media_previous", SourceMediaPreviousMultiHandler, this); - signal_handler_disconnect(sh, "filter_add", HandleSourceFilterCreated, this); - signal_handler_disconnect(sh, "filter_remove", HandleSourceFilterRemoved, this); - signal_handler_disconnect(sh, "reorder_filters", HandleSourceFilterListReindexed, this); + if (sourceType == OBS_SOURCE_TYPE_INPUT) { + signal_handler_disconnect(sh, "activate", HandleInputActiveStateChanged, this); + signal_handler_disconnect(sh, "deactivate", HandleInputActiveStateChanged, this); + signal_handler_disconnect(sh, "show", HandleInputShowStateChanged, this); + signal_handler_disconnect(sh, "hide", HandleInputShowStateChanged, this); + signal_handler_disconnect(sh, "mute", HandleInputMuteStateChanged, this); + signal_handler_disconnect(sh, "volume", HandleInputVolumeChanged, this); + signal_handler_disconnect(sh, "audio_balance", HandleInputAudioBalanceChanged, this); + signal_handler_disconnect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); + signal_handler_disconnect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); + signal_handler_disconnect(sh, "audio_monitoring", HandleInputAudioMonitorTypeChanged, this); + signal_handler_disconnect(sh, "media_started", HandleMediaInputPlaybackStarted, this); + signal_handler_disconnect(sh, "media_ended", HandleMediaInputPlaybackEnded, this); + signal_handler_disconnect(sh, "media_pause", SourceMediaPauseMultiHandler, this); + signal_handler_disconnect(sh, "media_play", SourceMediaPlayMultiHandler, this); + signal_handler_disconnect(sh, "media_restart", SourceMediaRestartMultiHandler, this); + signal_handler_disconnect(sh, "media_stopped", SourceMediaStopMultiHandler, this); + signal_handler_disconnect(sh, "media_next", SourceMediaNextMultiHandler, this); + signal_handler_disconnect(sh, "media_previous", SourceMediaPreviousMultiHandler, this); + } // Scenes - signal_handler_disconnect(sh, "item_add", HandleSceneItemCreated, this); - signal_handler_disconnect(sh, "item_remove", HandleSceneItemRemoved, this); - signal_handler_disconnect(sh, "reorder", HandleSceneItemListReindexed, this); - signal_handler_disconnect(sh, "item_visible", HandleSceneItemEnableStateChanged, this); - signal_handler_disconnect(sh, "item_locked", HandleSceneItemLockStateChanged, this); - signal_handler_disconnect(sh, "item_select", HandleSceneItemSelected, this); - signal_handler_disconnect(sh, "item_transform", HandleSceneItemTransformChanged, this); -} + if (sourceType == OBS_SOURCE_TYPE_SCENE) { + signal_handler_disconnect(sh, "item_add", HandleSceneItemCreated, this); + signal_handler_disconnect(sh, "item_remove", HandleSceneItemRemoved, this); + signal_handler_disconnect(sh, "reorder", HandleSceneItemListReindexed, this); + signal_handler_disconnect(sh, "item_visible", HandleSceneItemEnableStateChanged, this); + signal_handler_disconnect(sh, "item_locked", HandleSceneItemLockStateChanged, this); + signal_handler_disconnect(sh, "item_select", HandleSceneItemSelected, this); + signal_handler_disconnect(sh, "item_transform", HandleSceneItemTransformChanged, this); + } -void EventHandler::ConnectFilterSignals(obs_source_t *filter) -{ - if (!filter || obs_source_removed(filter)) - return; + // Inputs and Scenes + if (sourceType == OBS_SOURCE_TYPE_INPUT || sourceType == OBS_SOURCE_TYPE_SCENE) { + signal_handler_disconnect(sh, "reorder_filters", HandleSourceFilterListReindexed, this); + signal_handler_disconnect(sh, "filter_add", FilterAddMultiHandler, this); + signal_handler_disconnect(sh, "filter_remove", FilterRemoveMultiHandler, this); + auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ + auto eventHandler = static_cast(param); + eventHandler->DisconnectSourceSignals(filter); + }; + obs_source_enum_filters(source, enumFilters, this); + } - DisconnectFilterSignals(filter); + // Transitions + if (sourceType == OBS_SOURCE_TYPE_TRANSITION) { + signal_handler_disconnect(sh, "transition_start", HandleSceneTransitionStarted, this); + } - signal_handler_t* sh = obs_source_get_signal_handler(filter); - - signal_handler_connect(sh, "enable", HandleSourceFilterEnableStateChanged, this); - signal_handler_connect(sh, "rename", HandleSourceFilterNameChanged, this); -} - -void EventHandler::DisconnectFilterSignals(obs_source_t *filter) -{ - if (!filter) - return; - - signal_handler_t* sh = obs_source_get_signal_handler(filter); - - signal_handler_disconnect(sh, "enable", HandleSourceFilterEnableStateChanged, this); - signal_handler_disconnect(sh, "rename", HandleSourceFilterNameChanged, this); + // Filters + if (sourceType == OBS_SOURCE_TYPE_FILTER) { + signal_handler_disconnect(sh, "enable", HandleSourceFilterEnableStateChanged, this); + signal_handler_disconnect(sh, "rename", HandleSourceFilterNameChanged, this); + } } void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_data) { auto eventHandler = static_cast(private_data); - if (!eventHandler->_obsLoaded.load()) { - if (event == OBS_FRONTEND_EVENT_FINISHED_LOADING) { + if (!eventHandler->_obsLoaded.load() && event != OBS_FRONTEND_EVENT_FINISHED_LOADING) + return; + + switch (event) { + // General + case OBS_FRONTEND_EVENT_FINISHED_LOADING: blog_debug("[EventHandler::OnFrontendEvent] OBS has finished loading. Connecting final handlers and enabling events..."); + // Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging). eventHandler->_obsLoaded.store(true); @@ -245,13 +273,6 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ auto enumInputs = [](void *param, obs_source_t *source) { auto eventHandler = static_cast(param); eventHandler->ConnectSourceSignals(source); - - auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ - auto eventHandler = static_cast(param); - eventHandler->ConnectFilterSignals(filter); - }; - obs_source_enum_filters(source, enumFilters, param); - return true; }; obs_enum_sources(enumInputs, private_data); @@ -262,29 +283,28 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ auto enumScenes = [](void *param, obs_source_t *source) { auto eventHandler = static_cast(param); eventHandler->ConnectSourceSignals(source); - - auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ - auto eventHandler = static_cast(param); - eventHandler->ConnectFilterSignals(filter); - }; - obs_source_enum_filters(source, enumFilters, param); - return true; }; obs_enum_scenes(enumScenes, private_data); } + // Enumerate all scene transitions and connect each one + { + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t* transition = transitions.sources.array[i]; + eventHandler->ConnectSourceSignals(transition); + } + obs_frontend_source_list_free(&transitions); + } + blog_debug("[EventHandler::OnFrontendEvent] Finished."); if (eventHandler->_obsLoadedCallback) eventHandler->_obsLoadedCallback(); - } else { - return; - } - } - switch (event) { - // General + break; case OBS_FRONTEND_EVENT_EXIT: eventHandler->HandleExitStarted(); @@ -298,13 +318,6 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ auto enumInputs = [](void *param, obs_source_t *source) { auto eventHandler = static_cast(param); eventHandler->DisconnectSourceSignals(source); - - auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ - auto eventHandler = static_cast(param); - eventHandler->ConnectFilterSignals(filter); - }; - obs_source_enum_filters(source, enumFilters, param); - return true; }; obs_enum_sources(enumInputs, private_data); @@ -315,18 +328,22 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ auto enumScenes = [](void *param, obs_source_t *source) { auto eventHandler = static_cast(param); eventHandler->DisconnectSourceSignals(source); - - auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){ - auto eventHandler = static_cast(param); - eventHandler->ConnectFilterSignals(filter); - }; - obs_source_enum_filters(source, enumFilters, param); - return true; }; obs_enum_scenes(enumScenes, private_data); } + // Enumerate all scene transitions and disconnect each one + { + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t* transition = transitions.sources.array[i]; + eventHandler->DisconnectSourceSignals(transition); + } + obs_frontend_source_list_free(&transitions); + } + blog_debug("[EventHandler::OnFrontendEvent] Finished."); break; @@ -339,9 +356,27 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ // Config case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGING: + { + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t* transition = transitions.sources.array[i]; + eventHandler->DisconnectSourceSignals(transition); + } + obs_frontend_source_list_free(&transitions); + } eventHandler->HandleCurrentSceneCollectionChanging(); break; case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: + { + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t* transition = transitions.sources.array[i]; + eventHandler->ConnectSourceSignals(transition); + } + obs_frontend_source_list_free(&transitions); + } eventHandler->HandleCurrentSceneCollectionChanged(); break; case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED: @@ -373,6 +408,15 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ eventHandler->HandleCurrentSceneTransitionChanged(); break; case OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED: + { + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t* transition = transitions.sources.array[i]; + eventHandler->ConnectSourceSignals(transition); + } + obs_frontend_source_list_free(&transitions); + } break; case OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED: eventHandler->HandleCurrentSceneTransitionDurationChanged(); diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index 00ac4410..305e525e 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -58,9 +58,6 @@ class EventHandler void ConnectSourceSignals(obs_source_t *source); void DisconnectSourceSignals(obs_source_t *source); - void ConnectFilterSignals(obs_source_t *filter); - void DisconnectFilterSignals(obs_source_t *filter); - void BroadcastEvent(uint64_t requiredIntent, std::string eventType, json eventData = nullptr, uint8_t rpcVersion = 0); // Signal handler: frontend @@ -118,6 +115,16 @@ class EventHandler // Transitions void HandleCurrentSceneTransitionChanged(); void HandleCurrentSceneTransitionDurationChanged(); + static void HandleSceneTransitionStarted(void *param, calldata_t *data); // Direct callback + + // Filters + static void FilterAddMultiHandler(void *param, calldata_t *data); // Direct callback + static void FilterRemoveMultiHandler(void *param, calldata_t *data); // Direct callback + static void HandleSourceFilterListReindexed(void *param, calldata_t *data); // Direct callback + void HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter); + void HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter); + static void HandleSourceFilterNameChanged(void *param, calldata_t *data); // Direct callback + static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback // Outputs void HandleStreamStateChanged(ObsOutputState state); @@ -139,11 +146,4 @@ class EventHandler static void HandleMediaInputPlaybackStarted(void *param, calldata_t *data); // Direct callback static void HandleMediaInputPlaybackEnded(void *param, calldata_t *data); // Direct callback void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action); - - // Filters - static void HandleSourceFilterNameChanged(void *param, calldata_t *data); // Direct callback - static void HandleSourceFilterCreated(void *param, calldata_t *data); // Direct callback - static void HandleSourceFilterRemoved(void *param, calldata_t *data); // Direct callback - static void HandleSourceFilterListReindexed(void *param, calldata_t *data); // Direct callback - static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback }; diff --git a/src/eventhandler/EventHandler_Filters.cpp b/src/eventhandler/EventHandler_Filters.cpp index a66d5035..c4f64309 100644 --- a/src/eventhandler/EventHandler_Filters.cpp +++ b/src/eventhandler/EventHandler_Filters.cpp @@ -19,25 +19,7 @@ with this program. If not, see #include "EventHandler.h" -/** - * A filter has been added to a source. - * - * @dataField sourceName | String | Name of the source the filter was added to - * @dataField filterName | String | Name of the filter - * @dataField filterKind | String | The kind of the filter - * @dataField filterIndex | Number | Index position of the filter - * @dataField filterSettings | Object | The settings configured to the filter when it was created - * @dataField defaultFilterSettings | Object | The default settings for the filter - * - * @eventType SourceFilterCreated - * @eventSubscription Filters - * @complexity 2 - * @rpcVersion -1 - * @initialVersion 5.0.0 - * @api events - * @category filters - */ -void EventHandler::HandleSourceFilterCreated(void *param, calldata_t *data) +void EventHandler::FilterAddMultiHandler(void *param, calldata_t *data) { auto eventHandler = static_cast(param); @@ -47,37 +29,12 @@ void EventHandler::HandleSourceFilterCreated(void *param, calldata_t *data) if (!(source && filter)) return; - eventHandler->ConnectFilterSignals(filter); + eventHandler->ConnectSourceSignals(filter); - std::string filterKind = obs_source_get_id(filter); - OBSDataAutoRelease filterSettings = obs_source_get_settings(filter); - OBSDataAutoRelease defaultFilterSettings = obs_get_source_defaults(filterKind.c_str()); - - json eventData; - eventData["sourceName"] = obs_source_get_name(source); - eventData["filterName"] = obs_source_get_name(filter); - eventData["filterKind"] = filterKind; - eventData["filterIndex"] = Utils::Obs::NumberHelper::GetSourceFilterIndex(source, filter); - eventData["filterSettings"] = Utils::Json::ObsDataToJson(filterSettings); - eventData["defaultFilterSettings"] = Utils::Json::ObsDataToJson(defaultFilterSettings, true); - eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterCreated", eventData); + eventHandler->HandleSourceFilterCreated(source, filter); } -/** - * A filter has been removed from a source. - * - * @dataField sourceName | String | Name of the source the filter was on - * @dataField filterName | String | Name of the filter - * - * @eventType SourceFilterRemoved - * @eventSubscription Filters - * @complexity 2 - * @rpcVersion -1 - * @initialVersion 5.0.0 - * @api events - * @category filters - */ -void EventHandler::HandleSourceFilterRemoved(void *param, calldata_t *data) +void EventHandler::FilterRemoveMultiHandler(void *param, calldata_t *data) { auto eventHandler = static_cast(param); @@ -87,12 +44,9 @@ void EventHandler::HandleSourceFilterRemoved(void *param, calldata_t *data) if (!(source && filter)) return; - eventHandler->DisconnectFilterSignals(filter); + eventHandler->DisconnectSourceSignals(filter); - json eventData; - eventData["sourceName"] = obs_source_get_name(source); - eventData["filterName"] = obs_source_get_name(filter); - eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterRemoved", eventData); + eventHandler->HandleSourceFilterRemoved(source, filter); } /** @@ -123,6 +77,92 @@ void EventHandler::HandleSourceFilterListReindexed(void *param, calldata_t *data eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterListReindexed", eventData); } +/** + * A filter has been added to a source. + * + * @dataField sourceName | String | Name of the source the filter was added to + * @dataField filterName | String | Name of the filter + * @dataField filterKind | String | The kind of the filter + * @dataField filterIndex | Number | Index position of the filter + * @dataField filterSettings | Object | The settings configured to the filter when it was created + * @dataField defaultFilterSettings | Object | The default settings for the filter + * + * @eventType SourceFilterCreated + * @eventSubscription Filters + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api events + * @category filters + */ +void EventHandler::HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter) +{ + std::string filterKind = obs_source_get_id(filter); + OBSDataAutoRelease filterSettings = obs_source_get_settings(filter); + OBSDataAutoRelease defaultFilterSettings = obs_get_source_defaults(filterKind.c_str()); + + json eventData; + eventData["sourceName"] = obs_source_get_name(source); + eventData["filterName"] = obs_source_get_name(filter); + eventData["filterKind"] = filterKind; + eventData["filterIndex"] = Utils::Obs::NumberHelper::GetSourceFilterIndex(source, filter); + eventData["filterSettings"] = Utils::Json::ObsDataToJson(filterSettings); + eventData["defaultFilterSettings"] = Utils::Json::ObsDataToJson(defaultFilterSettings, true); + BroadcastEvent(EventSubscription::Filters, "SourceFilterCreated", eventData); +} + +/** + * A filter has been removed from a source. + * + * @dataField sourceName | String | Name of the source the filter was on + * @dataField filterName | String | Name of the filter + * + * @eventType SourceFilterRemoved + * @eventSubscription Filters + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api events + * @category filters + */ +void EventHandler::HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter) +{ + json eventData; + eventData["sourceName"] = obs_source_get_name(source); + eventData["filterName"] = obs_source_get_name(filter); + BroadcastEvent(EventSubscription::Filters, "SourceFilterRemoved", eventData); +} + +/** + * The name of a source filter has changed. + * + * @dataField sourceName | String | The source the filter is on + * @dataField oldFilterName | String | Old name of the filter + * @dataField filterName | String | New name of the filter + * + * @eventType SourceFilterNameChanged + * @eventSubscription Filters + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api events + * @category filters + */ +void EventHandler::HandleSourceFilterNameChanged(void *param, calldata_t *data) +{ + auto eventHandler = static_cast(param); + + obs_source_t *filter = GetCalldataPointer(data, "source"); + if (!filter) + return; + + json eventData; + eventData["sourceName"] = obs_source_get_name(obs_filter_get_parent(filter)); + eventData["oldFilterName"] = calldata_string(data, "prev_name"); + eventData["filterName"] = calldata_string(data, "new_name"); + eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterNameChanged", eventData); +} + /** * A source filter's enable state has changed. * @@ -159,33 +199,3 @@ void EventHandler::HandleSourceFilterEnableStateChanged(void *param, calldata_t eventData["filterEnabled"] = filterEnabled; eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterEnableStateChanged", eventData); } - -/** - * The name of a source filter has changed. - * - * @dataField sourceName | String | The source the filter is on - * @dataField oldFilterName | String | Old name of the filter - * @dataField filterName | String | New name of the filter - * - * @eventType SourceFilterNameChanged - * @eventSubscription Filters - * @complexity 2 - * @rpcVersion -1 - * @initialVersion 5.0.0 - * @api events - * @category filters - */ -void EventHandler::HandleSourceFilterNameChanged(void *param, calldata_t *data) -{ - auto eventHandler = static_cast(param); - - obs_source_t *filter = GetCalldataPointer(data, "source"); - if (!filter) - return; - - json eventData; - eventData["sourceName"] = obs_source_get_name(obs_filter_get_parent(filter)); - eventData["oldFilterName"] = calldata_string(data, "prev_name"); - eventData["filterName"] = calldata_string(data, "new_name"); - eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterNameChanged", eventData); -} diff --git a/src/eventhandler/EventHandler_Transitions.cpp b/src/eventhandler/EventHandler_Transitions.cpp index 860d5cc6..66f89342 100644 --- a/src/eventhandler/EventHandler_Transitions.cpp +++ b/src/eventhandler/EventHandler_Transitions.cpp @@ -26,7 +26,7 @@ with this program. If not, see * * @eventType CurrentSceneTransitionChanged * @eventSubscription Transitions - * @complexity 3 + * @complexity 2 * @rpcVersion -1 * @initialVersion 5.0.0 * @api events @@ -60,3 +60,29 @@ void EventHandler::HandleCurrentSceneTransitionDurationChanged() eventData["transitionDuration"] = obs_frontend_get_transition_duration(); BroadcastEvent(EventSubscription::Transitions, "CurrentSceneTransitionDurationChanged", eventData); } + +/** + * A scene transition has started. + * + * @dataField transitionName | String | Scene transition name + * + * @eventType SceneTransitionStarted + * @eventSubscription Transitions + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api events + * @category transitions + */ +void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data) +{ + auto eventHandler = static_cast(param); + + obs_source_t *source = GetCalldataPointer(data, "source"); + if (!source) + return; + + json eventData; + eventData["transitionName"] = obs_source_get_name(source); + eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData); +}