diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index 286e34a3..d95b3daf 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -73,7 +73,7 @@ RequestResult RequestHandler::CreateInput(const Request& request) } // Create the input and add it as a scene item to the destination scene - obs_sceneitem_t *sceneItem = Utils::Obs::ActionHelper::CreateInput(inputName, inputKind, inputSettings, scene, sceneItemEnabled); + OBSSceneItemAutoRelease sceneItem = Utils::Obs::ActionHelper::CreateInput(inputName, inputKind, inputSettings, scene, sceneItemEnabled); if (!sceneItem) return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Creation of the input or scene item failed."); diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index b1d69795..dd78fa8c 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -32,7 +32,7 @@ RequestResult RequestHandler::GetSceneItemId(const Request& request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment); + OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneSource && request.ValidateString("sourceName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -40,7 +40,7 @@ RequestResult RequestHandler::GetSceneItemId(const Request& request) std::string sourceName = request.RequestData["sourceName"]; - obs_sceneitem_t *item = Utils::Obs::SearchHelper::GetSceneItemByName(scene, sourceName); + OBSSceneItemAutoRelease item = Utils::Obs::SearchHelper::GetSceneItemByName(scene, sourceName); if (!item) return RequestResult::Error(RequestStatus::ResourceNotFound, "No scene items were found in the specified scene by that name."); @@ -71,7 +71,7 @@ RequestResult RequestHandler::CreateSceneItem(const Request& request) if (request.RequestData.contains("sceneItemEnabled") && request.RequestData["sceneItemEnabled"].is_boolean()) sceneItemEnabled = request.RequestData["sceneItemEnabled"]; - obs_sceneitem_t *sceneItem = Utils::Obs::ActionHelper::CreateSceneItem(source, scene, sceneItemEnabled); + OBSSceneItemAutoRelease sceneItem = Utils::Obs::ActionHelper::CreateSceneItem(source, scene, sceneItemEnabled); if (!sceneItem) return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene item."); diff --git a/src/utils/Obs.cpp b/src/utils/Obs.cpp index 5216be2d..ef843287 100644 --- a/src/utils/Obs.cpp +++ b/src/utils/Obs.cpp @@ -109,13 +109,12 @@ std::string Utils::Obs::StringHelper::GetMediaInputStateString(obs_source_t *inp std::string Utils::Obs::StringHelper::GetLastReplayBufferFilePath() { - obs_output_t *output = obs_frontend_get_replay_buffer_output(); + OBSOutputAutoRelease output = obs_frontend_get_replay_buffer_output(); calldata_t cd = {0}; proc_handler_t *ph = obs_output_get_proc_handler(output); proc_handler_call(ph, "get_last_replay", &cd); auto ret = calldata_string(&cd, "path"); calldata_free(&cd); - obs_output_release(output); return ret; } @@ -441,7 +440,7 @@ obs_sceneitem_t *Utils::Obs::SearchHelper::GetSceneItemByName(obs_scene_t *scene return nullptr; // Finds first matching scene item in scene, search starts at index 0 - obs_sceneitem_t *ret = obs_scene_find_source(scene, name.c_str()); + OBSSceneItem ret = obs_scene_find_source(scene, name.c_str()); obs_sceneitem_addref(ret); return ret; @@ -450,7 +449,7 @@ obs_sceneitem_t *Utils::Obs::SearchHelper::GetSceneItemByName(obs_scene_t *scene struct CreateSceneItemData { obs_source_t *source; bool sceneItemEnabled; - obs_sceneitem_t *sceneItem; + OBSSceneItem sceneItem; }; void CreateSceneItemHelper(void *_data, obs_scene_t *scene) @@ -476,6 +475,8 @@ obs_sceneitem_t *Utils::Obs::ActionHelper::CreateSceneItem(obs_source_t *source, obs_scene_atomic_update(scene, CreateSceneItemHelper, &data); obs_leave_graphics(); + obs_sceneitem_addref(data.sceneItem); + return data.sceneItem; } @@ -494,7 +495,7 @@ obs_sceneitem_t *Utils::Obs::ActionHelper::CreateInput(std::string inputName, st obs_source_set_monitoring_type(input, OBS_MONITORING_TYPE_MONITOR_ONLY); // Create a scene item for the input - auto ret = CreateSceneItem(input, scene, sceneItemEnabled); + obs_sceneitem_t *ret = CreateSceneItem(input, scene, sceneItemEnabled); // If creation failed, remove the input if (!ret) diff --git a/src/utils/Obs.h b/src/utils/Obs.h index d8b2f7c3..3845c082 100644 --- a/src/utils/Obs.h +++ b/src/utils/Obs.h @@ -67,8 +67,8 @@ namespace Utils { } namespace ActionHelper { - obs_sceneitem_t *CreateSceneItem(obs_source_t *source, obs_scene_t *scene, bool sceneItemEnabled = true); - obs_sceneitem_t *CreateInput(std::string inputName, std::string inputKind, obs_data_t *inputSettings, obs_scene_t *scene, bool sceneItemEnabled = true); + obs_sceneitem_t *CreateSceneItem(obs_source_t *source, obs_scene_t *scene, bool sceneItemEnabled = true); // Increments ref. Use OBSSceneItemAutoRelease + obs_sceneitem_t *CreateInput(std::string inputName, std::string inputKind, obs_data_t *inputSettings, obs_scene_t *scene, bool sceneItemEnabled = true); // Increments ref. Use OBSSceneItemAutoRelease } } }