return &th->toc[th->last_track_offset];
}
+int cdtracknumber(struct cd_toc_head *th, int block)
+{
+ struct cd_toc *t = gettoc(-1, th, block);
+ return t->track;
+}
int isaudiotrack (struct cd_toc_head *th, int block)
{
struct cd_toc *t = gettoc (-1, th, block);
extern void blkdev_fix_prefs (struct uae_prefs *p);
extern int isaudiotrack (struct cd_toc_head*, int block);
extern int isdatatrack (struct cd_toc_head*, int block);
+extern int cdtracknumber(struct cd_toc_head *th, int block);
void sub_to_interleaved (const uae_u8 *s, uae_u8 *d);
void sub_to_deinterleaved (const uae_u8 *s, uae_u8 *d);
TCHAR devname[30];
int type;
CDROM_TOC cdromtoc;
+ uae_u8 trackmode[100];
UINT errormode;
int playend;
int fullaccess;
if (!open_createfile (ciw, ciw->usesptiread ? 1 : 0))
return 0;
ret = 0;
- while (size-- > 0) {
+ while (size > 0) {
+ int track = cdtracknumber(&ciw->di.toc, sector);
got = false;
-#if 0
- // always use IOCTL_CDROM_RAW_READ
- if (!ciw->usesptiread && (sectorsize == 2048 || sectorsize == 2352)) {
+ if (!ciw->usesptiread && sectorsize == 2048 && ciw->trackmode[track] == 0) {
if (read2048 (ciw, sector) == 2048) {
- if (sectorsize == 2352) {
- memset (data, 0, 16);
- memcpy (data + 16, p, 2048);
- encode_l2 (data, sector + 150);
- sector++;
- data += sectorsize;
- ret += sectorsize;
- } else if (sectorsize == 2048) {
- memcpy (data, p, 2048);
- sector++;
- data += sectorsize;
- ret += sectorsize;
- }
+ memcpy (data, p, 2048);
+ sector++;
+ data += sectorsize;
+ ret += sectorsize;
got = true;
}
}
-#endif
if (!got && !ciw->usesptiread) {
RAW_READ_INFO rri;
rri.DiskOffset.QuadPart = sector * 2048;
if (DeviceIoControl (ciw->h, IOCTL_CDROM_RAW_READ, &rri, sizeof rri, p, IOCTL_DATA_BUFFER, &len, NULL)) {
reseterrormode (ciw);
if (data) {
+ uae_u8 mode = data[15];
+ uae_u8 oldmode = ciw->trackmode[track];
+ ciw->trackmode[track] = mode;
+ if (oldmode == 0xff && mode == 0 && sectorsize == 2048) {
+ // it is MODE0 track, we can do normal read
+ goto retry;
+ }
if (sectorsize >= 2352) {
memcpy (data, p, sectorsize);
data += sectorsize;
got = true;
}
sector++;
+ size--;
}
return ret;
}
struct cd_toc_head *th = &ciw->di.toc;
struct cd_toc *t = th->toc;
int cnt = 3;
+ memset(ciw->trackmode, 0xff, sizeof(ciw->trackmode));
CDROM_TOC *toc = &ciw->cdromtoc;
if (!unitisopen (unitnum))