diff --git a/src/Utils.cpp b/src/Utils.cpp index 21caed27..062e707c 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -173,7 +173,11 @@ obs_data_t* Utils::GetSceneItemData(obs_sceneitem_t* item) { return data; } -obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_source_t* scene, obs_data_t* itemInfo) { +obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* itemInfo) { + if (!scene) { + return nullptr; + } + obs_data_item_t* idInfoItem = obs_data_item_byname(itemInfo, "id"); // TODO fix memory leak int id = obs_data_item_get_int(idInfoItem); @@ -181,7 +185,7 @@ obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_source_t* scene, obs_data_t* it const char* name = obs_data_item_get_string(nameInfoItem); if (idInfoItem) { - obs_sceneitem_t* sceneItem = obs_scene_find_sceneitem_by_id(obs_scene_from_source(scene), id); + obs_sceneitem_t* sceneItem = obs_scene_find_sceneitem_by_id(scene, id); obs_source_t* sceneItemSource = obs_sceneitem_get_source(sceneItem); QString sceneItemName = obs_source_get_name(sceneItemSource); @@ -197,7 +201,11 @@ obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_source_t* scene, obs_data_t* it return nullptr; } -obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name) { +obs_sceneitem_t* Utils::GetSceneItemFromName(obs_scene_t* scene, QString name) { + if (!scene) { + return nullptr; + } + struct current_search { QString query; obs_sceneitem_t* result; @@ -209,10 +217,6 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name) search.result = nullptr; search.enumCallback = nullptr; - OBSScene scene = obs_scene_from_source(source); - if (!scene) - return nullptr; - search.enumCallback = []( obs_scene_t* scene, obs_sceneitem_t* currentItem, @@ -282,17 +286,19 @@ obs_source_t* Utils::GetTransitionFromName(QString searchName) { return foundTransition; } -obs_source_t* Utils::GetSceneFromNameOrCurrent(QString sceneName) { +obs_scene_t* Utils::GetSceneFromNameOrCurrent(QString sceneName) { // Both obs_frontend_get_current_scene() and obs_get_source_by_name() - // do addref on the return source, so no need to use an OBSSource helper - obs_source_t* scene = nullptr; + // increase the returned source's refcount + OBSSourceAutoRelease sceneSource = nullptr; - if (sceneName.isEmpty() || sceneName.isNull()) - scene = obs_frontend_get_current_scene(); - else - scene = obs_get_source_by_name(sceneName.toUtf8()); + if (sceneName.isEmpty() || sceneName.isNull()) { + sceneSource = obs_frontend_get_current_scene(); + } + else { + sceneSource = obs_get_source_by_name(sceneName.toUtf8()); + } - return scene; + return obs_scene_from_source(sceneSource); } obs_data_array_t* Utils::GetScenes() { diff --git a/src/Utils.h b/src/Utils.h index 41eea124..3a8da207 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -36,11 +36,10 @@ class Utils { static obs_data_array_t* StringListToArray(char** strings, const char* key); static obs_data_array_t* GetSceneItems(obs_source_t* source); static obs_data_t* GetSceneItemData(obs_sceneitem_t* item); - static obs_sceneitem_t* GetSceneItemFromName( - obs_source_t* source, QString name); - static obs_sceneitem_t* GetSceneItemFromItem(obs_source_t* scene, obs_data_t* item); - static obs_source_t* GetTransitionFromName(QString transitionName); - static obs_source_t* GetSceneFromNameOrCurrent(QString sceneName); + + static obs_sceneitem_t* GetSceneItemFromName(obs_scene_t* scene, QString name); + static obs_sceneitem_t* GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* item); + static obs_scene_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); @@ -52,9 +51,8 @@ class Utils { // TODO contribute a proper frontend API method for this to OBS and remove this hack static QSpinBox* GetTransitionDurationControl(); - static int GetTransitionDuration(obs_source_t* transition); - + static obs_source_t* GetTransitionFromName(QString transitionName); static bool SetTransitionByName(QString transitionName); static QString OBSVersionString(); @@ -70,9 +68,11 @@ class Utils { static QString ParseDataToQueryString(obs_data_t* data); static obs_hotkey_t* FindHotkeyByName(QString name); + static bool ReplayBufferEnabled(); static void StartReplayBuffer(); static bool IsRPHotkeySet(); + static const char* GetFilenameFormatting(); static bool SetFilenameFormatting(const char* filenameFormatting); }; diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index fd5c138f..e2e6d188 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -49,13 +49,12 @@ HandlerResponse WSRequestHandler::HandleGetSceneItemProperties(WSRequestHandler* } QString sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } - OBSSceneItemAutoRelease sceneItem = - Utils::GetSceneItemFromName(scene, itemName); + OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { return req->SendErrorResponse("specified scene item doesn't exist"); } @@ -105,7 +104,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* } QString sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -283,7 +282,7 @@ HandlerResponse WSRequestHandler::HandleResetSceneItem(WSRequestHandler* req) { } const char* sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -329,7 +328,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemRender(WSRequestHandler* req } const char* sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -371,7 +370,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemPosition(WSRequestHandler* r } QString sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene could not be found"); } @@ -419,7 +418,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemTransform(WSRequestHandler* } QString sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -471,7 +470,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemCrop(WSRequestHandler* req) } QString sceneName = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -511,7 +510,7 @@ HandlerResponse WSRequestHandler::HandleDeleteSceneItem(WSRequestHandler* req) { } const char* sceneName = obs_data_get_string(req->data, "scene"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -564,13 +563,13 @@ HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req } const char* fromSceneName = obs_data_get_string(req->data, "fromScene"); - OBSSourceAutoRelease fromScene = Utils::GetSceneFromNameOrCurrent(fromSceneName); + OBSScene fromScene = Utils::GetSceneFromNameOrCurrent(fromSceneName); if (!fromScene) { return req->SendErrorResponse("requested fromScene doesn't exist"); } const char* toSceneName = obs_data_get_string(req->data, "toScene"); - OBSSourceAutoRelease toScene = Utils::GetSceneFromNameOrCurrent(toSceneName); + OBSScene toScene = Utils::GetSceneFromNameOrCurrent(toSceneName); if (!toScene) { return req->SendErrorResponse("requested toScene doesn't exist"); } @@ -586,7 +585,7 @@ HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req data.referenceItem = referenceItem; obs_enter_graphics(); - obs_scene_atomic_update(obs_scene_from_source(toScene), DuplicateSceneItem, &data); + obs_scene_atomic_update(toScene, DuplicateSceneItem, &data); obs_leave_graphics(); obs_sceneitem_t *newItem = data.newItem; @@ -600,7 +599,7 @@ HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req OBSDataAutoRelease responseData = obs_data_create(); obs_data_set_obj(responseData, "item", itemData); - obs_data_set_string(responseData, "scene", obs_source_get_name(toScene)); + obs_data_set_string(responseData, "scene", obs_source_get_name(obs_scene_get_source(toScene))); return req->SendOKResponse(responseData); } diff --git a/src/WSRequestHandler_Scenes.cpp b/src/WSRequestHandler_Scenes.cpp index 90211a14..cd7f8c25 100644 --- a/src/WSRequestHandler_Scenes.cpp +++ b/src/WSRequestHandler_Scenes.cpp @@ -94,8 +94,8 @@ HandlerResponse WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { */ HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) { QString sceneName = obs_data_get_string(req->data, "scene"); - OBSSourceAutoRelease sceneSource = Utils::GetSceneFromNameOrCurrent(sceneName); - if (!sceneSource) { + OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); + if (!scene) { return req->SendErrorResponse("requested scene doesn't exist"); } @@ -104,8 +104,6 @@ HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) return req->SendErrorResponse("sceneItem order not specified"); } - OBSScene scene = obs_scene_from_source(sceneSource); - QVector orderList; struct obs_sceneitem_order_info info; @@ -113,7 +111,7 @@ HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) for (int i = 0; i < itemCount; i++) { OBSDataAutoRelease item = obs_data_array_item(items, i); - OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(sceneSource, item); + OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item); if (!sceneItem) { return req->SendErrorResponse("Invalid sceneItem id or name specified"); } diff --git a/src/WSRequestHandler_StudioMode.cpp b/src/WSRequestHandler_StudioMode.cpp index 738b5bcc..bfcdae4e 100644 --- a/src/WSRequestHandler_StudioMode.cpp +++ b/src/WSRequestHandler_StudioMode.cpp @@ -69,12 +69,12 @@ HandlerResponse WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { } const char* scene_name = obs_data_get_string(req->data, "scene-name"); - OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(scene_name); + OBSScene scene = Utils::GetSceneFromNameOrCurrent(scene_name); if (!scene) { return req->SendErrorResponse("specified scene doesn't exist"); } - obs_frontend_set_current_preview_scene(scene); + obs_frontend_set_current_preview_scene(obs_scene_get_source(scene)); return req->SendOKResponse(); }