mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Merge pull request #388 from Palakis/feature/enable-disable-filters
Get/set filter visibility (+ get single filter info)
This commit is contained in:
@ -735,6 +735,19 @@ obs_data_t* Utils::GetSceneItemPropertiesData(obs_sceneitem_t* sceneItem) {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obs_data_t* Utils::GetSourceFilterInfo(obs_source_t* filter, bool includeSettings)
|
||||||
|
{
|
||||||
|
obs_data_t* data = obs_data_create();
|
||||||
|
obs_data_set_bool(data, "enabled", obs_source_enabled(filter));
|
||||||
|
obs_data_set_string(data, "type", obs_source_get_id(filter));
|
||||||
|
obs_data_set_string(data, "name", obs_source_get_name(filter));
|
||||||
|
if (includeSettings) {
|
||||||
|
OBSDataAutoRelease settings = obs_source_get_settings(filter);
|
||||||
|
obs_data_set_obj(data, "settings", settings);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
obs_data_array_t* Utils::GetSourceFiltersList(obs_source_t* source, bool includeSettings)
|
obs_data_array_t* Utils::GetSourceFiltersList(obs_source_t* source, bool includeSettings)
|
||||||
{
|
{
|
||||||
struct enum_params {
|
struct enum_params {
|
||||||
@ -755,13 +768,8 @@ obs_data_array_t* Utils::GetSourceFiltersList(obs_source_t* source, bool include
|
|||||||
{
|
{
|
||||||
auto enumParams = reinterpret_cast<struct enum_params*>(param);
|
auto enumParams = reinterpret_cast<struct enum_params*>(param);
|
||||||
|
|
||||||
OBSDataAutoRelease filter = obs_data_create();
|
OBSDataAutoRelease filterData = Utils::GetSourceFilterInfo(child, enumParams->includeSettings);
|
||||||
obs_data_set_string(filter, "type", obs_source_get_id(child));
|
obs_data_array_push_back(enumParams->filters, filterData);
|
||||||
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);
|
}, &enumParams);
|
||||||
|
|
||||||
return enumParams.filters;
|
return enumParams.filters;
|
||||||
|
@ -48,6 +48,7 @@ class Utils {
|
|||||||
static obs_scene_t* GetSceneFromNameOrCurrent(QString sceneName);
|
static obs_scene_t* GetSceneFromNameOrCurrent(QString sceneName);
|
||||||
static obs_data_t* GetSceneItemPropertiesData(obs_sceneitem_t* item);
|
static obs_data_t* GetSceneItemPropertiesData(obs_sceneitem_t* item);
|
||||||
|
|
||||||
|
static obs_data_t* GetSourceFilterInfo(obs_source_t* filter, bool includeSettings);
|
||||||
static obs_data_array_t* GetSourceFiltersList(obs_source_t* source, bool includeSettings);
|
static obs_data_array_t* GetSourceFiltersList(obs_source_t* source, bool includeSettings);
|
||||||
|
|
||||||
static bool IsValidAlignment(const uint32_t alignment);
|
static bool IsValidAlignment(const uint32_t alignment);
|
||||||
|
@ -340,6 +340,26 @@ void WSEvents::disconnectSourceSignals(obs_source_t* source) {
|
|||||||
signal_handler_disconnect(sh, "transition_start", OnTransitionBegin, this);
|
signal_handler_disconnect(sh, "transition_start", OnTransitionBegin, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WSEvents::connectFilterSignals(obs_source_t* filter) {
|
||||||
|
if (!filter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
signal_handler_t* sh = obs_source_get_signal_handler(filter);
|
||||||
|
|
||||||
|
signal_handler_connect(sh, "enable", OnSourceFilterVisibilityChanged, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WSEvents::disconnectFilterSignals(obs_source_t* filter) {
|
||||||
|
if (!filter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
signal_handler_t* sh = obs_source_get_signal_handler(filter);
|
||||||
|
|
||||||
|
signal_handler_disconnect(sh, "enable", OnSourceFilterVisibilityChanged, this);
|
||||||
|
}
|
||||||
|
|
||||||
void WSEvents::hookTransitionBeginEvent() {
|
void WSEvents::hookTransitionBeginEvent() {
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
obs_frontend_get_transitions(&transitions);
|
obs_frontend_get_transitions(&transitions);
|
||||||
@ -1181,6 +1201,8 @@ void WSEvents::OnSourceFilterAdded(void* param, calldata_t* data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->connectFilterSignals(filter);
|
||||||
|
|
||||||
OBSDataAutoRelease filterSettings = obs_source_get_settings(filter);
|
OBSDataAutoRelease filterSettings = obs_source_get_settings(filter);
|
||||||
|
|
||||||
OBSDataAutoRelease fields = obs_data_create();
|
OBSDataAutoRelease fields = obs_data_create();
|
||||||
@ -1212,6 +1234,11 @@ void WSEvents::OnSourceFilterRemoved(void* param, calldata_t* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t* filter = calldata_get_pointer<obs_source_t>(data, "filter");
|
obs_source_t* filter = calldata_get_pointer<obs_source_t>(data, "filter");
|
||||||
|
if (!filter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self->disconnectFilterSignals(filter);
|
||||||
|
|
||||||
OBSDataAutoRelease fields = obs_data_create();
|
OBSDataAutoRelease fields = obs_data_create();
|
||||||
obs_data_set_string(fields, "sourceName", obs_source_get_name(source));
|
obs_data_set_string(fields, "sourceName", obs_source_get_name(source));
|
||||||
@ -1220,6 +1247,36 @@ void WSEvents::OnSourceFilterRemoved(void* param, calldata_t* data) {
|
|||||||
self->broadcastUpdate("SourceFilterRemoved", fields);
|
self->broadcastUpdate("SourceFilterRemoved", fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The visibility/enabled state of a filter changed
|
||||||
|
*
|
||||||
|
* @return {String} `sourceName` Source name
|
||||||
|
* @return {String} `filterName` Filter name
|
||||||
|
* @return {Boolean} `filterEnabled` New filter state
|
||||||
|
*
|
||||||
|
* @api events
|
||||||
|
* @name SourceFilterVisibilityChanged
|
||||||
|
* @category sources
|
||||||
|
* @since 4.7.0
|
||||||
|
*/
|
||||||
|
void WSEvents::OnSourceFilterVisibilityChanged(void* param, calldata_t* data) {
|
||||||
|
auto self = reinterpret_cast<WSEvents*>(param);
|
||||||
|
|
||||||
|
OBSSource source = calldata_get_pointer<obs_source_t>(data, "source");
|
||||||
|
if (!source) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSSource parent = obs_filter_get_parent(source);
|
||||||
|
|
||||||
|
OBSDataAutoRelease fields = obs_data_create();
|
||||||
|
obs_data_set_string(fields, "sourceName", obs_source_get_name(parent));
|
||||||
|
obs_data_set_string(fields, "filterName", obs_source_get_name(source));
|
||||||
|
obs_data_set_bool(fields, "filterEnabled", obs_source_enabled(source));
|
||||||
|
|
||||||
|
self->broadcastUpdate("SourceFilterVisibilityChanged", fields);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filters in a source have been reordered.
|
* Filters in a source have been reordered.
|
||||||
*
|
*
|
||||||
|
@ -40,6 +40,9 @@ public:
|
|||||||
void connectSourceSignals(obs_source_t* source);
|
void connectSourceSignals(obs_source_t* source);
|
||||||
void disconnectSourceSignals(obs_source_t* source);
|
void disconnectSourceSignals(obs_source_t* source);
|
||||||
|
|
||||||
|
void connectFilterSignals(obs_source_t* filter);
|
||||||
|
void disconnectFilterSignals(obs_source_t* filter);
|
||||||
|
|
||||||
void hookTransitionBeginEvent();
|
void hookTransitionBeginEvent();
|
||||||
void unhookTransitionBeginEvent();
|
void unhookTransitionBeginEvent();
|
||||||
|
|
||||||
@ -126,6 +129,7 @@ private:
|
|||||||
|
|
||||||
static void OnSourceFilterAdded(void* param, calldata_t* data);
|
static void OnSourceFilterAdded(void* param, calldata_t* data);
|
||||||
static void OnSourceFilterRemoved(void* param, calldata_t* data);
|
static void OnSourceFilterRemoved(void* param, calldata_t* data);
|
||||||
|
static void OnSourceFilterVisibilityChanged(void* param, calldata_t* data);
|
||||||
static void OnSourceFilterOrderChanged(void* param, calldata_t* data);
|
static void OnSourceFilterOrderChanged(void* param, calldata_t* data);
|
||||||
|
|
||||||
static void OnSceneReordered(void* param, calldata_t* data);
|
static void OnSceneReordered(void* param, calldata_t* data);
|
||||||
|
@ -95,11 +95,13 @@ QHash<QString, HandlerResponse(*)(WSRequestHandler*)> WSRequestHandler::messageM
|
|||||||
{ "TakeSourceScreenshot", WSRequestHandler::HandleTakeSourceScreenshot },
|
{ "TakeSourceScreenshot", WSRequestHandler::HandleTakeSourceScreenshot },
|
||||||
|
|
||||||
{ "GetSourceFilters", WSRequestHandler::HandleGetSourceFilters },
|
{ "GetSourceFilters", WSRequestHandler::HandleGetSourceFilters },
|
||||||
|
{ "GetSourceFilterInfo", WSRequestHandler::HandleGetSourceFilterInfo },
|
||||||
{ "AddFilterToSource", WSRequestHandler::HandleAddFilterToSource },
|
{ "AddFilterToSource", WSRequestHandler::HandleAddFilterToSource },
|
||||||
{ "RemoveFilterFromSource", WSRequestHandler::HandleRemoveFilterFromSource },
|
{ "RemoveFilterFromSource", WSRequestHandler::HandleRemoveFilterFromSource },
|
||||||
{ "ReorderSourceFilter", WSRequestHandler::HandleReorderSourceFilter },
|
{ "ReorderSourceFilter", WSRequestHandler::HandleReorderSourceFilter },
|
||||||
{ "MoveSourceFilter", WSRequestHandler::HandleMoveSourceFilter },
|
{ "MoveSourceFilter", WSRequestHandler::HandleMoveSourceFilter },
|
||||||
{ "SetSourceFilterSettings", WSRequestHandler::HandleSetSourceFilterSettings },
|
{ "SetSourceFilterSettings", WSRequestHandler::HandleSetSourceFilterSettings },
|
||||||
|
{ "SetSourceFilterVisibility", WSRequestHandler::HandleSetSourceFilterVisibility },
|
||||||
|
|
||||||
{ "SetCurrentSceneCollection", WSRequestHandler::HandleSetCurrentSceneCollection },
|
{ "SetCurrentSceneCollection", WSRequestHandler::HandleSetCurrentSceneCollection },
|
||||||
{ "GetCurrentSceneCollection", WSRequestHandler::HandleGetCurrentSceneCollection },
|
{ "GetCurrentSceneCollection", WSRequestHandler::HandleGetCurrentSceneCollection },
|
||||||
|
@ -139,11 +139,13 @@ class WSRequestHandler : public QObject {
|
|||||||
static HandlerResponse HandleTakeSourceScreenshot(WSRequestHandler* req);
|
static HandlerResponse HandleTakeSourceScreenshot(WSRequestHandler* req);
|
||||||
|
|
||||||
static HandlerResponse HandleGetSourceFilters(WSRequestHandler* req);
|
static HandlerResponse HandleGetSourceFilters(WSRequestHandler* req);
|
||||||
|
static HandlerResponse HandleGetSourceFilterInfo(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleAddFilterToSource(WSRequestHandler* req);
|
static HandlerResponse HandleAddFilterToSource(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleRemoveFilterFromSource(WSRequestHandler* req);
|
static HandlerResponse HandleRemoveFilterFromSource(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleReorderSourceFilter(WSRequestHandler* req);
|
static HandlerResponse HandleReorderSourceFilter(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleMoveSourceFilter(WSRequestHandler* req);
|
static HandlerResponse HandleMoveSourceFilter(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleSetSourceFilterSettings(WSRequestHandler* req);
|
static HandlerResponse HandleSetSourceFilterSettings(WSRequestHandler* req);
|
||||||
|
static HandlerResponse HandleSetSourceFilterVisibility(WSRequestHandler* req);
|
||||||
|
|
||||||
static HandlerResponse HandleSetCurrentSceneCollection(WSRequestHandler* req);
|
static HandlerResponse HandleSetCurrentSceneCollection(WSRequestHandler* req);
|
||||||
static HandlerResponse HandleGetCurrentSceneCollection(WSRequestHandler* req);
|
static HandlerResponse HandleGetCurrentSceneCollection(WSRequestHandler* req);
|
||||||
|
@ -1061,6 +1061,7 @@ HandlerResponse WSRequestHandler::HandleGetSpecialSources(WSRequestHandler* req)
|
|||||||
* @param {String} `sourceName` Source name
|
* @param {String} `sourceName` Source name
|
||||||
*
|
*
|
||||||
* @return {Array<Object>} `filters` List of filters for the specified source
|
* @return {Array<Object>} `filters` List of filters for the specified source
|
||||||
|
* @return {Boolean} `filters.*.enabled` Filter status (enabled or not)
|
||||||
* @return {String} `filters.*.type` Filter type
|
* @return {String} `filters.*.type` Filter type
|
||||||
* @return {String} `filters.*.name` Filter name
|
* @return {String} `filters.*.name` Filter name
|
||||||
* @return {Object} `filters.*.settings` Filter settings
|
* @return {Object} `filters.*.settings` Filter settings
|
||||||
@ -1089,6 +1090,44 @@ HandlerResponse WSRequestHandler::HandleGetSourceFilters(WSRequestHandler* req)
|
|||||||
return req->SendOKResponse(response);
|
return req->SendOKResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List filters applied to a source
|
||||||
|
*
|
||||||
|
* @param {String} `sourceName` Source name
|
||||||
|
* @param {String} `filterName` Source filter name
|
||||||
|
*
|
||||||
|
* @return {Boolean} `enabled` Filter status (enabled or not)
|
||||||
|
* @return {String} `type` Filter type
|
||||||
|
* @return {String} `name` Filter name
|
||||||
|
* @return {Object} `settings` Filter settings
|
||||||
|
*
|
||||||
|
* @api requests
|
||||||
|
* @name GetSourceFilterInfo
|
||||||
|
* @category sources
|
||||||
|
* @since 4.7.0
|
||||||
|
*/
|
||||||
|
HandlerResponse WSRequestHandler::HandleGetSourceFilterInfo(WSRequestHandler* req)
|
||||||
|
{
|
||||||
|
if (!req->hasField("sourceName") || !req->hasField("filterName")) {
|
||||||
|
return req->SendErrorResponse("missing request parameters");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* sourceName = obs_data_get_string(req->data, "sourceName");
|
||||||
|
OBSSourceAutoRelease source = obs_get_source_by_name(sourceName);
|
||||||
|
if (!source) {
|
||||||
|
return req->SendErrorResponse("specified source doesn't exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* filterName = obs_data_get_string(req->data, "filterName");
|
||||||
|
OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName);
|
||||||
|
if (!filter) {
|
||||||
|
return req->SendErrorResponse("specified filter doesn't exist on specified source");
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSDataAutoRelease response = Utils::GetSourceFilterInfo(filter, true);
|
||||||
|
return req->SendOKResponse(response);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new filter to a source. Available source types along with their settings properties are available from `GetSourceTypesList`.
|
* Add a new filter to a source. Available source types along with their settings properties are available from `GetSourceTypesList`.
|
||||||
*
|
*
|
||||||
@ -1339,6 +1378,42 @@ HandlerResponse WSRequestHandler::HandleSetSourceFilterSettings(WSRequestHandler
|
|||||||
return req->SendOKResponse();
|
return req->SendOKResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the visibility/enabled state of a filter
|
||||||
|
*
|
||||||
|
* @param {String} `sourceName` Source name
|
||||||
|
* @param {String} `filterName` Source filter name
|
||||||
|
* @param {String} `filterEnabled` New filter state
|
||||||
|
*
|
||||||
|
* @api requests
|
||||||
|
* @name EnableSourceFilter
|
||||||
|
* @category sources
|
||||||
|
* @since 4.7.0
|
||||||
|
*/
|
||||||
|
HandlerResponse WSRequestHandler::HandleSetSourceFilterVisibility(WSRequestHandler* req)
|
||||||
|
{
|
||||||
|
if (!req->hasField("sourceName") || !req->hasField("filterName") || !req->hasField("filterEnabled")) {
|
||||||
|
return req->SendErrorResponse("missing request parameters");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* sourceName = obs_data_get_string(req->data, "sourceName");
|
||||||
|
OBSSourceAutoRelease source = obs_get_source_by_name(sourceName);
|
||||||
|
if (!source) {
|
||||||
|
return req->SendErrorResponse("specified source doesn't exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* filterName = obs_data_get_string(req->data, "filterName");
|
||||||
|
OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName);
|
||||||
|
if (!filter) {
|
||||||
|
return req->SendErrorResponse("specified filter doesn't exist on specified source");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool filterEnabled = obs_data_get_bool(req->data, "filterEnabled");
|
||||||
|
obs_source_set_enabled(filter, filterEnabled);
|
||||||
|
|
||||||
|
return req->SendOKResponse();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Takes a picture snapshot of a source and then can either or both:
|
* Takes a picture snapshot of a source and then can either or both:
|
||||||
* - Send it over as a Data URI (base64-encoded data) in the response (by specifying `embedPictureFormat` in the request)
|
* - Send it over as a Data URI (base64-encoded data) in the response (by specifying `embedPictureFormat` in the request)
|
||||||
|
Reference in New Issue
Block a user