CD-ROM: Implement not ready to ready transition in a cleaner and better way, fixes #4805.

This commit is contained in:
OBattler
2024-09-18 08:01:38 +02:00
parent 3c550f3afb
commit 7068655343
3 changed files with 29 additions and 11 deletions

View File

@@ -1076,6 +1076,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
for (i = first_track; i <= last_track; i++) { for (i = first_track; i <= last_track; i++) {
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti); dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
@@ -1173,6 +1174,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
int last_track; int last_track;
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b); cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
pclog("read_toc_raw(%08X, %08X)\n", dev, b);
dev->ops->get_tracks(dev, &first_track, &last_track); dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -1183,6 +1185,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
dev->ops->get_track_info(dev, i + 1, 0, &ti); dev->ops->get_track_info(dev, i + 1, 0, &ti);
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
b[len++] = 1; /* Session number */ b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */ b[len++] = ti.attr; /* Track ADR and Control */
@@ -2016,6 +2019,27 @@ cdrom_insert(uint8_t id)
dev->insert(dev->priv); dev->insert(dev->priv);
} }
void
cdrom_exit(uint8_t id)
{
cdrom_t *dev = &cdrom[id];
strcpy(dev->prev_image_path, dev->image_path);
if (dev->ops) {
if (dev->ops->exit)
dev->ops->exit(dev);
dev->ops = NULL;
}
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
pclog("CD-ROM exited\n");
}
/* The mechanics of ejecting a CD-ROM from a drive. */ /* The mechanics of ejecting a CD-ROM from a drive. */
void void
cdrom_eject(uint8_t id) cdrom_eject(uint8_t id)
@@ -2028,13 +2052,7 @@ cdrom_eject(uint8_t id)
return; return;
} }
strcpy(dev->prev_image_path, dev->image_path); cdrom_exit(id);
dev->ops->exit(dev);
dev->ops = NULL;
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
plat_cdrom_ui_update(id, 0); plat_cdrom_ui_update(id, 0);

View File

@@ -25,6 +25,7 @@
#define CD_STATUS_PLAYING_COMPLETED 5 #define CD_STATUS_PLAYING_COMPLETED 5
/* Medium changed flag. */ /* Medium changed flag. */
#define CD_STATUS_TRANSITION 0x40
#define CD_STATUS_MEDIUM_CHANGED 0x80 #define CD_STATUS_MEDIUM_CHANGED 0x80
#define CD_TRACK_AUDIO 0x08 #define CD_TRACK_AUDIO 0x08
@@ -298,6 +299,7 @@ extern void cdrom_seek(cdrom_t *dev, uint32_t pos, uint8_t vendor_type);
extern void cdrom_close_handler(uint8_t id); extern void cdrom_close_handler(uint8_t id);
extern void cdrom_insert(uint8_t id); extern void cdrom_insert(uint8_t id);
extern void cdrom_exit(uint8_t id);
extern void cdrom_eject(uint8_t id); extern void cdrom_eject(uint8_t id);
extern void cdrom_reload(uint8_t id); extern void cdrom_reload(uint8_t id);

View File

@@ -526,11 +526,8 @@ MediaMenu::cdromMount(int i, const QString &filename)
{ {
QByteArray fn = filename.toUtf8().data(); QByteArray fn = filename.toUtf8().data();
strcpy(cdrom[i].prev_image_path, cdrom[i].image_path); cdrom_exit(i);
if (cdrom[i].ops && cdrom[i].ops->exit)
cdrom[i].ops->exit(&(cdrom[i]));
cdrom[i].ops = nullptr;
memset(cdrom[i].image_path, 0, sizeof(cdrom[i].image_path)); memset(cdrom[i].image_path, 0, sizeof(cdrom[i].image_path));
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
if ((fn.data() != nullptr) && (strlen(fn.data()) >= 1) && (fn.data()[strlen(fn.data()) - 1] == '/')) if ((fn.data() != nullptr) && (strlen(fn.data()) >= 1) && (fn.data()[strlen(fn.data()) - 1] == '/'))
@@ -543,6 +540,7 @@ MediaMenu::cdromMount(int i, const QString &filename)
cdrom_ioctl_open(&(cdrom[i]), fn.data()); cdrom_ioctl_open(&(cdrom[i]), fn.data());
else else
cdrom_image_open(&(cdrom[i]), fn.data()); cdrom_image_open(&(cdrom[i]), fn.data());
/* Signal media change to the emulated machine. */ /* Signal media change to the emulated machine. */
if (cdrom[i].insert) if (cdrom[i].insert)
cdrom[i].insert(cdrom[i].priv); cdrom[i].insert(cdrom[i].priv);