IOCTL: Fix detection of whether or not the disc has audio, fixes audio playing.
This commit is contained in:
@@ -431,8 +431,6 @@ read_toc_normal(const cdrom_t *dev, unsigned char *b,
|
||||
|
||||
cdrom_log(dev->log, "read_toc_normal(%016" PRIXPTR ", %016" PRIXPTR ", %02X, %i, %i)\n",
|
||||
(uintptr_t) dev, (uintptr_t) b, start_track, msf, sony);
|
||||
pclog("read_toc_normal(%016" PRIXPTR ", %016" PRIXPTR ", %02X, %i, %i)\n",
|
||||
(uintptr_t) dev, (uintptr_t) b, start_track, msf, sony);
|
||||
|
||||
dev->ops->get_raw_track_info(dev->local, &num, rti);
|
||||
|
||||
@@ -1848,9 +1846,9 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, const int msf)
|
||||
b[10] = (dat >> 8) & 0xff;
|
||||
b[11] = dat & 0xff;
|
||||
}
|
||||
pclog("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||
b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7],
|
||||
b[ 8], b[ 9], b[10], b[11]);
|
||||
// pclog("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||
// b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7],
|
||||
// b[ 8], b[ 9], b[10], b[11]);
|
||||
if (b[0] != 0x00)
|
||||
break;
|
||||
base += 12;
|
||||
@@ -3074,7 +3072,9 @@ cdrom_reload(const uint8_t id)
|
||||
{
|
||||
cdrom_t *dev = &cdrom[id];
|
||||
|
||||
if ((strcmp(dev->image_path, dev->prev_image_path) == 0) || (strlen(dev->prev_image_path) == 0) || (strlen(dev->image_path) > 0)) {
|
||||
if ((strcmp(dev->image_path, dev->prev_image_path) == 0) ||
|
||||
(strlen(dev->prev_image_path) == 0) ||
|
||||
(strlen(dev->image_path) > 0)) {
|
||||
/* Switch from empty to empty. Do nothing. */
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ typedef struct ioctl_t {
|
||||
void *log;
|
||||
int is_dvd;
|
||||
int has_audio;
|
||||
int32_t tracks_num;
|
||||
int blocks_num;
|
||||
uint8_t cur_rti[65536];
|
||||
HANDLE handle;
|
||||
@@ -107,13 +106,13 @@ ioctl_open_handle(ioctl_t *ioctl)
|
||||
}
|
||||
|
||||
static int
|
||||
ioctl_read_normal_toc(ioctl_t *ioctl, uint8_t *toc_buf)
|
||||
ioctl_read_normal_toc(ioctl_t *ioctl, uint8_t *toc_buf, int32_t *tracks_num)
|
||||
{
|
||||
long size = 0;
|
||||
PCDROM_TOC_FULL_TOC_DATA cur_full_toc = NULL;
|
||||
CDROM_READ_TOC_EX cur_read_toc_ex = { 0 };
|
||||
|
||||
ioctl->tracks_num = 0;
|
||||
*tracks_num = 0;
|
||||
memset(toc_buf, 0x00, 65536);
|
||||
|
||||
cur_full_toc = (PCDROM_TOC_FULL_TOC_DATA) calloc(1, 65536);
|
||||
@@ -132,7 +131,7 @@ ioctl_read_normal_toc(ioctl_t *ioctl, uint8_t *toc_buf)
|
||||
if (temp != 0) {
|
||||
const int length = ((cur_full_toc->Length[0] << 8) | cur_full_toc->Length[1]) + 2;
|
||||
memcpy(toc_buf, cur_full_toc, length);
|
||||
ioctl->tracks_num = (length - 4) / 8;
|
||||
*tracks_num = (length - 4) / 8;
|
||||
}
|
||||
|
||||
free(cur_full_toc);
|
||||
@@ -141,9 +140,9 @@ ioctl_read_normal_toc(ioctl_t *ioctl, uint8_t *toc_buf)
|
||||
PCDROM_TOC toc = (PCDROM_TOC) toc_buf;
|
||||
|
||||
ioctl_log(ioctl->log, "%i tracks: %02X %02X %02X %02X\n",
|
||||
ioctl->tracks_num, toc_buf[0], toc_buf[1], toc_buf[2], toc_buf[3]);
|
||||
*tracks_num, toc_buf[0], toc_buf[1], toc_buf[2], toc_buf[3]);
|
||||
|
||||
for (int i = 0; i < ioctl->tracks_num; i++) {
|
||||
for (int i = 0; i < *tracks_num; i++) {
|
||||
const uint8_t *t = (const uint8_t *) &toc->TrackData[i];
|
||||
ioctl_log(ioctl->log, "Track %03i: %02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||
i, t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7]);
|
||||
@@ -185,7 +184,7 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
|
||||
ioctl_log(ioctl->log, "status = %i\n", status);
|
||||
}
|
||||
|
||||
if ((status == 0) && (ioctl->tracks_num >= 1)) {
|
||||
if (status == 0) {
|
||||
/*
|
||||
This is needed because in some circumstances (eg. a DVD .MDS
|
||||
mounted in Daemon Tools), reading the raw TOC fails but
|
||||
@@ -193,12 +192,15 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
|
||||
raw TOC from the cooked TOC.
|
||||
*/
|
||||
uint8_t cur_toc[65536] = { 0 };
|
||||
int32_t tracks_num = 0;
|
||||
|
||||
const CDROM_TOC * toc = (const CDROM_TOC *) cur_toc;
|
||||
const TRACK_DATA *ct = &(toc->TrackData[ioctl->tracks_num - 1]);
|
||||
|
||||
ioctl_read_normal_toc(ioctl, cur_toc);
|
||||
status = ioctl_read_normal_toc(ioctl, cur_toc, &tracks_num);
|
||||
|
||||
const TRACK_DATA *ct = &(toc->TrackData[tracks_num - 1]);
|
||||
|
||||
if ((status > 0) && (tracks_num >= 1)) {
|
||||
rti[0].adr_ctl = ((ct->Adr & 0xf) << 4) | (ct->Control & 0xf);
|
||||
rti[0].point = 0xa0;
|
||||
rti[0].pm = toc->FirstTrack;
|
||||
@@ -215,7 +217,7 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
|
||||
|
||||
ioctl->blocks_num = 3;
|
||||
|
||||
for (int i = 0; i < (ioctl->tracks_num - 1); i++) {
|
||||
for (int i = 0; i < (tracks_num - 1); i++) {
|
||||
raw_track_info_t *crt = &(rti[ioctl->blocks_num]);
|
||||
|
||||
ct = &(toc->TrackData[i]);
|
||||
@@ -228,13 +230,16 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
|
||||
|
||||
ioctl->blocks_num++;
|
||||
}
|
||||
} else if (status > 0)
|
||||
/* Announce that we've had a failure. */
|
||||
status = 0;
|
||||
} else if (status != 0) {
|
||||
ioctl->blocks_num = (((cur_full_toc->Length[0] << 8) |
|
||||
cur_full_toc->Length[1]) - 2) / 11;
|
||||
memcpy(ioctl->cur_rti, cur_full_toc->Descriptors, ioctl->blocks_num * 11);
|
||||
}
|
||||
|
||||
if (ioctl->blocks_num) for (int i = 0; i < ioctl->tracks_num; i++) {
|
||||
if (ioctl->blocks_num) for (int i = 0; i < ioctl->blocks_num; i++) {
|
||||
const raw_track_info_t *crt = &(rti[i]);
|
||||
|
||||
if ((crt->point >= 1) && (crt->point <= 99) && !(crt->adr_ctl & 0x04)) {
|
||||
|
||||
Reference in New Issue
Block a user