diff --git a/src/Utils.cpp b/src/Utils.cpp index bf2a3973..840e2e31 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -667,3 +667,35 @@ obs_data_t* Utils::GetSceneItemPropertiesData(obs_sceneitem_t* sceneItem) { return data; } + +obs_data_array_t* Utils::GetSourceFiltersList(obs_source_t* source, bool includeSettings) +{ + struct enum_params { + obs_data_array_t* filters; + bool includeSettings; + }; + + if (!source) { + return nullptr; + } + + struct enum_params enumParams; + + enumParams.filters = obs_data_array_create(); + enumParams.includeSettings = includeSettings; + + obs_source_enum_filters(source, [](obs_source_t* parent, obs_source_t* child, void* param) + { + auto enumParams = reinterpret_cast(param); + + OBSDataAutoRelease filter = obs_data_create(); + obs_data_set_string(filter, "type", obs_source_get_id(child)); + obs_data_set_string(filter, "name", obs_source_get_name(child)); + if (enumParams->includeSettings) { + obs_data_set_obj(filter, "settings", obs_source_get_settings(child)); + } + obs_data_array_push_back(enumParams->filters, filter); + }, &enumParams); + + return enumParams.filters; +} \ No newline at end of file diff --git a/src/Utils.h b/src/Utils.h index b22a824c..3a739a2c 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -43,6 +43,8 @@ class Utils { static obs_source_t* GetTransitionFromName(QString transitionName); static obs_source_t* GetSceneFromNameOrCurrent(QString sceneName); static obs_data_t* GetSceneItemPropertiesData(obs_sceneitem_t* item); + + static obs_data_array_t* GetSourceFiltersList(obs_source_t* source, bool includeSettings); static bool IsValidAlignment(const uint32_t alignment); diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 629f560c..2d10f12d 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -998,7 +998,6 @@ void WSEvents::OnSourceRename(void* param, calldata_t* data) { } const char* previousName = calldata_get_string(data, "prev_name"); - // TODO check? OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "previousName", previousName); @@ -1010,6 +1009,9 @@ void WSEvents::OnSourceRename(void* param, calldata_t* data) { * A filter was added to a source. * * @return {String} `sourceName` Source name + * @return {String} `filterName` Filter name + * @return {String} `filterType` Filter type + * @return {Object} `filterSettings` Filter settings * * @api events * @name SourceFilterAdded @@ -1034,6 +1036,7 @@ void WSEvents::OnSourceFilterAdded(void* param, calldata_t* data) { OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); obs_data_set_string(fields, "filterName", obs_source_get_name(filter)); + obs_data_set_string(fields, "filterType", obs_source_get_id(filter)); obs_data_set_obj(fields, "filterSettings", filterSettings); self->broadcastUpdate("SourceFilterAdded", fields); } @@ -1042,6 +1045,8 @@ void WSEvents::OnSourceFilterAdded(void* param, calldata_t* data) { * A filter was removed from a source. * * @return {String} `sourceName` Source name + * @return {String} `filterName` Filter name + * @return {String} `filterType` Filter type * * @api events * @name SourceFilterRemoved @@ -1061,6 +1066,7 @@ void WSEvents::OnSourceFilterRemoved(void* param, calldata_t* data) { OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); obs_data_set_string(fields, "filterName", obs_source_get_name(filter)); + obs_data_set_string(fields, "filterType", obs_source_get_id(filter)); self->broadcastUpdate("SourceFilterRemoved", fields); } @@ -1068,6 +1074,9 @@ void WSEvents::OnSourceFilterRemoved(void* param, calldata_t* data) { * Filters in a source have been reordered. * * @return {String} `sourceName` Source name + * @return {Array} `filters` Ordered Filters list + * @return {String} `filters.*.name` Filter name + * @return {String} `filters.*.type` Filter type * * @api events * @name SourceFiltersReordered @@ -1082,9 +1091,11 @@ void WSEvents::OnSourceFilterOrderChanged(void* param, calldata_t* data) { return; } + OBSDataArrayAutoRelease filters = Utils::GetSourceFiltersList(source, false); + OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); - // TODO filters list + obs_data_set_array(fields, "filters", filters); self->broadcastUpdate("SourceFiltersReordered", fields); } diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index 62299628..592be38e 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -1090,16 +1090,7 @@ HandlerResponse WSRequestHandler::HandleGetSourceFilters(WSRequestHandler* req) return req->SendErrorResponse("specified source doesn't exist"); } - OBSDataArrayAutoRelease filters = obs_data_array_create(); - obs_source_enum_filters(source, [](obs_source_t *parent, obs_source_t *child, void *param) - { - OBSDataAutoRelease filter = obs_data_create(); - obs_data_set_string(filter, "type", obs_source_get_id(child)); - obs_data_set_string(filter, "name", obs_source_get_name(child)); - obs_data_set_obj(filter, "settings", obs_source_get_settings(child)); - obs_data_array_push_back((obs_data_array_t*)param, filter); - - }, filters); + OBSDataArrayAutoRelease filters = Utils::GetSourceFiltersList(source, true); OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "filters", filters);