|
|
| version 1.4, 2005/04/05 09:12:24 | version 1.8, 2011/01/15 18:04:43 |
|---|---|
| Line 11 | Line 11 |
| static const UINT8 cd001[7] = {0x01,'C','D','0','0','1',0x01}; | static const UINT8 cd001[7] = {0x01,'C','D','0','0','1',0x01}; |
| typedef struct { | typedef struct { |
| UINT type; | |
| UINT32 pos; | |
| } CDTRK; | |
| typedef struct { | |
| FILEH fh; | FILEH fh; |
| UINT type; | UINT type; |
| UINT32 lastpos; | UINT trks; |
| CDTRK trk[99]; | _CDTRK trk[100]; |
| OEMCHAR path[MAX_PATH]; | OEMCHAR path[MAX_PATH]; |
| } _CDINFO, *CDINFO; | } _CDINFO, *CDINFO; |
| Line 193 static const OEMCHAR str_audio[] = OEMTE | Line 188 static const OEMCHAR str_audio[] = OEMTE |
| static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path, | static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path, |
| const CDTRK *trk, UINT trks) { | const _CDTRK *trk, UINT trks) { |
| FILEH fh; | FILEH fh; |
| UINT type; | UINT type; |
| long totals; | long totals; |
| CDINFO cdinfo; | CDINFO cdinfo; |
| UINT mediatype; | |
| UINT i; | |
| fh = file_open_rb(path); | fh = file_open_rb(path); |
| if (fh == FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| Line 220 static BRESULT openimg(SXSIDEV sxsi, con | Line 217 static BRESULT openimg(SXSIDEV sxsi, con |
| ZeroMemory(cdinfo, sizeof(_CDINFO)); | ZeroMemory(cdinfo, sizeof(_CDINFO)); |
| cdinfo->fh = fh; | cdinfo->fh = fh; |
| cdinfo->type = type; | cdinfo->type = type; |
| cdinfo->lastpos = totals; | |
| if ((trk != NULL) && (trks != 0)) { | if ((trk != NULL) && (trks != 0)) { |
| trks = min(trks, NELEMENTS(cdinfo->trk)); | trks = min(trks, NELEMENTS(cdinfo->trk) - 1); |
| CopyMemory(cdinfo->trk, trk, trks * sizeof(CDTRK)); | CopyMemory(cdinfo->trk, trk, trks * sizeof(_CDTRK)); |
| } | } |
| else { | else { |
| cdinfo->trk[0].type = 0x14; | cdinfo->trk[0].type = 0x14; |
| cdinfo->trk[0].track = 1; | |
| // cdinfo->trk[0].pos = 0; | // cdinfo->trk[0].pos = 0; |
| trks = 1; | |
| } | |
| mediatype = 0; | |
| for (i=0; i<trks; i++) { | |
| if (cdinfo->trk[i].type == 0x14) { | |
| mediatype |= SXSIMEDIA_DATA; | |
| } | |
| else if (cdinfo->trk[i].type == 0x10) { | |
| mediatype |= SXSIMEDIA_AUDIO; | |
| } | |
| } | } |
| cdinfo->trk[trks].type = 0x10; | |
| cdinfo->trk[trks].track = 0xaa; | |
| cdinfo->trk[trks].pos = totals; | |
| cdinfo->trks = trks; | |
| file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path)); | file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path)); |
| sxsi->reopen = cd_reopen; | sxsi->reopen = cd_reopen; |
| Line 247 static BRESULT openimg(SXSIDEV sxsi, con | Line 258 static BRESULT openimg(SXSIDEV sxsi, con |
| sxsi->sectors = 1; | sxsi->sectors = 1; |
| sxsi->surfaces = 1; | sxsi->surfaces = 1; |
| sxsi->headersize = 0; | sxsi->headersize = 0; |
| sxsi->mediatype = SXSIMEDIA_DATA; | sxsi->mediatype = mediatype; |
| return(SUCCESS); | return(SUCCESS); |
| sxsiope_err2: | sxsiope_err2: |
| Line 269 static BRESULT getint2(const OEMCHAR *st | Line 280 static BRESULT getint2(const OEMCHAR *st |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| static BRESULT getpos(const OEMCHAR *str, UINT32 *pos) { | static UINT32 getpos(const OEMCHAR *str) { |
| UINT m; | UINT m; |
| UINT s; | UINT s; |
| Line 278 static BRESULT getpos(const OEMCHAR *str | Line 289 static BRESULT getpos(const OEMCHAR *str |
| if ((getint2(str + 0, &m) != SUCCESS) || (str[2] != ':') || | if ((getint2(str + 0, &m) != SUCCESS) || (str[2] != ':') || |
| (getint2(str + 3, &s) != SUCCESS) || (str[5] != ':') || | (getint2(str + 3, &s) != SUCCESS) || (str[5] != ':') || |
| (getint2(str + 6, &f) != SUCCESS)) { | (getint2(str + 6, &f) != SUCCESS)) { |
| return(FAILURE); | return(0); |
| } | |
| if (pos) { | |
| *pos = (((m * 60) + s) * 75) + f; | |
| } | } |
| return(SUCCESS); | return((((m * 60) + s) * 75) + f); |
| } | } |
| static BRESULT opencue(SXSIDEV sxsi, const OEMCHAR *fname) { | static BRESULT opencue(SXSIDEV sxsi, const OEMCHAR *fname) { |
| CDTRK trk[99]; | _CDTRK trk[99]; |
| OEMCHAR path[MAX_PATH]; | OEMCHAR path[MAX_PATH]; |
| UINT curtrk; | UINT idx; |
| UINT8 curtrk; | |
| UINT curtype; | |
| TEXTFILEH tfh; | TEXTFILEH tfh; |
| OEMCHAR buf[512]; | OEMCHAR buf[512]; |
| OEMCHAR *argv[8]; | OEMCHAR *argv[8]; |
| int argc; | int argc; |
| UINT type; | |
| ZeroMemory(trk, sizeof(trk)); | ZeroMemory(trk, sizeof(trk)); |
| path[0] = '\0'; | path[0] = '\0'; |
| curtrk = -1; | idx = 0; |
| curtrk = 1; | |
| curtype = 0x14; | |
| tfh = textfile_open(fname, 0x800); | tfh = textfile_open(fname, 0x800); |
| if (tfh == NULL) { | if (tfh == NULL) { |
| return(FAILURE); | return(FAILURE); |
| Line 307 static BRESULT opencue(SXSIDEV sxsi, con | Line 318 static BRESULT opencue(SXSIDEV sxsi, con |
| while(textfile_read(tfh, buf, NELEMENTS(buf)) == SUCCESS) { | while(textfile_read(tfh, buf, NELEMENTS(buf)) == SUCCESS) { |
| argc = milstr_getarg(buf, argv, NELEMENTS(argv)); | argc = milstr_getarg(buf, argv, NELEMENTS(argv)); |
| if ((argc >= 3) && (!milstr_cmp(argv[0], str_file))) { | if ((argc >= 3) && (!milstr_cmp(argv[0], str_file))) { |
| file_cpyname(path, argv[1], NELEMENTS(path)); | file_cpyname(path, fname, NELEMENTS(path)); |
| file_cutname(path); | |
| file_catname(path, argv[1], NELEMENTS(path)); | |
| } | } |
| else if ((argc >= 3) && (!milstr_cmp(argv[0], str_track))) { | else if ((argc >= 3) && (!milstr_cmp(argv[0], str_track))) { |
| curtrk = milstr_solveINT(argv[1]) - 1; | curtrk = (UINT8)milstr_solveINT(argv[1]); |
| type = 0; | |
| if (!milstr_cmp(argv[2], str_mode1)) { | if (!milstr_cmp(argv[2], str_mode1)) { |
| type = 0x14; | curtype = 0x14; |
| } | } |
| else if (!milstr_cmp(argv[2], str_audio)) { | else if (!milstr_cmp(argv[2], str_audio)) { |
| type = 0x10; | curtype = 0x10; |
| } | |
| if ((curtrk < NELEMENTS(trk)) && (type != 0)) { | |
| trk[curtrk].type = type; | |
| } | } |
| } | } |
| else if ((argc >= 3) && (!milstr_cmp(argv[0], str_index))) { | else if ((argc >= 3) && (!milstr_cmp(argv[0], str_index))) { |
| if (curtrk < NELEMENTS(trk)) { | if (idx < NELEMENTS(trk)) { |
| getpos(argv[2], &trk[curtrk].pos); | trk[idx].type = curtype; |
| trk[idx].track = curtrk; | |
| trk[idx].pos = getpos(argv[2]); | |
| idx++; | |
| } | } |
| } | } |
| } | } |
| textfile_close(tfh); | textfile_close(tfh); |
| #if 0 | return(openimg(sxsi, path, trk, idx)); |
| { | |
| UINT i; | |
| for (i=0; i<NELEMENTS(trk); i++) { | |
| if (trk[i].type) { | |
| TRACEOUT(("%.2d: %.4x %d", i+1, trk[i].type, trk[i].pos)); | |
| } | |
| } | |
| } | |
| #endif | |
| return(openimg(sxsi, path, trk, NELEMENTS(trk))); | |
| } | } |
| BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) { | BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) { |
| Line 353 const OEMCHAR *ext; | Line 355 const OEMCHAR *ext; |
| return(openimg(sxsi, fname, NULL, 0)); | return(openimg(sxsi, fname, NULL, 0)); |
| } | } |
| CDTRK sxsicd_gettrk(SXSIDEV sxsi, UINT *tracks) { | |
| CDINFO cdinfo; | |
| cdinfo = (CDINFO)sxsi->hdl; | |
| if (tracks) { | |
| *tracks = cdinfo->trks; | |
| } | |
| return(cdinfo->trk); | |
| } | |
| BRESULT sxsicd_readraw(SXSIDEV sxsi, long pos, void *buf) { | |
| CDINFO cdinfo; | |
| FILEH fh; | |
| long fpos; | |
| cdinfo = (CDINFO)sxsi->hdl; | |
| if (cdinfo->type != 2352) { | |
| return(FAILURE); | |
| } | |
| if (sxsi_prepare(sxsi) != SUCCESS) { | |
| return(FAILURE); | |
| } | |
| if ((pos < 0) || (pos >= sxsi->totals)) { | |
| return(FAILURE); | |
| } | |
| fh = ((CDINFO)sxsi->hdl)->fh; | |
| fpos = pos * 2352; | |
| if ((file_seek(fh, fpos, FSEEK_SET) != fpos) || | |
| (file_read(fh, buf, 2352) != 2352)) { | |
| return(FAILURE); | |
| } | |
| return(SUCCESS); | |
| } | |