CD-ROM: Implement not ready to ready transition in a cleaner and better way, fixes #4805.
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user