From bed8a0e040c58baff58f86f00548b4c27713b715 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 10 Aug 2019 12:16:09 +0200 Subject: [PATCH] decoder/sidplay: move global variables to struct SidplayGlobal --- src/decoder/plugins/SidplayDecoderPlugin.cxx | 66 +++++++++++++------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/src/decoder/plugins/SidplayDecoderPlugin.cxx b/src/decoder/plugins/SidplayDecoderPlugin.cxx index d7f65cea5..a76af31f9 100644 --- a/src/decoder/plugins/SidplayDecoderPlugin.cxx +++ b/src/decoder/plugins/SidplayDecoderPlugin.cxx @@ -36,6 +36,7 @@ #include "util/AllocatedString.hxx" #include "util/CharUtil.hxx" #include "util/ByteOrder.hxx" +#include "util/Manual.hxx" #include "Log.hxx" #ifdef HAVE_SIDPLAYFP @@ -67,17 +68,35 @@ static constexpr Domain sidplay_domain("sidplay"); -static SidDatabase *songlength_database; +struct SidplayGlobal { + SidDatabase *songlength_database; -static bool all_files_are_containers; -static unsigned default_songlength; -static std::string default_genre; + bool all_files_are_containers; + unsigned default_songlength; + std::string default_genre; -static bool filter_setting; + bool filter_setting; + +#ifdef HAVE_SIDPLAYFP + uint8_t *kernal = nullptr, *basic = nullptr; +#endif + + explicit SidplayGlobal(const ConfigBlock &block); + + ~SidplayGlobal() noexcept { + delete songlength_database; + +#ifdef HAVE_SIDPLAYFP + delete[] basic; + delete[] kernal; +#endif + } +}; + +static SidplayGlobal *sidplay_global; #ifdef HAVE_SIDPLAYFP static constexpr unsigned rom_size = 8192; -static uint8_t *kernal, *basic = nullptr; static void loadRom(const Path rom_path, uint8_t *dump) { @@ -110,8 +129,8 @@ sidplay_load_songlength_db(const Path path) noexcept return db; } -static bool -sidplay_init(const ConfigBlock &block) +inline +SidplayGlobal::SidplayGlobal(const ConfigBlock &block) { /* read the songlengths database file */ const auto database_path = block.GetPath("songlength_database"); @@ -144,19 +163,19 @@ sidplay_init(const ConfigBlock &block) loadRom(basic_path, basic); } #endif +} +static bool +sidplay_init(const ConfigBlock &block) +{ + sidplay_global = new SidplayGlobal(block); return true; } static void sidplay_finish() noexcept { - delete songlength_database; - -#ifdef HAVE_SIDPLAYFP - delete[] basic; - delete[] kernal; -#endif + delete sidplay_global; } struct SidplayContainerPath { @@ -207,10 +226,10 @@ get_song_length(T &tune) noexcept { assert(tune.getStatus()); - if (songlength_database == nullptr) + if (sidplay_global->songlength_database == nullptr) return SignedSongTime::Negative(); - const auto length = songlength_database->length(tune); + const auto length = sidplay_global->songlength_database->length(tune); if (length < 0) return SignedSongTime::Negative(); @@ -245,15 +264,15 @@ sidplay_file_decode(DecoderClient &client, Path path_fs) tune.selectSong(song_num); auto duration = get_song_length(tune); - if (duration.IsNegative() && default_songlength > 0) - duration = SongTime::FromS(default_songlength); + if (duration.IsNegative() && sidplay_global->default_songlength > 0) + duration = SongTime::FromS(sidplay_global->default_songlength); /* initialize the player */ #ifdef HAVE_SIDPLAYFP sidplayfp player; - player.setRoms(kernal, basic, nullptr); + player.setRoms(sidplay_global->kernal, sidplay_global->basic, nullptr); #else sidplay2 player; #endif @@ -296,7 +315,7 @@ sidplay_file_decode(DecoderClient &client, Path path_fs) } #endif - builder.filter(filter_setting); + builder.filter(sidplay_global->filter_setting); #ifdef HAVE_SIDPLAYFP if (!builder.getStatus()) { FormatWarning(sidplay_domain, @@ -529,8 +548,9 @@ ScanSidTuneInfo(const SidTuneInfo &info, unsigned track, unsigned n_tracks, handler.OnTag(TAG_ARTIST, artist.c_str()); /* genre */ - if (!default_genre.empty()) - handler.OnTag(TAG_GENRE, default_genre.c_str()); + if (!sidplay_global->default_genre.empty()) + handler.OnTag(TAG_GENRE, + sidplay_global->default_genre.c_str()); /* date */ const auto date = GetDateString(info); @@ -598,7 +618,7 @@ sidplay_container_scan(Path path_fs) /* Don't treat sids containing a single tune as containers */ - if(!all_files_are_containers && n_tracks < 2) + if (!sidplay_global->all_files_are_containers && n_tracks < 2) return list; TagBuilder tag_builder;