| version 1.7, 2005/03/29 06:50:38 | version 1.14, 2011/02/04 01:10:14 | 
| Line 3 | Line 3 | 
 | #include        "dosio.h" | #include        "dosio.h" | 
 | #include        "textfile.h" | #include        "textfile.h" | 
 | #include        "midiout.h" | #include        "midiout.h" | 
 |  | #if defined(SUPPORT_ARC) | 
 |  | #include        "arc.h" | 
 |  | #endif | 
 |  |  | 
 |  |  | 
 | #define CFG_MAXAMP              400 | #define CFG_MAXAMP              400 | 
| Line 36  static const OEMCHAR str_env[] = OEMTEXT | Line 39  static const OEMCHAR str_env[] = OEMTEXT | 
 | static const OEMCHAR str_loop[] = OEMTEXT("loop"); | static const OEMCHAR str_loop[] = OEMTEXT("loop"); | 
 | static const OEMCHAR str_tail[] = OEMTEXT("tail"); | static const OEMCHAR str_tail[] = OEMTEXT("tail"); | 
 | static const OEMCHAR file_timiditycfg[] = OEMTEXT("timidity.cfg"); | static const OEMCHAR file_timiditycfg[] = OEMTEXT("timidity.cfg"); | 
 |  | static const OEMCHAR str_basedir[] = OEMTEXT("${basedir}"); | 
 |  |  | 
 |  |  | 
