diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 88811c016..393009839 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -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++) { 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); b[len++] = 0; /* reserved */ @@ -1173,6 +1174,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) int last_track; 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); @@ -1183,6 +1185,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) 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); + 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++] = ti.attr; /* Track ADR and Control */ @@ -2016,6 +2019,27 @@ cdrom_insert(uint8_t id) 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. */ void cdrom_eject(uint8_t id) @@ -2028,13 +2052,7 @@ cdrom_eject(uint8_t id) return; } - strcpy(dev->prev_image_path, dev->image_path); - - dev->ops->exit(dev); - dev->ops = NULL; - memset(dev->image_path, 0, sizeof(dev->image_path)); - - cdrom_insert(id); + cdrom_exit(id); plat_cdrom_ui_update(id, 0); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index b97693560..636c151ce 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -25,6 +25,7 @@ #define CD_STATUS_PLAYING_COMPLETED 5 /* Medium changed flag. */ +#define CD_STATUS_TRANSITION 0x40 #define CD_STATUS_MEDIUM_CHANGED 0x80 #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_insert(uint8_t id); +extern void cdrom_exit(uint8_t id); extern void cdrom_eject(uint8_t id); extern void cdrom_reload(uint8_t id); diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index f61dd1d0e..1fa5283d2 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -526,11 +526,8 @@ MediaMenu::cdromMount(int i, const QString &filename) { QByteArray fn = filename.toUtf8().data(); - strcpy(cdrom[i].prev_image_path, cdrom[i].image_path); - if (cdrom[i].ops && cdrom[i].ops->exit) - cdrom[i].ops->exit(&(cdrom[i])); + cdrom_exit(i); - cdrom[i].ops = nullptr; memset(cdrom[i].image_path, 0, sizeof(cdrom[i].image_path)); #ifdef Q_OS_WINDOWS 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()); else cdrom_image_open(&(cdrom[i]), fn.data()); + /* Signal media change to the emulated machine. */ if (cdrom[i].insert) cdrom[i].insert(cdrom[i].priv);