diff --git a/Utils.cpp b/Utils.cpp index 0a07662b..dc79809f 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -18,6 +18,7 @@ with this program. If not, see #include "Utils.h" +// Causes memory leaks 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); @@ -31,7 +32,7 @@ obs_data_array_t* Utils::GetSceneItems(obs_source_t *source) { return true; }, items); - obs_scene_release(scene); + //obs_scene_release(scene); // Can cause crashes return items; } @@ -59,7 +60,7 @@ obs_data_t* Utils::GetSceneItemData(obs_sceneitem_t *item) { return data; } - +// Causes memory leaks obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, const char* name) { struct current_search { const char* query; @@ -88,6 +89,8 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, const char* n return true; }, &search); + //obs_scene_release(scene); // Can cause crashes + return search.result; } @@ -96,12 +99,12 @@ obs_data_array_t* Utils::GetScenes() { obs_frontend_get_scenes(&sceneList); obs_data_array_t* scenes = obs_data_array_create(); - for (size_t i = 0; i < (&sceneList)->sources.num; i++) { - obs_source_t* scene = (&sceneList)->sources.array[i]; + for (size_t i = 0; i < sceneList.sources.num; i++) { + obs_source_t* scene = sceneList.sources.array[i]; obs_data_array_push_back(scenes, GetSceneData(scene)); } - obs_frontend_source_list_free(&sceneList); + obs_frontend_source_list_free(&sceneList); return scenes; } @@ -112,4 +115,4 @@ obs_data_t* Utils::GetSceneData(obs_source *source) { obs_data_set_array(sceneData, "sources", GetSceneItems(source)); return sceneData; -} \ No newline at end of file +} diff --git a/WSRequestHandler.cpp b/WSRequestHandler.cpp index 6689c266..2e7035c4 100644 --- a/WSRequestHandler.cpp +++ b/WSRequestHandler.cpp @@ -90,6 +90,8 @@ void WSRequestHandler::processTextMessage(QString textMessage) { else { SendErrorResponse("invalid request type"); } + + obs_data_release(_requestData); } void WSRequestHandler::socketDisconnected() { @@ -197,30 +199,38 @@ void WSRequestHandler::HandleSetCurrentScene(WSRequestHandler *owner) { obs_source_release(source); } +// Indirectly causes memory leaks void WSRequestHandler::HandleGetCurrentScene(WSRequestHandler *owner) { - obs_source_t *source = obs_frontend_get_current_scene(); - const char *name = obs_source_get_name(source); + obs_source_t *current_scene = obs_frontend_get_current_scene(); + const char *name = obs_source_get_name(current_scene); - obs_data_array_t *scene_items = Utils::GetSceneItems(source); + obs_data_array_t *scene_items = Utils::GetSceneItems(current_scene); // Causes memory leaks obs_data_t *data = obs_data_create(); obs_data_set_string(data, "name", name); obs_data_set_array(data, "sources", scene_items); owner->SendOKResponse(data); + obs_data_release(data); obs_data_array_release(scene_items); - //obs_source_release(source); // causes a source destroy sometimes + obs_source_release(current_scene); } +// Indirectly causes memory leaks void WSRequestHandler::HandleGetSceneList(WSRequestHandler *owner) { + obs_source_t *current_scene = obs_frontend_get_current_scene(); + obs_data_array_t *scenes = Utils::GetScenes(); // Causes memory leaks via GetSceneItems + obs_data_t *data = obs_data_create(); - obs_data_set_string(data, "current-scene", obs_source_get_name(obs_frontend_get_current_scene())); - obs_data_set_array(data, "scenes", Utils::GetScenes()); + obs_data_set_string(data, "current-scene", obs_source_get_name(current_scene)); + obs_data_set_array(data, "scenes", scenes); owner->SendOKResponse(data); - //obs_data_release(data); // da hell ? sometimes causes a crash too, like in GetCurrentScene... + obs_data_release(data); + obs_data_array_release(scenes); + obs_source_release(current_scene); } void WSRequestHandler::HandleSetSourceRender(WSRequestHandler *owner) { @@ -278,35 +288,44 @@ void WSRequestHandler::HandleStartStopRecording(WSRequestHandler *owner) { owner->SendOKResponse(); } +// Causes memory leaks void WSRequestHandler::HandleGetTransitionList(WSRequestHandler *owner) { + obs_source_t *current_transition = obs_frontend_get_current_transition(); obs_frontend_source_list transitionList = {}; obs_frontend_get_transitions(&transitionList); obs_data_array_t* transitions = obs_data_array_create(); - for (size_t i = 0; i < (&transitionList)->sources.num; i++) { - obs_source_t* transition = (&transitionList)->sources.array[i]; + for (size_t i = 0; i < transitionList.sources.num; i++) { + obs_source_t* transition = transitionList.sources.array[i]; obs_data_t *obj = obs_data_create(); obs_data_set_string(obj, "name", obs_source_get_name(transition)); - + obs_data_array_push_back(transitions, obj); } obs_frontend_source_list_free(&transitionList); obs_data_t *response = obs_data_create(); - obs_data_set_string(response, "current-transition", obs_source_get_name(obs_frontend_get_current_transition())); + obs_data_set_string(response, "current-transition", obs_source_get_name(current_transition)); obs_data_set_array(response, "transitions", transitions); + owner->SendOKResponse(response); obs_data_release(response); + obs_data_array_release(transitions); + obs_source_release(current_transition); } void WSRequestHandler::HandleGetCurrentTransition(WSRequestHandler *owner) { + obs_source_t *current_transition = obs_frontend_get_current_transition(); + obs_data_t *response = obs_data_create(); - obs_data_set_string(response, "name", obs_source_get_name(obs_frontend_get_current_transition())); + obs_data_set_string(response, "name", obs_source_get_name(current_transition)); + owner->SendOKResponse(response); obs_data_release(response); + obs_source_release(current_transition); } void WSRequestHandler::HandleSetCurrentTransition(WSRequestHandler *owner) { diff --git a/WSRequestHandler.h b/WSRequestHandler.h index 58575475..f776c646 100644 --- a/WSRequestHandler.h +++ b/WSRequestHandler.h @@ -73,4 +73,4 @@ class WSRequestHandler : public QObject static void HandleSetCurrentTransition(WSRequestHandler *owner); }; -#endif // WSPROTOCOL_H \ No newline at end of file +#endif // WSPROTOCOL_H