|
|
| version 1.5, 2005/04/05 13:48:09 | version 1.6, 2005/04/05 20:37:07 |
|---|---|
| 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; |
| CDTRK trk[99]; | UINT trks; |
| _CDTRK trk[100]; | |
| OEMCHAR path[MAX_PATH]; | OEMCHAR path[MAX_PATH]; |
| } _CDINFO, *CDINFO; | } _CDINFO, *CDINFO; |
| Line 192 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; |
| Line 222 static BRESULT openimg(SXSIDEV sxsi, con | Line 218 static BRESULT openimg(SXSIDEV sxsi, con |
| cdinfo->fh = fh; | cdinfo->fh = fh; |
| cdinfo->type = type; | cdinfo->type = type; |
| if ((trk != NULL) && (trks != 0)) { | if ((trk != NULL) && (trks != 0)) { |
| trks = min(trks, NELEMENTS(cdinfo->trk)); | trks = min(trks, NELEMENTS(cdinfo->trk) - 1); |
| mediatype = 0; | CopyMemory(cdinfo->trk, trk, trks * sizeof(_CDTRK)); |
| for (i=0; i<trks; i++) { | |
| if (trk[i].type == 0x14) { | |
| mediatype |= SXSIMEDIA_DATA; | |
| } | |
| else if (trk[i].type == 0x10) { | |
| mediatype |= SXSIMEDIA_AUDIO; | |
| } | |
| } | |
| 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; |
| mediatype = SXSIMEDIA_DATA; | 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 279 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 288 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 index; |
| 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; | index = 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 322 static BRESULT opencue(SXSIDEV sxsi, con | Line 323 static BRESULT opencue(SXSIDEV sxsi, con |
| file_catname(path, argv[1], NELEMENTS(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 (index < NELEMENTS(trk)) { |
| getpos(argv[2], &trk[curtrk].pos); | trk[index].type = curtype; |
| trk[index].track = curtrk; | |
| trk[index].pos = getpos(argv[2]); | |
| index++; | |
| } | } |
| } | } |
| } | } |
| textfile_close(tfh); | textfile_close(tfh); |
| return(openimg(sxsi, path, trk, NELEMENTS(trk))); | return(openimg(sxsi, path, trk, index)); |
| } | } |
| BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) { | BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) { |
| Line 355 const OEMCHAR *ext; | Line 355 const OEMCHAR *ext; |
| return(openimg(sxsi, fname, NULL, 0)); | return(openimg(sxsi, fname, NULL, 0)); |
| } | } |
| static void storepos(UINT8 *ptr, UINT32 pos) { | CDTRK sxsicd_gettrk(SXSIDEV sxsi, UINT *tracks) { |
| UINT f; | |
| UINT m; | |
| pos += 150; | |
| f = pos % 75; | |
| pos = pos / 75; | |
| m = pos % 60; | |
| pos = pos / 60; | |
| ptr[0] = 0; | |
| ptr[1] = (UINT8)pos; | |
| ptr[2] = (UINT8)m; | |
| ptr[3] = (UINT8)f; | |
| } | |
| UINT sxsicd_gettocinfo(SXSIDEV sxsi, UINT8 *buf) { | |
| CDINFO cdinfo; | CDINFO cdinfo; |
| UINT8 *ptr; | |
| UINT trks; | |
| UINT i; | |
| UINT type; | |
| cdinfo = (CDINFO)sxsi->hdl; | cdinfo = (CDINFO)sxsi->hdl; |
| ptr = buf + 2; | if (tracks) { |
| trks = 0; | *tracks = cdinfo->trks; |
| for (i=0; i<NELEMENTS(cdinfo->trk); i++) { | |
| type = cdinfo->trk[i].type; | |
| if (type) { | |
| ptr[0] = (UINT8)(type >> 8); | |
| ptr[1] = (UINT8)(type >> 0); | |
| ptr[2] = (UINT8)(i + 1); | |
| ptr[3] = 0; | |
| storepos(ptr + 4, cdinfo->trk[i].pos); | |
| ptr += 8; | |
| trks++; | |
| } | |
| } | } |
| buf[0] = 1; | return(cdinfo->trk); |
| buf[1] = (UINT8)trks; | |
| ptr[0] = 0x00; | |
| ptr[1] = 0x10; | |
| ptr[2] = 0xaa; | |
| ptr[3] = 0; | |
| storepos(ptr + 4, sxsi->totals); | |
| return(trks * 8 + 10); | |
| } | } |