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:
commit
5d81b61325
@ -735,6 +735,19 @@ obs_data_t* Utils::GetSceneItemPropertiesData(obs_sceneitem_t* sceneItem) {
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
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);
|
||||
OBSDataAutoRelease filterData = Utils::GetSourceFilterInfo(child, enumParams->includeSettings);
|
||||
obs_data_array_push_back(enumParams->filters, filterData);
|
||||
}, &enumParams);
|
||||
|
||||
return enumParams.filters;
|
||||
|
@ -48,6 +48,7 @@ class Utils {
|
||||
static obs_scene_t* GetSceneFromNameOrCurrent(QString sceneName);
|
||||
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 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);
|
||||
}
|
||||
|
||||
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() {
|
||||
obs_frontend_source_list transitions = {};
|
||||
obs_frontend_get_transitions(&transitions);
|
||||
@ -1180,6 +1200,8 @@ void WSEvents::OnSourceFilterAdded(void* param, calldata_t* data) {
|
||||
if (!filter) {
|
||||
return;
|
||||
}
|
||||
|
||||
self->connectFilterSignals(filter);
|
||||
|
||||
OBSDataAutoRelease filterSettings = obs_source_get_settings(filter);
|
||||
|
||||
@ -1212,6 +1234,11 @@ void WSEvents::OnSourceFilterRemoved(void* param, calldata_t* data) {
|
||||
}
|
||||
|
||||
obs_source_t* filter = calldata_get_pointer<obs_source_t>(data, "filter");
|
||||
if (!filter) {
|
||||
return;
|
||||
}
|
||||
|
||||
self->disconnectFilterSignals(filter);
|
||||
|
||||
OBSDataAutoRelease fields = obs_data_create();
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
@ -40,6 +40,9 @@ public:
|
||||
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 hookTransitionBeginEvent();
|
||||
void unhookTransitionBeginEvent();
|
||||
|
||||
@ -126,6 +129,7 @@ private:
|
||||
|
||||
static void OnSourceFilterAdded(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 OnSceneReordered(void* param, calldata_t* data);
|
||||
|
@ -95,11 +95,13 @@ QHash<QString, HandlerResponse(*)(WSRequestHandler*)> WSRequestHandler::messageM
|
||||
{ "TakeSourceScreenshot", WSRequestHandler::HandleTakeSourceScreenshot },
|
||||
|
||||
{ "GetSourceFilters", WSRequestHandler::HandleGetSourceFilters },
|
||||
{ "GetSourceFilterInfo", WSRequestHandler::HandleGetSourceFilterInfo },
|
||||
{ "AddFilterToSource", WSRequestHandler::HandleAddFilterToSource },
|
||||
{ "RemoveFilterFromSource", WSRequestHandler::HandleRemoveFilterFromSource },
|
||||
{ "ReorderSourceFilter", WSRequestHandler::HandleReorderSourceFilter },
|
||||
{ "MoveSourceFilter", WSRequestHandler::HandleMoveSourceFilter },
|
||||
{ "SetSourceFilterSettings", WSRequestHandler::HandleSetSourceFilterSettings },
|
||||
{ "SetSourceFilterVisibility", WSRequestHandler::HandleSetSourceFilterVisibility },
|
||||
|
||||
{ "SetCurrentSceneCollection", WSRequestHandler::HandleSetCurrentSceneCollection },
|
||||
{ "GetCurrentSceneCollection", WSRequestHandler::HandleGetCurrentSceneCollection },
|
||||
|
@ -139,11 +139,13 @@ class WSRequestHandler : public QObject {
|
||||
static HandlerResponse HandleTakeSourceScreenshot(WSRequestHandler* req);
|
||||
|
||||
static HandlerResponse HandleGetSourceFilters(WSRequestHandler* req);
|
||||
static HandlerResponse HandleGetSourceFilterInfo(WSRequestHandler* req);
|
||||
static HandlerResponse HandleAddFilterToSource(WSRequestHandler* req);
|
||||
static HandlerResponse HandleRemoveFilterFromSource(WSRequestHandler* req);
|
||||
static HandlerResponse HandleReorderSourceFilter(WSRequestHandler* req);
|
||||
static HandlerResponse HandleMoveSourceFilter(WSRequestHandler* req);
|
||||
static HandlerResponse HandleSetSourceFilterSettings(WSRequestHandler* req);
|
||||
static HandlerResponse HandleSetSourceFilterVisibility(WSRequestHandler* req);
|
||||
|
||||
static HandlerResponse HandleSetCurrentSceneCollection(WSRequestHandler* req);
|
||||
static HandlerResponse HandleGetCurrentSceneCollection(WSRequestHandler* req);
|
||||
|
@ -1061,6 +1061,7 @@ HandlerResponse WSRequestHandler::HandleGetSpecialSources(WSRequestHandler* req)
|
||||
* @param {String} `sourceName` Source name
|
||||
*
|
||||
* @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.*.name` Filter name
|
||||
* @return {Object} `filters.*.settings` Filter settings
|
||||
@ -1089,6 +1090,44 @@ HandlerResponse WSRequestHandler::HandleGetSourceFilters(WSRequestHandler* req)
|
||||
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`.
|
||||
*
|
||||
@ -1339,6 +1378,42 @@ HandlerResponse WSRequestHandler::HandleSetSourceFilterSettings(WSRequestHandler
|
||||
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:
|
||||
* - Send it over as a Data URI (base64-encoded data) in the response (by specifying `embedPictureFormat` in the request)
|
||||
|
Loading…
x
Reference in New Issue
Block a user