IOCTL: Fix detection of whether or not the disc has audio, fixes audio playing.

This commit is contained in:
OBattler
2025-02-13 23:37:27 +01:00
parent 1a33a2bd09
commit da360ab9da
2 changed files with 43 additions and 38 deletions

View File

@@ -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", 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); (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); 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[10] = (dat >> 8) & 0xff;
b[11] = dat & 0xff; b[11] = dat & 0xff;
} }
pclog("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", // 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[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7],
b[ 8], b[ 9], b[10], b[11]); // b[ 8], b[ 9], b[10], b[11]);
if (b[0] != 0x00) if (b[0] != 0x00)
break; break;
base += 12; base += 12;
@@ -3074,7 +3072,9 @@ cdrom_reload(const uint8_t id)
{ {
cdrom_t *dev = &cdrom[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. */ /* Switch from empty to empty. Do nothing. */
return; return;
} }

View File

@@ -43,7 +43,6 @@ typedef struct ioctl_t {
void *log; void *log;
int is_dvd; int is_dvd;
int has_audio; int has_audio;
int32_t tracks_num;
int blocks_num; int blocks_num;
uint8_t cur_rti[65536]; uint8_t cur_rti[65536];
HANDLE handle; HANDLE handle;
@@ -107,13 +106,13 @@ ioctl_open_handle(ioctl_t *ioctl)
} }
static int 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; long size = 0;
PCDROM_TOC_FULL_TOC_DATA cur_full_toc = NULL; PCDROM_TOC_FULL_TOC_DATA cur_full_toc = NULL;
CDROM_READ_TOC_EX cur_read_toc_ex = { 0 }; CDROM_READ_TOC_EX cur_read_toc_ex = { 0 };
ioctl->tracks_num = 0; *tracks_num = 0;
memset(toc_buf, 0x00, 65536); memset(toc_buf, 0x00, 65536);
cur_full_toc = (PCDROM_TOC_FULL_TOC_DATA) calloc(1, 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) { if (temp != 0) {
const int length = ((cur_full_toc->Length[0] << 8) | cur_full_toc->Length[1]) + 2; const int length = ((cur_full_toc->Length[0] << 8) | cur_full_toc->Length[1]) + 2;
memcpy(toc_buf, cur_full_toc, length); memcpy(toc_buf, cur_full_toc, length);
ioctl->tracks_num = (length - 4) / 8; *tracks_num = (length - 4) / 8;
} }
free(cur_full_toc); 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; PCDROM_TOC toc = (PCDROM_TOC) toc_buf;
ioctl_log(ioctl->log, "%i tracks: %02X %02X %02X %02X\n", 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]; 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", 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]); 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); 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 This is needed because in some circumstances (eg. a DVD .MDS
mounted in Daemon Tools), reading the raw TOC fails but 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. raw TOC from the cooked TOC.
*/ */
uint8_t cur_toc[65536] = { 0 }; uint8_t cur_toc[65536] = { 0 };
int32_t tracks_num = 0;
const CDROM_TOC * toc = (const CDROM_TOC *) cur_toc; 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].adr_ctl = ((ct->Adr & 0xf) << 4) | (ct->Control & 0xf);
rti[0].point = 0xa0; rti[0].point = 0xa0;
rti[0].pm = toc->FirstTrack; rti[0].pm = toc->FirstTrack;
@@ -215,7 +217,7 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
ioctl->blocks_num = 3; 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]); raw_track_info_t *crt = &(rti[ioctl->blocks_num]);
ct = &(toc->TrackData[i]); ct = &(toc->TrackData[i]);
@@ -228,13 +230,16 @@ ioctl_read_raw_toc(ioctl_t *ioctl)
ioctl->blocks_num++; ioctl->blocks_num++;
} }
} else if (status > 0)
/* Announce that we've had a failure. */
status = 0;
} else if (status != 0) { } else if (status != 0) {
ioctl->blocks_num = (((cur_full_toc->Length[0] << 8) | ioctl->blocks_num = (((cur_full_toc->Length[0] << 8) |
cur_full_toc->Length[1]) - 2) / 11; cur_full_toc->Length[1]) - 2) / 11;
memcpy(ioctl->cur_rti, cur_full_toc->Descriptors, ioctl->blocks_num * 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]); const raw_track_info_t *crt = &(rti[i]);
if ((crt->point >= 1) && (crt->point <= 99) && !(crt->adr_ctl & 0x04)) { if ((crt->point >= 1) && (crt->point <= 99) && !(crt->adr_ctl & 0x04)) {