mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
eventhandler: Add SceneTransitionStarted + cleanup
This commit cleans up a bunch of code in the event handler, making it much easier to understand (IMO). I feel much better about how we handle connecting and disconnecting callbacks. Before, we were actually allowing a bunch of callbacks to stay connected and get cleaned up. Now, we actually properly disconnect them.
This commit is contained in:
parent
e15b2edb4f
commit
a7698a732f
@ -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<EventHandler*>(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<EventHandler*>(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<EventHandler*>(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<EventHandler*>(param);
|
||||
eventHandler->ConnectSourceSignals(source);
|
||||
|
||||
auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){
|
||||
auto eventHandler = static_cast<EventHandler*>(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<EventHandler*>(param);
|
||||
eventHandler->ConnectSourceSignals(source);
|
||||
|
||||
auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){
|
||||
auto eventHandler = static_cast<EventHandler*>(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<EventHandler*>(param);
|
||||
eventHandler->DisconnectSourceSignals(source);
|
||||
|
||||
auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){
|
||||
auto eventHandler = static_cast<EventHandler*>(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<EventHandler*>(param);
|
||||
eventHandler->DisconnectSourceSignals(source);
|
||||
|
||||
auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *param){
|
||||
auto eventHandler = static_cast<EventHandler*>(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();
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -19,25 +19,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
|
||||
#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<EventHandler*>(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<EventHandler*>(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<EventHandler*>(param);
|
||||
|
||||
obs_source_t *filter = GetCalldataPointer<obs_source_t>(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<EventHandler*>(param);
|
||||
|
||||
obs_source_t *filter = GetCalldataPointer<obs_source_t>(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);
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
*
|
||||
* @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<EventHandler*>(param);
|
||||
|
||||
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
||||
if (!source)
|
||||
return;
|
||||
|
||||
json eventData;
|
||||
eventData["transitionName"] = obs_source_get_name(source);
|
||||
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user