From 97c3472e6e854cc16f04b30f0211da0b9d453b58 Mon Sep 17 00:00:00 2001 From: Andrea Odetti Date: Sun, 28 Nov 2021 19:18:38 +0000 Subject: [PATCH] libretro: support relative paths in m3u playlists. Signed-off-by: Andrea Odetti --- source/frontends/libretro/CMakeLists.txt | 2 ++ source/frontends/libretro/diskcontrol.cpp | 19 +++++++++++-------- source/frontends/libretro/diskcontrol.h | 3 ++- source/frontends/libretro/environment.cpp | 2 -- source/frontends/libretro/environment.h | 2 -- source/frontends/libretro/libretro.cpp | 5 ----- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/source/frontends/libretro/CMakeLists.txt b/source/frontends/libretro/CMakeLists.txt index 514f96841..77c48a9fc 100644 --- a/source/frontends/libretro/CMakeLists.txt +++ b/source/frontends/libretro/CMakeLists.txt @@ -35,6 +35,8 @@ add_library(applewin_libretro SHARED ${HEADER_FILES} ) +target_compile_features(applewin_libretro PUBLIC cxx_std_17) + target_include_directories(applewin_libretro PRIVATE libretro-common/include ) diff --git a/source/frontends/libretro/diskcontrol.cpp b/source/frontends/libretro/diskcontrol.cpp index 2031e40d2..fd98b1f63 100644 --- a/source/frontends/libretro/diskcontrol.cpp +++ b/source/frontends/libretro/diskcontrol.cpp @@ -33,13 +33,15 @@ namespace ra2 bool DiskControl::insertPlaylist(const std::string & filename) { - std::ifstream playlist(filename); + const std::filesystem::path path(filename); + std::ifstream playlist(path); if (!playlist) { return false; } myImages.clear(); + const std::filesystem::path parent = path.parent_path(); std::string line; while (std::getline(playlist, line)) @@ -47,7 +49,12 @@ namespace ra2 // should we trim initial spaces? if (!line.empty() && line[0] != '#') { - myImages.push_back(line); + std::filesystem::path image(line); + if (image.is_relative()) + { + image = parent / image; + } + myImages.push_back(image); } } @@ -227,12 +234,8 @@ namespace ra2 { if (index < myImages.size()) { - size_t pos = myImages[index].rfind('/'); - if (pos == std::string::npos) - { - pos = 0; - } - strncpy(label, myImages[index].c_str() + pos + 1, len); + const std::string filename = myImages[index].filename(); + strncpy(label, filename.c_str(), len); label[len - 1] = 0; return true; } diff --git a/source/frontends/libretro/diskcontrol.h b/source/frontends/libretro/diskcontrol.h index f47be03da..938f75544 100644 --- a/source/frontends/libretro/diskcontrol.h +++ b/source/frontends/libretro/diskcontrol.h @@ -1,5 +1,6 @@ #include #include +#include namespace ra2 { @@ -31,7 +32,7 @@ namespace ra2 static void setInitialPath(unsigned index, const char *path); private: - std::vector myImages; + std::vector myImages; bool myEjected; size_t myIndex; diff --git a/source/frontends/libretro/environment.cpp b/source/frontends/libretro/environment.cpp index d437fbf5b..7b1380f09 100644 --- a/source/frontends/libretro/environment.cpp +++ b/source/frontends/libretro/environment.cpp @@ -25,8 +25,6 @@ namespace ra2 retro_audio_sample_t audio_cb; retro_audio_sample_batch_t audio_batch_cb; - std::string retro_base_directory; - void display_message(const std::string & message) { retro_message rmsg; diff --git a/source/frontends/libretro/environment.h b/source/frontends/libretro/environment.h index 3f55b2cad..40760f851 100644 --- a/source/frontends/libretro/environment.h +++ b/source/frontends/libretro/environment.h @@ -15,8 +15,6 @@ namespace ra2 extern retro_audio_sample_t audio_cb; extern retro_audio_sample_batch_t audio_batch_cb; - extern std::string retro_base_directory; - #define MAX_PADS 1 void display_message(const std::string & message); diff --git a/source/frontends/libretro/libretro.cpp b/source/frontends/libretro/libretro.cpp index c02e49caa..9f44a6498 100644 --- a/source/frontends/libretro/libretro.cpp +++ b/source/frontends/libretro/libretro.cpp @@ -106,11 +106,6 @@ namespace void retro_init(void) { ra2::log_cb(RETRO_LOG_INFO, "RA2: %s\n", __FUNCTION__); - const char *dir = NULL; - if (ra2::environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) - { - ra2::retro_base_directory = dir; - } } void retro_deinit(void)