diff options
author | Max Kellermann <max@musicpd.org> | 2016-11-22 09:33:52 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2016-11-22 09:33:52 +0100 |
commit | 0abee77e62636cceec966bda77696b16ab1ed96b (patch) | |
tree | 271561c3e9a3b8f03612a2831aa65fe090ae65a4 /src/decoder | |
parent | 114fcee2ae897bd5dd740cb04a3f12b7ae60cb3f (diff) |
decoder/DecoderPlugin: container_scan() returns forward_list<string>
Diffstat (limited to 'src/decoder')
-rw-r--r-- | src/decoder/DecoderPlugin.hxx | 13 | ||||
-rw-r--r-- | src/decoder/plugins/GmeDecoderPlugin.cxx | 31 | ||||
-rw-r--r-- | src/decoder/plugins/SidplayDecoderPlugin.cxx | 32 |
3 files changed, 45 insertions, 31 deletions
diff --git a/src/decoder/DecoderPlugin.hxx b/src/decoder/DecoderPlugin.hxx index c83944b5f..ec24a115f 100644 --- a/src/decoder/DecoderPlugin.hxx +++ b/src/decoder/DecoderPlugin.hxx @@ -22,11 +22,13 @@ #include "Compiler.h" +#include <forward_list> +#include <string> + struct ConfigBlock; class InputStream; struct TagHandler; class Path; -template<typename T> class AllocatedString; class DecoderClient; struct DecoderPlugin { @@ -85,14 +87,13 @@ struct DecoderPlugin { /** * @brief Return a "virtual" filename for subtracks in * container formats like flac - * @param const char* pathname full pathname for the file on fs - * @param const unsigned int tnum track number + * @param path_fs full pathname for the file on fs * - * @return nullptr if there are no multiple files - * a filename for every single track according to tnum (param 2) + * @return an empty list if there are no multiple files + * a filename for every single track; * do not include full pathname here, just the "virtual" file */ - AllocatedString<char> (*container_scan)(Path path_fs, unsigned tnum); + std::forward_list<std::string> (*container_scan)(Path path_fs); /* last element in these arrays must always be a nullptr: */ const char *const*suffixes; diff --git a/src/decoder/plugins/GmeDecoderPlugin.cxx b/src/decoder/plugins/GmeDecoderPlugin.cxx index dd7d58a73..508949ad8 100644 --- a/src/decoder/plugins/GmeDecoderPlugin.cxx +++ b/src/decoder/plugins/GmeDecoderPlugin.cxx @@ -27,16 +27,16 @@ #include "fs/AllocatedPath.hxx" #include "util/ScopeExit.hxx" #include "util/FormatString.hxx" -#include "util/AllocatedString.hxx" #include "util/UriUtil.hxx" #include "util/Domain.hxx" #include "Log.hxx" +#include <gme/gme.h> + #include <assert.h> #include <stdlib.h> #include <string.h> - -#include <gme/gme.h> +#include <stdio.h> #define SUBTUNE_PREFIX "tune_" @@ -103,29 +103,36 @@ ParseContainerPath(Path path_fs) return { path_fs.GetDirectoryName(), track - 1 }; } -static AllocatedString<> -gme_container_scan(Path path_fs, const unsigned int tnum) +static std::forward_list<std::string> +gme_container_scan(Path path_fs) { + std::forward_list<std::string> list; + Music_Emu *emu; const char *gme_err = gme_open_file(path_fs.c_str(), &emu, GME_SAMPLE_RATE); if (gme_err != nullptr) { LogWarning(gme_domain, gme_err); - return nullptr; + return list; } const unsigned num_songs = gme_track_count(emu); gme_delete(emu); /* if it only contains a single tune, don't treat as container */ if (num_songs < 2) - return nullptr; + return list; const char *subtune_suffix = uri_get_suffix(path_fs.c_str()); - if (tnum <= num_songs){ - return FormatString(SUBTUNE_PREFIX "%03u.%s", - tnum, subtune_suffix); - } else - return nullptr; + + auto tail = list.before_begin(); + for (unsigned i = 1; i < num_songs; ++i) { + char track_name[64]; + snprintf(track_name, sizeof(track_name), + "%03u.%s", i, subtune_suffix); + tail = list.emplace_after(tail, track_name); + } + + return list; } static void diff --git a/src/decoder/plugins/SidplayDecoderPlugin.cxx b/src/decoder/plugins/SidplayDecoderPlugin.cxx index b3b122ac3..42a4d595f 100644 --- a/src/decoder/plugins/SidplayDecoderPlugin.cxx +++ b/src/decoder/plugins/SidplayDecoderPlugin.cxx @@ -25,14 +25,11 @@ #include "fs/AllocatedPath.hxx" #include "util/Macros.hxx" #include "util/FormatString.hxx" -#include "util/AllocatedString.hxx" #include "util/Domain.hxx" #include "system/ByteOrder.hxx" #include "system/FatalError.hxx" #include "Log.hxx" -#include <string.h> - #ifdef HAVE_SIDPLAYFP #include <sidplayfp/sidplayfp.h> #include <sidplayfp/SidInfo.h> @@ -49,6 +46,9 @@ #include <sidplay/utils/SidDatabase.h> #endif +#include <string.h> +#include <stdio.h> + #define SUBTUNE_PREFIX "tune_" static constexpr Domain sidplay_domain("sidplay"); @@ -476,12 +476,14 @@ sidplay_scan_file(Path path_fs, return true; } -static AllocatedString<> -sidplay_container_scan(Path path_fs, const unsigned int tnum) +static std::forward_list<std::string> +sidplay_container_scan(Path path_fs) { + std::forward_list<std::string> list; + SidTune tune(path_fs.c_str(), nullptr, true); if (!tune.getStatus()) - return nullptr; + return list; #ifdef HAVE_SIDPLAYFP const SidTuneInfo &info = *tune.getInfo(); @@ -494,14 +496,18 @@ sidplay_container_scan(Path path_fs, const unsigned int tnum) /* Don't treat sids containing a single tune as containers */ if(!all_files_are_containers && n_tracks < 2) - return nullptr; + return list; + + auto tail = list.before_begin(); + for (unsigned i = 1; i < n_tracks; ++i) { + char track_name[32]; + /* Construct container/tune path names, eg. + Delta.sid/tune_001.sid */ + sprintf(track_name, SUBTUNE_PREFIX "%03u.sid", i); + tail = list.emplace_after(tail, track_name); + } - /* Construct container/tune path names, eg. - Delta.sid/tune_001.sid */ - if (tnum <= n_tracks) { - return FormatString(SUBTUNE_PREFIX "%03u.sid", tnum); - } else - return nullptr; + return list; } static const char *const sidplay_suffixes[] = { |