| version 1.7, 2005/03/29 06:50:38 | version 1.9, 2006/12/16 09:43:24 | 
| 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 pathadd(MIDIMOD mod, const OEMCHAR *path) { | 
| 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 71  static void pathaddex(MIDIMOD mod, const | Line 78  static void pathaddex(MIDIMOD mod, const | 
 |  |  | 
 | 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 339  BRESULT cfgfile_getfile(MIDIMOD mod, con | Line 346  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 429  cfl_err: | Line 440  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 459  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 472  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 484  mmcre_err1: | 
 | return(NULL); | return(NULL); | 
 | } | } | 
 |  |  | 
| void midimod_destroy(MIDIMOD hdl) { | void midimod_lock(MIDIMOD hdl) { | 
|  |  | 
|  | hdl->lockcount++; | 
|  | } | 
|  |  | 
|  | void 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 void VEXPORT midimod_loadprogram(MIDIMOD hdl, UINT num) { | 
 |  |  | 
 | UINT    bank; | UINT    bank; | 
 |  |  | 
| Line 508  void midimod_loadprogram(MIDIMOD hdl, UI | Line 538  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 521  void midimod_loadrhythm(MIDIMOD hdl, UIN | Line 551  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 529  void midimod_loadgm(MIDIMOD hdl) { | Line 559  void midimod_loadgm(MIDIMOD hdl) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| void midimod_loadall(MIDIMOD hdl) { | VEXTERN void VEXPORT midimod_loadall(MIDIMOD hdl) { | 
 |  |  | 
 | UINT    b; | UINT    b; | 
 |  |  | 
| Line 540  void midimod_loadall(MIDIMOD hdl) { | Line 570  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); | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  |  |