From 5aca95f3d22391c4b153d681b91107365bd702ae Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 19 Aug 2025 16:29:52 +0200 Subject: [PATCH] neteja de temporals al acabar --- source/resource.cpp | 33 +++++++++++++++++++++++++++------ source/resource.h | 4 ++++ source/text.cpp | 1 + 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/source/resource.cpp b/source/resource.cpp index 4d55df7..6e5dd65 100644 --- a/source/resource.cpp +++ b/source/resource.cpp @@ -5,9 +5,10 @@ #include // Para find_if, max, find #include // Para array #include // Para exit, getenv +#include // Para filesystem::remove, filesystem::exists +#include // Para ofstream #include // Para runtime_error #include // Para move -#include // Para ofstream #include "asset.h" // Para Asset #include "color.h" // Para Color @@ -25,7 +26,7 @@ struct JA_Sound_t; // lines 12-12 // Helper para cargar archivos de audio desde pack o filesystem namespace { - std::string createTempAudioFile(const std::string& file_path) { + std::string createTempAudioFile(const std::string& file_path, std::vector& temp_files_tracker) { auto resource_data = ResourceHelper::loadFile(file_path); if (!resource_data.empty()) { // Crear archivo temporal @@ -43,6 +44,10 @@ namespace { } temp_file.write(reinterpret_cast(resource_data.data()), resource_data.size()); temp_file.close(); + + // Agregar a la lista de archivos temporales para limpieza posterior + temp_files_tracker.push_back(temp_path); + return temp_path; } return file_path; // Usar ruta original si no está en pack @@ -83,6 +88,7 @@ Resource::Resource(LoadingMode mode) // Destructor Resource::~Resource() { + cleanupTempAudioFiles(); clear(); } @@ -321,7 +327,7 @@ auto Resource::loadSoundLazy(const std::string &name) -> JA_Sound_t * { auto sound_list = Asset::get()->getListByType(Asset::Type::SOUND); for (const auto &file : sound_list) { if (getFileName(file) == name) { - std::string audio_path = createTempAudioFile(file); + std::string audio_path = createTempAudioFile(file, Resource::get()->temp_audio_files_); return JA_LoadSound(audio_path.c_str()); } } @@ -335,7 +341,7 @@ auto Resource::loadMusicLazy(const std::string &name) -> JA_Music_t * { auto music_list = Asset::get()->getListByType(Asset::Type::MUSIC); for (const auto &file : music_list) { if (getFileName(file) == name) { - std::string audio_path = createTempAudioFile(file); + std::string audio_path = createTempAudioFile(file, Resource::get()->temp_audio_files_); return JA_LoadMusic(audio_path.c_str()); } } @@ -478,7 +484,7 @@ void Resource::loadSounds() { auto name = getFileName(l); updateLoadingProgress(name); #ifndef NO_AUDIO - std::string audio_path = createTempAudioFile(l); + std::string audio_path = createTempAudioFile(l, temp_audio_files_); sounds_.emplace_back(name, JA_LoadSound(audio_path.c_str())); #else sounds_.emplace_back(name, nullptr); @@ -497,7 +503,7 @@ void Resource::loadMusics() { auto name = getFileName(l); updateLoadingProgress(name); #ifndef NO_AUDIO - std::string audio_path = createTempAudioFile(l); + std::string audio_path = createTempAudioFile(l, temp_audio_files_); musics_.emplace_back(name, JA_LoadMusic(audio_path.c_str())); #else musics_.emplace_back(name, nullptr); @@ -865,3 +871,18 @@ void Resource::updateLoadingProgress(std::string name) { void Resource::updateProgressBar() { loading_full_rect_.w = loading_wired_rect_.w * loading_count_.getPercentage(); } + +// Limpia archivos temporales de audio +void Resource::cleanupTempAudioFiles() { + for (const auto& temp_path : temp_audio_files_) { + try { + if (std::filesystem::exists(temp_path)) { + std::filesystem::remove(temp_path); + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Removed temp audio file: %s", temp_path.c_str()); + } + } catch (const std::exception& e) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to remove temp audio file %s: %s", temp_path.c_str(), e.what()); + } + } + temp_audio_files_.clear(); +} diff --git a/source/resource.h b/source/resource.h index 187900b..f08291f 100644 --- a/source/resource.h +++ b/source/resource.h @@ -128,6 +128,9 @@ class Resource { std::string loading_resource_name_; // Nombre del recurso que se está cargando SDL_FRect loading_wired_rect_; SDL_FRect loading_full_rect_; + + // --- Archivos temporales --- + std::vector temp_audio_files_; // Rutas de archivos temporales de audio para limpieza // --- Métodos internos de carga y gestión --- void loadSounds(); // Carga los sonidos @@ -147,6 +150,7 @@ class Resource { void load(); // Carga todos los recursos void clearSounds(); // Vacía el vector de sonidos void clearMusics(); // Vacía el vector de músicas + void cleanupTempAudioFiles(); // Limpia archivos temporales de audio // --- Métodos para carga perezosa --- void initResourceLists(); // Inicializa las listas de recursos sin cargar el contenido diff --git a/source/text.cpp b/source/text.cpp index b78067f..9f950f8 100644 --- a/source/text.cpp +++ b/source/text.cpp @@ -4,6 +4,7 @@ #include // Para basic_ifstream, basic_istream, basic_ostream, operator<<, endl, ifstream #include // Para cerr +#include // Para istringstream #include // Para runtime_error #include // Para string_view