--- SIDPlayer/src/prefs.cpp 2000/07/28 12:42:30 1.1 +++ SIDPlayer/src/prefs.cpp 2001/01/04 19:54:13 1.2 @@ -28,34 +28,7 @@ #include "prefs.h" -// List of preferences items -prefs_desc prefs_items[] = { - {"victype", TYPE_STRING, false}, // Type number of VIC-II to emulate ("6569", "6567" or "6567R5") - {"sidtype", TYPE_STRING, false}, // Type number of SID to emulate ("6581" or "8580") - {"samplerate", TYPE_INT32, false}, // Audio sample rate in Hz - {"audio16bit", TYPE_BOOLEAN, false}, // 16-bit audio output? - {"stereo", TYPE_BOOLEAN, false}, // Stereo audio output? - {"filters", TYPE_BOOLEAN, false}, // Emulate SID filters? - {"dualsid", TYPE_BOOLEAN, false}, // Emulate 2 SID chips? - {"audioeffect", TYPE_INT32, false}, // Audio effect type (0 = none, 1 = reverb, 2 = spatial) - {"revdelay", TYPE_INT32, false}, // Reverb delay in ms - {"revfeedback", TYPE_INT32, false}, // Reverb feedback (0..0x100 = 0..100%) - {"volume", TYPE_INT32, false}, // Master volume (0..0x100 = 0..100%) - {"v1volume", TYPE_INT32, false}, // Volume voice 1 (0..0x100 = 0..100%) - {"v2volume", TYPE_INT32, false}, // Volume voice 2 (0..0x100 = 0..100%) - {"v3volume", TYPE_INT32, false}, // Volume voice 3 (0..0x100 = 0..100%) - {"v4volume", TYPE_INT32, false}, // Volume sampled voice (0..0x100 = 0..100%) - {"v1pan", TYPE_INT32, false}, // Panning voice 1 (-0x100..0x100 = left..right) - {"v2pan", TYPE_INT32, false}, // Panning voice 2 (-0x100..0x100 = left..right) - {"v3pan", TYPE_INT32, false}, // Panning voice 3 (-0x100..0x100 = left..right) - {"v4pan", TYPE_INT32, false}, // Panning sampled voice (-0x100..0x100 = left..right) - {"dualsep", TYPE_INT32, false}, // Dual-SID stereo separation (0..0x100 = 0..100%) - {"replayfreq", TYPE_INT32, false}, // Frequency at which 6510 replay routine is called in Hz - {NULL, TYPE_END, false} // End of list -}; - - -// Prefs item are stored in a linked list of these nodes +// Prefs items are stored in a linked list of these nodes struct prefs_node { prefs_node *next; const char *name; @@ -65,7 +38,10 @@ struct prefs_node { }; // List of prefs nodes -static prefs_node *the_prefs; +static prefs_node *the_prefs = NULL; + +// Prototypes +static prefs_desc *find_prefs_desc(const char *name); /* @@ -74,31 +50,58 @@ static prefs_node *the_prefs; void PrefsInit(int argc, char **argv) { - // Start with empty list - the_prefs = NULL; - // Set defaults - PrefsAddString("victype", "6569"); - PrefsAddString("sidtype", "6581"); - PrefsAddInt32("samplerate", 44100); - PrefsAddBool("audio16bit", true); - PrefsAddBool("stereo", true); - PrefsAddBool("filters", true); - PrefsAddBool("dualsid", false); - PrefsAddInt32("audioeffect", 2); - PrefsAddInt32("revdelay", 125); - PrefsAddInt32("revfeedback", 0x50); - PrefsAddInt32("volume", 0x100); - PrefsAddInt32("v1volume", 0x100); - PrefsAddInt32("v1pan", -0x40); - PrefsAddInt32("v2volume", 0x100); - PrefsAddInt32("v2pan", 0); - PrefsAddInt32("v3volume", 0x100); - PrefsAddInt32("v3pan", 0x40); - PrefsAddInt32("v4volume", 0x100); - PrefsAddInt32("v4pan", 0); - PrefsAddInt32("dualsep", 0x80); - PrefsAddInt32("replayfreq", 50); + AddPrefsDefaults(); + + // Override prefs with command line arguments + argc--; argv++; + for (; argc>0; argc--, argv++) { + + // Arguments are of the form '--keyword' + if (strlen(*argv) < 3 || argv[0][0] != '-' || argv[0][1] != '-') + continue; + const char *keyword = *argv + 2; + const prefs_desc *d = find_prefs_desc(keyword); + if (d == NULL) { + printf("WARNING: Unrecognized argument '%s'\n", *argv); + continue; + } + + // Add/replace prefs item + switch (d->type) { + case TYPE_STRING: + if (argc < 2) { + printf("WARNING: Argument '%s' must be followed by value\n", *argv); + break; + } + argc--; argv++; + if (d->multiple) + PrefsAddString(keyword, *argv); + else + PrefsReplaceString(keyword, *argv); + break; + + case TYPE_BOOLEAN: + if (argc > 1 && argv[1][0] != '-') { + argc--; argv++; + PrefsReplaceBool(keyword, !strcmp(*argv, "true") || !strcmp(*argv, "on")); + } else + PrefsReplaceBool(keyword, true); + break; + + case TYPE_INT32: + if (argc < 2) { + printf("WARNING: Argument '%s' must be followed by value\n", *argv); + break; + } + argc--; argv++; + PrefsReplaceInt32(keyword, atoi(*argv)); + break; + + default: + break; + } + } } @@ -134,6 +137,11 @@ static prefs_desc *find_prefs_desc(const return NULL; } +static prefs_desc *find_prefs_desc(const char *name) +{ + return find_prefs_desc(name, common_prefs_items); +} + /* * Set prefs items @@ -150,7 +158,7 @@ static void add_data(const char *name, p p->name = strdup(name); p->type = type; p->data = d; - p->desc = find_prefs_desc(p->name, prefs_items); + p->desc = find_prefs_desc(p->name); if (the_prefs) { prefs_node *prev = the_prefs; while (prev->next) @@ -297,7 +305,7 @@ void PrefsRemoveItem(const char *name, i static void set_callback(const char *name, prefs_func f) { - prefs_desc *d = find_prefs_desc(name, prefs_items); + prefs_desc *d = find_prefs_desc(name); if (d == NULL) return; d->func = f;