diff --git a/src/sound/i_soundfont.h b/src/sound/i_soundfont.h index de1967950..2b470c282 100644 --- a/src/sound/i_soundfont.h +++ b/src/sound/i_soundfont.h @@ -30,7 +30,7 @@ protected: // This is only doable for loose config files that get set as sound fonts. All other cases read from a contained environment where this does not apply. bool mAllowAbsolutePaths = false; // This has only meaning if being run on a platform with a case sensitive file system and loose files. - // When reading from an archive it will always be case insensitive, just like the lump manager (since it repurposes the same implementation.) + // When reading from an archive it will always be case insensitive, just like the lump manager. bool mCaseSensitivePaths = false; TArray mPaths; @@ -62,7 +62,7 @@ class FSF2Reader : public FSoundFontReader FString mFilename; public: FSF2Reader(const char *filename); - virtual FileReader *FSF2Reader::OpenMainConfigFile() override; + virtual FileReader *OpenMainConfigFile() override; virtual FileReader *OpenFile(const char *name) override; }; @@ -108,7 +108,7 @@ public: //========================================================================== // -// This one gets ugly... +// // //========================================================================== diff --git a/src/sound/timiditypp/common.cpp b/src/sound/timiditypp/common.cpp index 8ea7eb05d..20cebc616 100644 --- a/src/sound/timiditypp/common.cpp +++ b/src/sound/timiditypp/common.cpp @@ -132,134 +132,26 @@ double flt_rand() return (int)pr_rnd.GenRand_Real1(); } -PathList::PathList() +struct timidity_file *open_file(const char *name, FSoundFontReader *sfreader) { -} - -/* This adds a directory to the path list */ -void PathList::addPath(const char *str) -{ - if (*str == 0) return; - for (size_t i = 0; i < paths.size(); i++) - { - if (pathcmp(paths[i].c_str(), str, 0) == 0) - { - // move string to the back. - std::string ss = paths[i]; - paths.erase(paths.begin() + i); - paths.push_back(ss); - return; - } - } - paths.push_back(str); -} - -int PathList::pathcmp(const char *p1, const char *p2, int ignore_case) -{ - int c1, c2; - -#ifdef _WIN32 - ignore_case = 1; /* Always ignore the case */ -#endif - - do { - c1 = *p1++ & 0xff; - c2 = *p2++ & 0xff; - if (ignore_case) - { - c1 = tolower(c1); - c2 = tolower(c2); - } - if (c1 == '/') c1 = *p1 ? 0x100 : 0; - if (c1 == '/') c2 = *p2 ? 0x100 : 0; - } while (c1 == c2 && c1 /* && c2 */); - - return c1 - c2; -} - -FileReader *PathList::tryOpenPath(const char *name, bool ismain) -{ - FileReader *fp; - int lumpnum; - - if (ismain) - { - tppPathExpander.openmode = PathExpander::OM_FILEORLUMP; - tppPathExpander.clearPathlist(); -#ifdef _WIN32 - tppPathExpander.addToPathlist("C:\\TIMIDITY"); - tppPathExpander.addToPathlist("\\TIMIDITY"); - tppPathExpander.addToPathlist(progdir); -#else - tppPathExpander.addToPathlist("/usr/local/lib/timidity"); - tppPathExpander.addToPathlist("/etc/timidity"); - tppPathExpander.addToPathlist("/etc"); -#endif - } - - if (!(fp = tppPathExpander.openFileReader(name, &lumpnum))) - return NULL; - - if (ismain) - { - if (lumpnum > 0) - { - tppPathExpander.openmode = PathExpander::OM_LUMP; - tppPathExpander.clearPathlist(); // when reading from a PK3 we don't want to use any external path - } - else - { - tppPathExpander.openmode = PathExpander::OM_FILE; - } - } - return fp; -} - -std::pair PathList::openFile(const char *name, bool ismainfile) -{ - - if (name && *name) - { - /* First try the given name */ - - if (!IsAbsPath(name)) - { - for (int i = (int)paths.size() - 1; i >= 0; i--) - { - std::string s = paths[i]; - auto c = s.at(s.length() - 1); - if (c != '/' && c != '#' && name[0] != '#') - { - s += '/'; - } - s += name; - auto fr = tryOpenPath(s.c_str(), ismainfile); - if (fr!= nullptr) return std::make_pair(fr, s); - } - auto fr = tryOpenPath(name, ismainfile); - if (fr != nullptr) return std::make_pair(fr, name); - } - else - { - // an absolute path is never looked up. - FileReader *fr = new FileReader; - if (fr->Open(name)) - { - return std::make_pair(fr, std::string(name)); - } - delete fr; - } - } - return std::make_pair(nullptr, std::string()); -} - -struct timidity_file *open_file(const char *name, bool ismainfile, PathList &pathList) -{ - auto file = pathList.openFile(name, ismainfile); - if (!file.first) return nullptr; + FileReader *fr; + FString filename; + if (name == nullptr) + { + fr = sfreader->OpenMainConfigFile(); + filename = sfreader->basePath() + "timidity.cfg"; + } + else + { + auto res = sfreader->LookupFile(name); + fr = res.first; + filename = res.second; + } + if (fr == nullptr) return nullptr; + auto tf = new timidity_file; - tf->url = file.first; - tf->filename = file.second; + tf->url = fr; + tf->filename = filename.GetChars(); return tf; } diff --git a/src/sound/timiditypp/common.h b/src/sound/timiditypp/common.h index 5120d2203..d288a1f0f 100644 --- a/src/sound/timiditypp/common.h +++ b/src/sound/timiditypp/common.h @@ -28,45 +28,18 @@ #include #include #include "files.h" +#include "i_soundfont.h" namespace TimidityPlus { -class PathList -{ - std::vector paths; - - FileReader *tryOpenPath(const char *name, bool ismain); - -public: - PathList(); - - void addPath(const char *str); - void clear() - { - paths.resize(1); - } - static int pathcmp(const char *p1, const char *p2, int ignore_case); - std::pair openFile(const char *name, bool ismainfile); - -}; - struct timidity_file { FileReader *url; std::string filename; }; -/* Noise modes for open_file */ -enum -{ - OF_SILENT = 0, - OF_NORMAL = 1, - OF_VERBOSE = 2, -}; - - -extern struct timidity_file *open_file(const char *name, bool, PathList &); +extern struct timidity_file *open_file(const char *name, FSoundFontReader *); extern void close_file(struct timidity_file *tf); extern void skip(struct timidity_file *tf, size_t len); extern char *tf_gets(char *buff, int n, struct timidity_file *tf); @@ -76,7 +49,6 @@ extern long tf_seek(struct timidity_file *tf, long offset, int whence); extern long tf_tell(struct timidity_file *tf); extern int int_rand(int n); /* random [0..n-1] */ double flt_rand(); -extern int check_file_extension(char *filename, char *ext, int decompress); extern void *safe_malloc(size_t count); extern void *safe_realloc(void *old_ptr, size_t new_size); diff --git a/src/sound/timiditypp/configfile.cpp b/src/sound/timiditypp/configfile.cpp index 20c2b5c8b..80b4f54f5 100644 --- a/src/sound/timiditypp/configfile.cpp +++ b/src/sound/timiditypp/configfile.cpp @@ -30,6 +30,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "instrum.h" #include "quantity.h" #include "cmdlib.h" +#include "i_soundfont.h" @@ -618,7 +619,7 @@ char *Instruments::expand_variables(char *string, MBlockList *varbuf, const char } -int Instruments::read_config_file(const char *name, int self, int allow_missing_file, bool ismainfile) +int Instruments::read_config_file(const char *name, int self, int allow_missing_file) { struct timidity_file *tf; char buf[1024], *tmp, *w[MAXWORDS + 1], *cp; @@ -638,7 +639,7 @@ int Instruments::read_config_file(const char *name, int self, int allow_missing_ return READ_CONFIG_RECURSION; } - tf = open_file(name, ismainfile, pathlist); + tf = open_file(name, sfreader); if (tf == NULL) return allow_missing_file ? READ_CONFIG_FILE_NOT_FOUND : READ_CONFIG_ERROR; @@ -1401,7 +1402,7 @@ int Instruments::read_config_file(const char *name, int self, int allow_missing_ continue; } for (i = 1; i < words; i++) - pathlist.addPath(w[i]); + sfreader->AddPath(w[i]); } else if (!strcmp(w[0], "source") || !strcmp(w[0], "trysource")) { @@ -1613,4 +1614,4 @@ int Instruments::read_config_file(const char *name, int self, int allow_missing_ return (errcnt == 0) ? READ_CONFIG_SUCCESS : READ_CONFIG_ERROR; } -} \ No newline at end of file +} diff --git a/src/sound/timiditypp/instrum.cpp b/src/sound/timiditypp/instrum.cpp index a1d7e2446..cbda244ba 100644 --- a/src/sound/timiditypp/instrum.cpp +++ b/src/sound/timiditypp/instrum.cpp @@ -36,6 +36,7 @@ #include "filter.h" #include "quantity.h" #include "freq.h" +#include "i_soundfont.h" namespace TimidityPlus { @@ -54,7 +55,10 @@ Instruments::Instruments() bool Instruments::load(const char *config) { - if (read_config_file(config, 0, 0, true) == RC_OK) + sfreader = sfmanager.OpenSoundFont(config, SF_SF2 | SF_GUS); + if (sfreader == nullptr) return false; + + if (read_config_file(nullptr, 0, 0) == RC_OK) { init_load_soundfont(); set_default_instrument(); @@ -616,7 +620,7 @@ Instrument *Instruments::load_gus_instrument(char *name, ToneBank *bank, int dr, return ip; } /* Open patch file */ - if (!(tf = open_file(name, false, pathlist))) { + if (!(tf = open_file(name, sfreader))) { int name_len, ext_len; static const char *patch_ext[] = { ".pat", 0 }; @@ -631,7 +635,7 @@ Instrument *Instruments::load_gus_instrument(char *name, ToneBank *bank, int dr, continue; /* duplicated ext. */ strcpy((char *)tmp, name); strcat((char *)tmp, patch_ext[i]); - if ((tf = open_file((char *)tmp, false, pathlist))) + if ((tf = open_file((char *)tmp, sfreader))) { noluck = 0; break; @@ -2039,4 +2043,4 @@ void Instruments::recompute_userdrum_altassign(int bank, int group) -} \ No newline at end of file +} diff --git a/src/sound/timiditypp/instrum.h b/src/sound/timiditypp/instrum.h index 06c40a25e..68b5f41c2 100644 --- a/src/sound/timiditypp/instrum.h +++ b/src/sound/timiditypp/instrum.h @@ -31,6 +31,7 @@ #include "sflayer.h" #include "sfitem.h" +class FSoundFontReader; namespace TimidityPlus { @@ -232,7 +233,7 @@ struct SampleImporter; class Instruments { std::string configFileName; - PathList pathlist; + FSoundFontReader *sfreader; ToneBank standard_tonebank, standard_drumset; @@ -549,7 +550,7 @@ public: void PrecacheInstruments(const uint16_t *instruments, int count); - int read_config_file(const char *name, int self, int allow_missing_file, bool ismainfile = false); + int read_config_file(const char *name, int self, int allow_missing_file); void set_default_instrument() { diff --git a/src/sound/timiditypp/smplfile.cpp b/src/sound/timiditypp/smplfile.cpp index 398cc14cb..80c5862e4 100644 --- a/src/sound/timiditypp/smplfile.cpp +++ b/src/sound/timiditypp/smplfile.cpp @@ -278,7 +278,7 @@ int Instruments::import_wave_discriminant(char *sample_file) struct timidity_file *tf; char buf[12]; - if ((tf = open_file(sample_file, false, pathlist)) == NULL) + if ((tf = open_file(sample_file, sfreader)) == NULL) return 1; if (tf_read(buf, 12, 1, tf) != 1 || memcmp(&buf[0], "RIFF", 4) != 0 || memcmp(&buf[8], "WAVE", 4) != 0) @@ -309,7 +309,7 @@ int Instruments::import_wave_load(char *sample_file, Instrument *inst) WAVSamplerChunk samplerc = {0,}; GeneralInstrumentInfo instc; - if ((tf = open_file(sample_file, false, pathlist)) == NULL) + if ((tf = open_file(sample_file, sfreader)) == NULL) return 1; if (tf_read(buf, 12, 1, tf) != 1 || memcmp(&buf[0], "RIFF", 4) != 0 || memcmp(&buf[8], "WAVE", 4) != 0) @@ -551,7 +551,7 @@ int Instruments::import_aiff_discriminant(char *sample_file) struct timidity_file *tf; char buf[12]; - if ((tf = open_file(sample_file, false, pathlist)) == NULL) + if ((tf = open_file(sample_file, sfreader)) == NULL) return 1; if (tf_read(buf, 12, 1, tf) != 1 || memcmp(&buf[0], "FORM", 4) != 0 || memcmp(&buf[8], "AIF", 3) != 0 @@ -591,7 +591,7 @@ int Instruments::import_aiff_load(char *sample_file, Instrument *inst) AIFFLoopInfo loop_info = {0,0,0}; AIFFMarkerData *marker_data; - if ((tf = open_file(sample_file, false, pathlist)) == NULL) + if ((tf = open_file(sample_file, sfreader)) == NULL) return 1; if (tf_read(buf, 12, 1, tf) != 1 || memcmp(&buf[0], "FORM", 4) != 0 || memcmp(&buf[8], "AIF", 3) != 0 @@ -1222,4 +1222,4 @@ static double ConvertFromIeeeExtended(const char *bytes) else return f; } -} \ No newline at end of file +} diff --git a/src/sound/timiditypp/sndfont.cpp b/src/sound/timiditypp/sndfont.cpp index e7f069d4e..c38f8d6ab 100644 --- a/src/sound/timiditypp/sndfont.cpp +++ b/src/sound/timiditypp/sndfont.cpp @@ -265,7 +265,7 @@ void Instruments::init_sf(SFInsts *rec) SFInfo sfinfo; int i; - if ((rec->tf = open_file(rec->fname, false, pathlist)) == NULL) { + if ((rec->tf = open_file(rec->fname, sfreader)) == NULL) { ctl_cmsg(CMSG_ERROR, VERB_NORMAL, "Can't open soundfont file %s", rec->fname); end_soundfont(rec); @@ -362,7 +362,7 @@ Instrument *Instruments::try_load_soundfont(SFInsts *rec, int order, int bank,in if (rec->tf == NULL) { if (rec->fname == NULL) return NULL; - if ((rec->tf = open_file(rec->fname, false, pathlist)) == NULL) + if ((rec->tf = open_file(rec->fname, sfreader)) == NULL) { ctl_cmsg(CMSG_ERROR, VERB_NORMAL, "Can't open soundfont file %s", rec->fname); @@ -1512,4 +1512,4 @@ void Instruments::convert_vibrato(SampleList *vp, LayerTable *tbl) to_msec(tbl->val[SF_delayLfo2]) * 0.001; } -} \ No newline at end of file +}