Merge pull request #388 from Palakis/feature/enable-disable-filters

Get/set filter visibility (+ get single filter info)
This commit is contained in:
Stéphane Lepin 2019-11-11 14:40:32 +01:00 committed by GitHub
commit 5d81b61325
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 156 additions and 7 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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.
*

View File

@ -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);

View File

@ -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 },

View File

@ -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);

View File

@ -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)