diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 007868ee3..ab4e46a5c 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -3188,6 +3188,15 @@ cdrom_insert(const uint8_t id) dev->insert(dev->priv); } +void +cdrom_insert_blank(const uint8_t id) +{ + const cdrom_t *dev = &cdrom[id]; + + if (dev->bus_type && dev->insert_blank) + dev->insert_blank(dev->priv); +} + void cdrom_exit(const uint8_t id) { diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 655128658..7fc7453d1 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -344,6 +344,7 @@ typedef struct cdrom { void (*insert)(void *priv); void (*close)(void *priv); + void (*insert_blank)(void *priv); uint32_t (*get_volume)(void *p, int channel); uint32_t (*get_channel)(void *p, int channel); @@ -474,6 +475,7 @@ extern void cdrom_exit(const uint8_t id); extern int cdrom_is_empty(const uint8_t id); extern void cdrom_eject(const uint8_t id); extern void cdrom_reload(const uint8_t id); +extern void cdrom_insert_blank(const uint8_t id); extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data, uint32_t major_count, uint32_t minor_count, diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index b42812ad6..6a911935c 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -162,6 +162,9 @@ MediaMenu::refresh(QMenu *parentMenu) cdromMutePos = menu->children().count(); menu->addAction(QIcon(":/settings/qt/icons/cdrom_mute.ico"), tr("&Mute"), [this, i]() { cdromMute(i); })->setCheckable(true); menu->addSeparator(); + // Can make it only appear if the drive is a Yamaha? + menu->addAction(tr("Add &blank disc"), [this, i]() { cdromInsertBlank(i); })->setCheckable(false); + menu->addSeparator(); menu->addAction(getIconWithIndicator(QIcon(":/settings/qt/icons/cdrom_image.ico"), pixmap_size, QIcon::Normal, Browse), tr("&Image..."), [this, i]() { cdromMount(i, 0, nullptr); })->setCheckable(false); menu->addAction(getIconWithIndicator(QIcon(":/settings/qt/icons/cdrom_folder.ico"), pixmap_size, QIcon::Normal, Browse), tr("&Folder..."), [this, i]() { cdromMount(i, 1, nullptr); })->setCheckable(false); menu->addSeparator(); @@ -608,6 +611,21 @@ MediaMenu::cdromMount(int i, int dir, const QString &arg) cdromMount(i, filename); } +void +MediaMenu::cdromInsertBlank(int i) +{ + // Check if drive is empty + if (!cdrom_is_empty(i)) { + QMessageBox::information(parentWidget, tr("Drive not empty"), tr("The drive must be empty to add a blank disc.")); + return; + } + + // Add a blank disc + cdrom_insert_blank(i); + + ui_sb_update_icon_state(SB_CDROM | i, 1); +} + void MediaMenu::cdromEject(int i) { diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index fb24d24e0..4346991e6 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -45,6 +45,7 @@ public: void cdromMute(int i); void cdromMount(int i, int dir, const QString &arg); void cdromMount(int i, const QString &filename); + void cdromInsertBlank(int i); void cdromEject(int i); void cdromReload(int index, int slot); void updateImageHistory(int index, int slot, ui::MediaType type); diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index fe00b7cc3..a4858ef23 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1232,6 +1232,17 @@ scsi_cdrom_insert(void *priv) } } +static void +scsi_cdrom_insert_blank(void *priv) +{ + scsi_cdrom_t *dev = (scsi_cdrom_t *) priv; + + if ((dev == NULL) /*|| (dev->drv == NULL)*/) + return; + + scsi_cdrom_log(dev->log, "Inserting blank disc\n"); +} + static int scsi_command_check_ready(const scsi_cdrom_t *dev, const uint8_t *cdb) { @@ -3988,6 +3999,7 @@ scsi_cdrom_drive_reset(const int c) drv->get_volume = scsi_cdrom_get_volume; drv->get_channel = scsi_cdrom_get_channel; drv->close = scsi_cdrom_close; + drv->insert_blank = scsi_cdrom_insert_blank; drv->sector_size = 2048; (void) scsi_cdrom_update_sector_flags(dev);