Added request SetSourceRender and util method GetSceneItemFromName

This commit is contained in:
Stéphane Lepin 2016-10-17 22:48:44 +02:00
parent f500f0f296
commit f944cd34f9
4 changed files with 68 additions and 9 deletions

View File

@ -1,17 +1,19 @@
#include "Utils.h"
bool enum_scene_items(obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) {
obs_data_array_t *data = static_cast<obs_data_array *>(param);
obs_data_array_push_back(data, Utils::GetSceneItemData(currentItem));
return true;
}
obs_data_array_t* Utils::GetSceneItems(obs_source_t *source) {
obs_data_array_t *items = obs_data_array_create();
obs_scene_t *scene = obs_scene_from_source(source);
if (scene == NULL) {
return NULL;
}
obs_scene_enum_items(scene, enum_scene_items, items);
obs_scene_enum_items(scene, [](obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) {
obs_data_array_t *data = static_cast<obs_data_array_t *>(param);
obs_data_array_push_back(data, GetSceneItemData(currentItem));
return true;
}, items);
obs_scene_release(scene);
return items;
}
@ -39,6 +41,38 @@ obs_data_t* Utils::GetSceneItemData(obs_sceneitem_t *item) {
return data;
}
obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, const char* name) {
struct current_search {
const char* query;
obs_sceneitem_t* result;
};
current_search search;
search.query = name;
search.result = NULL;
obs_scene_t *scene = obs_scene_from_source(source);
if (scene == NULL) {
return NULL;
}
obs_scene_enum_items(scene, [](obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) {
current_search *search = static_cast<current_search *>(param);
const char* currentItemName = obs_source_get_name(obs_sceneitem_get_source(currentItem));
if (strcmp(currentItemName, search->query) == 0) {
search->result = currentItem;
obs_sceneitem_addref(search->result);
return false;
}
return true;
}, &search);
return search.result;
}
obs_data_array_t* Utils::GetScenes() {
obs_frontend_source_list sceneList = {};
obs_frontend_get_scenes(&sceneList);

View File

@ -7,8 +7,9 @@
class Utils
{
public:
static obs_data_array_t* GetSceneItems(obs_source_t* source);
static obs_data_array_t* GetSceneItems(obs_source_t *source);
static obs_data_t* GetSceneItemData(obs_scene_item *item);
static obs_sceneitem_t* GetSceneItemFromName(obs_source_t *source, const char* name);
static obs_data_array_t* GetScenes();
static obs_data_t* GetSceneData(obs_source *source);

View File

@ -13,7 +13,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) {
messageMap["GetCurrentScene"] = WSRequestHandler::HandleGetCurrentScene;
messageMap["GetSceneList"] = WSRequestHandler::HandleGetSceneList;
messageMap["SetSourceOrder"] = WSRequestHandler::ErrNotImplemented;
messageMap["SetSourceRender"] = WSRequestHandler::ErrNotImplemented;
messageMap["SetSourceRender"] = WSRequestHandler::HandleSetSourceRender;
messageMap["SetSceneItemPositionAndSize"] = WSRequestHandler::ErrNotImplemented;
messageMap["GetStreamingStatus"] = WSRequestHandler::HandleGetStreamingStatus;
messageMap["StartStopStreaming"] = WSRequestHandler::HandleStartStopStreaming;
@ -148,6 +148,29 @@ void WSRequestHandler::HandleGetSceneList(WSRequestHandler *owner) {
obs_data_release(data);
}
void WSRequestHandler::HandleSetSourceRender(WSRequestHandler *owner) {
const char *itemName = obs_data_get_string(owner->_requestData, "source");
bool isVisible = obs_data_get_bool(owner->_requestData, "render");
if (itemName == NULL) {
owner->SendErrorResponse("invalid request parameters");
return;
}
obs_source_t* currentScene = obs_frontend_get_current_scene();
obs_sceneitem_t *sceneItem = Utils::GetSceneItemFromName(currentScene, itemName);
if (sceneItem != NULL) {
obs_sceneitem_set_visible(sceneItem, isVisible);
obs_sceneitem_release(sceneItem);
owner->SendOKResponse();
}
else {
owner->SendErrorResponse("specified scene item doesn't exist");
}
obs_source_release(currentScene);
}
void WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler *owner) {
obs_data_t *data = obs_data_create();
obs_data_set_bool(data, "streaming", obs_frontend_streaming_active());

View File

@ -30,6 +30,7 @@ class WSRequestHandler
static void HandleSetCurrentScene(WSRequestHandler *owner);
static void HandleGetCurrentScene(WSRequestHandler *owner);
static void HandleGetSceneList(WSRequestHandler *owner);
static void HandleSetSourceRender(WSRequestHandler *owner);
static void HandleGetStreamingStatus(WSRequestHandler *owner);
static void HandleStartStopStreaming(WSRequestHandler *owner);
static void HandleStartStopRecording(WSRequestHandler *owner);