|
|
| version 1.6, 2005/03/18 09:23:11 | version 1.10, 2006/12/16 12:11:07 |
|---|---|
| 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 int cfggetarg(OEMCHAR *str, OEMCHAR *arg[], int maxarg) { | static void VERMOUTHCL pathaddex(MIDIMOD mod, const OEMCHAR *path) { |
| OEMCHAR _path[MAX_PATH]; | |
| if (milstr_memcmp(path, str_basedir)) { | |
| pathadd(mod, path); | |
| } | |
| else { | |
| file_cpyname(_path, file_getcd(str_null), NELEMENTS(_path)); | |
| file_cutseparator(_path); | |
| file_catname(_path, path + 10, NELEMENTS(_path)); | |
| pathadd(mod, _path); | |
| } | |
| } | |
| static int VERMOUTHCL cfggetarg(OEMCHAR *str, OEMCHAR *arg[], int maxarg) { | |
| int ret; | int ret; |
| BOOL quot; | BOOL quot; |
| Line 119 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 141 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 186 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 310 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 324 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 335 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 349 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)); |
| Line 372 BRESULT cfgfile_load(MIDIMOD mod, const | Line 400 BRESULT cfgfile_load(MIDIMOD mod, const |
| switch(cfg) { | switch(cfg) { |
| case CFG_DIR: | case CFG_DIR: |
| for (i=1; i<argc; i++) { | for (i=1; i<argc; i++) { |
| pathadd(mod, argv[i]); | pathaddex(mod, argv[i]); |
| } | } |
| break; | break; |
| Line 414 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 433 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 446 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 457 mmcre_err1: | Line 486 mmcre_err1: |
| return(NULL); | return(NULL); |
| } | } |
| void midimod_destroy(MIDIMOD hdl) { | void VERMOUTHCL midimod_lock(MIDIMOD hdl) { |
| hdl->lockcount++; | |
| } | |
| void VERMOUTHCL midimod_unlock(MIDIMOD hdl) { | |
| UINT r; | UINT r; |
| TONECFG bank; | TONECFG bank; |
| if (!hdl->lockcount) { | |
| return; | |
| } | |
| hdl->lockcount--; | |
| if (hdl->lockcount) { | |
| return; | |
| } | |
| r = 128; | |
| do { | |
| r--; | |
| inst_bankfree(hdl, r); | |
| } while(r > 0); | |
| for (r=2; r<(MIDI_BANKS*2); r++) { | |
| bank = hdl->tonecfg[r]; | |
| if (bank) { | |
| _MFREE(bank); | |
| } | |
| } | |
| listarray_destroy(hdl->namelist); | |
| listarray_destroy(hdl->pathtbl); | |
| _MFREE(hdl); | |
| } | |
| VEXTERN void VEXPORT midimod_destroy(MIDIMOD hdl) { | |
| if (hdl) { | if (hdl) { |
| r = 128; | midimod_unlock(hdl); |
| do { | |
| r--; | |
| inst_bankfree(hdl, r); | |
| } while(r > 0); | |
| for (r=2; r<(MIDI_BANKS*2); r++) { | |
| bank = hdl->tonecfg[r]; | |
| if (bank) { | |
| _MFREE(bank); | |
| } | |
| } | |
| listarray_destroy(hdl->namelist); | |
| listarray_destroy(hdl->pathtbl); | |
| _MFREE(hdl); | |
| } | } |
| } | } |
| void midimod_loadprogram(MIDIMOD hdl, UINT num) { | VEXTERN BRESULT VEXPORT midimod_cfgload(MIDIMOD hdl, |
| const OEMCHAR *filename) { | |
| return(cfgfile_load(hdl, filename, 0)); | |
| } | |
| VEXTERN void VEXPORT midimod_loadprogram(MIDIMOD hdl, UINT num) { | |
| UINT bank; | UINT bank; |
| Line 493 void midimod_loadprogram(MIDIMOD hdl, UI | Line 546 void midimod_loadprogram(MIDIMOD hdl, UI |
| } | } |
| } | } |
| void midimod_loadrhythm(MIDIMOD hdl, UINT num) { | VEXTERN void VEXPORT midimod_loadrhythm(MIDIMOD hdl, UINT num) { |
| UINT bank; | UINT bank; |
| Line 506 void midimod_loadrhythm(MIDIMOD hdl, UIN | Line 559 void midimod_loadrhythm(MIDIMOD hdl, UIN |
| } | } |
| } | } |
| void midimod_loadgm(MIDIMOD hdl) { | VEXTERN void VEXPORT midimod_loadgm(MIDIMOD hdl) { |
| if (hdl) { | if (hdl) { |
| inst_bankload(hdl, 0); | inst_bankload(hdl, 0); |
| Line 514 void midimod_loadgm(MIDIMOD hdl) { | Line 567 void midimod_loadgm(MIDIMOD hdl) { |
| } | } |
| } | } |
| void midimod_loadall(MIDIMOD hdl) { | VEXTERN void VEXPORT midimod_loadall(MIDIMOD hdl) { |
| UINT b; | UINT b; |
| Line 525 void midimod_loadall(MIDIMOD hdl) { | Line 578 void midimod_loadall(MIDIMOD hdl) { |
| } | } |
| } | } |
| VEXTERN void VEXPORT midimod_loadallex(MIDIMOD hdl, FNMIDIOUTLAEXCB cb, void *userdata) { | |
| MIDIOUTLAEXPARAM param; | |
| UINT b; | |
| if (hdl) { | |
| ZeroMemory(¶m, sizeof(param)); | |
| param.userdata = userdata; | |
| for (b=0; b<(MIDI_BANKS*2); b++) { | |
| param.totaltones += inst_gettones(hdl, b); | |
| } | |
| for (b=0; b<(MIDI_BANKS*2); b++) { | |
| param.bank = b; | |
| inst_bankloadex(hdl, b, cb, ¶m); | |
| } | |
| } | |
| } | |