| static void pathadd(MIDIMOD mod, const OEMCHAR *path) { | static void VERMOUTHCL pathadd(MIDIMOD mod, const OEMCHAR *path) { | 
 |  |  | 
 | _PATHLIST       pl; | _PATHLIST       pl; | 
 | PATHLIST        p; | PATHLIST        p; | 
| Line 49  static void pathadd(MIDIMOD mod, const O | Line 53  static void pathadd(MIDIMOD mod, const O | 
 | // separator change! | // separator change! | 
 | file_catname(pl.path, path, NELEMENTS(pl.path)); | file_catname(pl.path, path, NELEMENTS(pl.path)); | 
 | if (path[0]) { | if (path[0]) { | 
| file_setseparator(pl.path, NELEMENTS(pl.path)); | #if defined(SUPPORT_ARC) | 
|  | if (milstr_chr(pl.path, '#') == NULL) | 
|  | #endif | 
|  | file_setseparator(pl.path, NELEMENTS(pl.path)); | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 67  static void pathadd(MIDIMOD mod, const O | Line 74  static void pathadd(MIDIMOD mod, const O | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void pathaddex(MIDIMOD mod, const OEMCHAR *path) { | static void VERMOUTHCL pathaddex(MIDIMOD mod, const OEMCHAR *path) { | 
 |  |  | 
 | OEMCHAR _path[MAX_PATH]; | OEMCHAR _path[MAX_PATH]; | 
 |  |  | 
| if (milstr_memcmp(path, OEMTEXT("${basedir}"))) { | if (milstr_memcmp(path, str_basedir)) { | 
 | pathadd(mod, path); | pathadd(mod, path); | 
 | } | } | 
 | else { | else { | 
| Line 82  static void pathaddex(MIDIMOD mod, const | Line 89  static void pathaddex(MIDIMOD mod, const | 
 | } | } | 
 | } | } | 
 |  |  | 
| static int cfggetarg(OEMCHAR *str, OEMCHAR *arg[], int maxarg) { | static int VERMOUTHCL cfggetarg(OEMCHAR *str, OEMCHAR *arg[], int maxarg) { | 
 |  |  | 
 | int             ret; | int             ret; | 
 | BOOL    quot; | BOOL    quot; | 
| Line 134  cga_done: | Line 141  cga_done: | 
 | return(ret); | return(ret); | 
 | } | } | 
 |  |  | 
| static OEMCHAR *seachr(const OEMCHAR *str, OEMCHAR sepa) { | static OEMCHAR *VERMOUTHCL seachr(const OEMCHAR *str, OEMCHAR sepa) { | 
 |  |  | 
 | OEMCHAR c; | OEMCHAR c; | 
 |  |  | 
| Line 156  enum { | Line 163  enum { | 
 | VAL_SIGN        = 2 | VAL_SIGN        = 2 | 
 | }; | }; | 
 |  |  | 
| static BRESULT cfggetval(const OEMCHAR *str, int *val) { | static BRESULT VERMOUTHCL cfggetval(const OEMCHAR *str, int *val) { | 
 |  |  | 
 | int             ret; | int             ret; | 
 | int             flag; | int             flag; | 
| Line 201  static BRESULT cfggetval(const OEMCHAR * | Line 208  static BRESULT cfggetval(const OEMCHAR * | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| static void settone(MIDIMOD mod, int bank, int argc, OEMCHAR *argv[]) { | static void VERMOUTHCL settone(MIDIMOD mod, int bank, int argc, | 
|  | OEMCHAR *argv[]) { | 
 |  |  | 
 | int             val; | int             val; | 
 | TONECFG tone; | TONECFG tone; | 
| Line 325  static void settone(MIDIMOD mod, int ban | Line 333  static void settone(MIDIMOD mod, int ban | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| BRESULT cfgfile_getfile(MIDIMOD mod, const OEMCHAR *filename, | BRESULT VERMOUTHCL midimod_getfile(MIDIMOD mod, const OEMCHAR *filename, | 
 | OEMCHAR *path, int size) { | OEMCHAR *path, int size) { | 
 |  |  | 
 | PATHLIST        p; | PATHLIST        p; | 
| Line 339  BRESULT cfgfile_getfile(MIDIMOD mod, con | Line 347  BRESULT cfgfile_getfile(MIDIMOD mod, con | 
 | while(p) { | while(p) { | 
 | file_cpyname(path, p->path, size); | file_cpyname(path, p->path, size); | 
 | file_catname(path, filename, size); | file_catname(path, filename, size); | 
 |  | #if defined(SUPPORT_ARC) | 
 |  | attr = arcex_attr(path); | 
 |  | #else | 
 | attr = file_attr(path); | attr = file_attr(path); | 
 |  | #endif | 
 | if (attr != -1) { | if (attr != -1) { | 
 | return(SUCCESS); | return(SUCCESS); | 
 | } | } | 
| Line 350  fpgf_exit: | Line 362  fpgf_exit: | 
 | return(FAILURE); | return(FAILURE); | 
 | } | } | 
 |  |  | 
| BRESULT cfgfile_load(MIDIMOD mod, const OEMCHAR *filename, int depth) { | static BRESULT VERMOUTHCL cfgfile_load(MIDIMOD mod, const OEMCHAR *filename, | 
|  | int depth) { | 
 |  |  | 
 | TEXTFILEH       tfh; | TEXTFILEH       tfh; | 
 | OEMCHAR         buf[1024]; | OEMCHAR         buf[1024]; | 
| Line 364  BRESULT cfgfile_load(MIDIMOD mod, const | Line 377  BRESULT cfgfile_load(MIDIMOD mod, const | 
 | bank = -1; | bank = -1; | 
 |  |  | 
 | if ((depth >= 16) || | if ((depth >= 16) || | 
| (cfgfile_getfile(mod, filename, buf, NELEMENTS(buf)) != SUCCESS)) { | (midimod_getfile(mod, filename, buf, NELEMENTS(buf)) != SUCCESS)) { | 
 | goto cfl_err; | goto cfl_err; | 
 | } | } | 
| //      TRACEOUT(("open: %s", buf)); | // TRACEOUT(("open: %s", buf)); | 
 | tfh = textfile_open(buf, 0x1000); | tfh = textfile_open(buf, 0x1000); | 
 | if (tfh == NULL) { | if (tfh == NULL) { | 
 | goto cfl_err; | goto cfl_err; | 
| Line 429  cfl_err: | Line 442  cfl_err: | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| MIDIMOD midimod_create(UINT samprate) { | VEXTERN MIDIMOD VEXPORT midimod_create(UINT samprate) { | 
 |  |  | 
 | UINT    size; | UINT    size; | 
 | MIDIMOD ret; | MIDIMOD ret; | 
| Line 448  MIDIMOD midimod_create(UINT samprate) { | Line 461  MIDIMOD midimod_create(UINT samprate) { | 
 | ret->tone[1] = ret->tone[0] + 128; | ret->tone[1] = ret->tone[0] + 128; | 
 | ret->tonecfg[0] = (TONECFG)(ret->tone[1] + 128); | ret->tonecfg[0] = (TONECFG)(ret->tone[1] + 128); | 
 | ret->tonecfg[1] = ret->tonecfg[0] + 128; | ret->tonecfg[1] = ret->tonecfg[0] + 128; | 
| ret->pathtbl = listarray_new(sizeof(_PATHLIST), 64); | ret->pathtbl = listarray_new(sizeof(_PATHLIST), 16); | 
 | pathadd(ret, NULL); | pathadd(ret, NULL); | 
 | pathadd(ret, file_getcd(str_null)); | pathadd(ret, file_getcd(str_null)); | 
 | ret->namelist = listarray_new(MAX_NAME, 128); | ret->namelist = listarray_new(MAX_NAME, 128); | 
| Line 461  MIDIMOD midimod_create(UINT samprate) { | Line 474  MIDIMOD midimod_create(UINT samprate) { | 
 | if (r != SUCCESS) { | if (r != SUCCESS) { | 
 | goto mmcre_err2; | goto mmcre_err2; | 
 | } | } | 
 |  | midimod_lock(ret); | 
 | return(ret); | return(ret); | 
 |  |  | 
 | mmcre_err2: | mmcre_err2: | 
| Line 472  mmcre_err1: | Line 486  mmcre_err1: | 
 | return(NULL); | return(NULL); | 
 | } | } | 
 |  |  | 
| void midimod_destroy(MIDIMOD hdl) { | void VERMOUTHCL midimod_lock(MIDIMOD mod) { | 
|  |  | 
|  | mod->lockcount++; | 
|  | } | 
|  |  | 
|  | void VERMOUTHCL midimod_unlock(MIDIMOD mod) { | 
 |  |  | 
 | UINT    r; | UINT    r; | 
 | TONECFG bank; | TONECFG bank; | 
 |  |  | 
| if (hdl) { | if (!mod->lockcount) { | 
| r = 128; | return; | 
| do { | } | 
| r--; | mod->lockcount--; | 
| inst_bankfree(hdl, r); | if (mod->lockcount) { | 
| } while(r > 0); | return; | 
| for (r=2; r<(MIDI_BANKS*2); r++) { | } | 
| bank = hdl->tonecfg[r]; |  | 
| if (bank) { | r = 128; | 
| _MFREE(bank); | do { | 
| } | r--; | 
|  | inst_bankfree(mod, r); | 
|  | } while(r > 0); | 
|  | for (r=2; r<(MIDI_BANKS*2); r++) { | 
|  | bank = mod->tonecfg[r]; | 
|  | if (bank) { | 
|  | _MFREE(bank); | 
 | } | } | 
 | listarray_destroy(hdl->namelist); |  | 
 | listarray_destroy(hdl->pathtbl); |  | 
 | _MFREE(hdl); |  | 
 | } | } | 
 |  | listarray_destroy(mod->namelist); | 
 |  | listarray_destroy(mod->pathtbl); | 
 |  | _MFREE(mod); | 
 |  | } | 
 |  |  | 
 |  | VEXTERN void VEXPORT midimod_destroy(MIDIMOD mod) { | 
 |  |  | 
 |  | if (mod) { | 
 |  | midimod_unlock(mod); | 
 |  | } | 
 |  | } | 
 |  |  | 
 |  | VEXTERN BRESULT VEXPORT midimod_cfgload(MIDIMOD mod, | 
 |  | const OEMCHAR *filename) { | 
 |  |  | 
 |  | return(cfgfile_load(mod, filename, 0)); | 
 | } | } | 
 |  |  | 
| void midimod_loadprogram(MIDIMOD hdl, UINT num) { | VEXTERN void VEXPORT midimod_loadprogram(MIDIMOD mod, UINT num) { | 
 |  |  | 
 | UINT    bank; | UINT    bank; | 
 |  |  | 
| if (hdl != NULL) { | if (mod != NULL) { | 
 | bank = (num >> 8) & 0x7f; | bank = (num >> 8) & 0x7f; | 
 | num &= 0x7f; | num &= 0x7f; | 
| if (inst_singleload(hdl, bank << 1, num) != MIDIOUT_SUCCESS) { | if (inst_singleload(mod, bank << 1, num) != MIDIOUT_SUCCESS) { | 
| inst_singleload(hdl, 0, num); | inst_singleload(mod, 0, num); | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  |  | 
| void midimod_loadrhythm(MIDIMOD hdl, UINT num) { | VEXTERN void VEXPORT midimod_loadrhythm(MIDIMOD mod, UINT num) { | 
 |  |  | 
 | UINT    bank; | UINT    bank; | 
 |  |  | 
| if (hdl != NULL) { | if (mod != NULL) { | 
 | bank = (num >> 8) & 0x7f; | bank = (num >> 8) & 0x7f; | 
 | num &= 0x7f; | num &= 0x7f; | 
| if (inst_singleload(hdl, (bank << 1) + 1, num) != MIDIOUT_SUCCESS) { | if (inst_singleload(mod, (bank << 1) + 1, num) != MIDIOUT_SUCCESS) { | 
| inst_singleload(hdl, 1, num); | inst_singleload(mod, 1, num); | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  |  | 
| void midimod_loadgm(MIDIMOD hdl) { | VEXTERN void VEXPORT midimod_loadgm(MIDIMOD mod) { | 
 |  |  | 
| if (hdl) { | if (mod) { | 
| inst_bankload(hdl, 0); | inst_bankload(mod, 0); | 
| inst_bankload(hdl, 1); | inst_bankload(mod, 1); | 
 | } | } | 
 | } | } | 
 |  |  | 
| void midimod_loadall(MIDIMOD hdl) { | VEXTERN void VEXPORT midimod_loadall(MIDIMOD mod) { | 
 |  |  | 
 | UINT    b; | UINT    b; | 
 |  |  | 
| if (hdl) { | if (mod) { | 
|  | for (b=0; b<(MIDI_BANKS*2); b++) { | 
|  | inst_bankload(mod, b); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | VEXTERN void VEXPORT midimod_loadallex(MIDIMOD mod, FNMIDIOUTLAEXCB cb, | 
|  | void *userdata) { | 
|  |  | 
|  | MIDIOUTLAEXPARAM param; | 
|  | UINT    b; | 
|  |  | 
|  | if (mod) { | 
|  | ZeroMemory(¶m, sizeof(param)); | 
|  | param.userdata = userdata; | 
|  | for (b=0; b<(MIDI_BANKS*2); b++) { | 
|  | param.totaltones += inst_gettones(mod, b); | 
|  | } | 
 | for (b=0; b<(MIDI_BANKS*2); b++) { | for (b=0; b<(MIDI_BANKS*2); b++) { | 
| inst_bankload(hdl, b); | param.bank = b; | 
|  | inst_bankloadex(mod, b, cb, ¶m); | 
 | } | } | 
 | } | } | 
 | } | } |