diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index ab4e46a5c..4c106b6ec 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -12,6 +12,7 @@ * * Copyright 2018-2021 Miran Grca. */ + #include #ifdef ENABLE_CDROM_LOG #include @@ -26,6 +27,7 @@ #include <86box/config.h> #include <86box/cdrom.h> #include <86box/cdrom_image.h> +#include <86box/cdrom_image_writable.h> #include <86box/cdrom_interface.h> #ifdef USE_CDROM_MITSUMI #include <86box/cdrom_mitsumi.h> @@ -2996,6 +2998,36 @@ cdrom_update_status(cdrom_t *dev) } } +int +cdrom_insert_blank(cdrom_t *dev, const char *fn) +{ + int ret = 0; + + // Create new image + dev->local = wimage_open(dev, dev->image_path); + + // Clear cached sectors + dev->cached_sector = -1; + + // If new image could not be created + if (dev->local == NULL) { + dev->ops = NULL; + dev->image_path[0] = 0; + + ret = 1; + } else { + // All looking good, reset state + dev->seek_pos = 0; + dev->cd_buflen = 0; + dev->cd_status = CD_STATUS_BLANK_CDR; + dev->cdrom_capacity = 0; + cdrom_log(dev->log, "Blank CD-R created\n"); + cdrom_insert(dev->id); + } + + return ret; +} + int cdrom_load(cdrom_t *dev, const char *fn, const int skip_insert) { @@ -3188,15 +3220,6 @@ 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/cdrom/cdrom_image_writable.c b/src/cdrom/cdrom_image_writable.c index cad79c727..9697f959f 100644 --- a/src/cdrom/cdrom_image_writable.c +++ b/src/cdrom/cdrom_image_writable.c @@ -38,11 +38,11 @@ static char temp_keyword[1024]; typedef struct track_index_t { - int64_t start; - uint64_t length; - uint64_t file_start; - uint64_t file_length; - track_file_t *file; + int64_t start; + uint64_t length; + uint64_t file_start; + uint64_t file_length; + wtrack_file_t *file; } track_index_t; typedef struct track_t { diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 7fc7453d1..6788dfb79 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -31,6 +31,8 @@ #define CD_STATUS_HOLD 8 #define CD_STATUS_DVD_REJECTED 16 #define CD_STATUS_HAS_AUDIO 0xc +#define CD_STATUS_BLANK_CDR 0x10 +#define CD_STATUS_BLANK_MASK 0x10 #define CD_STATUS_MASK 0x1f /* Medium changed flag. */ @@ -475,7 +477,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 int cdrom_insert_blank(cdrom_t *dev, const char *fn); 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/include/86box/cdrom_image_writable.h b/src/include/86box/cdrom_image_writable.h index 63a49b2f7..ab3d550d8 100644 --- a/src/include/86box/cdrom_image_writable.h +++ b/src/include/86box/cdrom_image_writable.h @@ -16,7 +16,7 @@ #define CDROM_IMAGE_WRITABLE_H /* Track file struct. */ -typedef struct track_file_t { +typedef struct wtrack_file_t { int (*read)(void *priv, uint8_t *buffer, uint64_t seek, size_t count); uint64_t (*get_length)(void *priv); void (*close)(void *priv); @@ -27,7 +27,7 @@ typedef struct track_file_t { void *log; int motorola; -} track_file_t; +} wtrack_file_t; extern void *wimage_open(cdrom_t *dev, const char *path); diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 6a911935c..86282ced3 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -620,8 +620,40 @@ MediaMenu::cdromInsertBlank(int i) return; } + cdrom_t *drv = &cdrom[i]; +/* (claunia) TODO: Temporarily disabled because a KDE thumbnailer makes it crash while debugging on my machine, until later + // Ask user for cuesheet file location + QString cueFileName = QFileDialog::getSaveFileName( + parentWidget, + tr("CD-R(W) cuesheet image"), + QString(), + tr("Cuesheet files (*.cue)") + ); + if (cueFileName.isEmpty()) { + return; + } + // Ensure .cue extension + if (!cueFileName.endsWith(".cue", Qt::CaseInsensitive)) { + cueFileName += ".cue"; + } + QFile cueFile(cueFileName); + if (cueFile.exists()) { + QMessageBox::StandardButton reply = QMessageBox::question( + parentWidget, + tr("Replace file"), + tr("The file '%1' already exists. Do you want to replace it?").arg(cueFileName), + QMessageBox::Yes | QMessageBox::No + ); + if (reply != QMessageBox::Yes) { + return; + } + } + // Add a blank disc - cdrom_insert_blank(i); + cdrom_insert_blank(drv, cueFileName.toUtf8()); +*/ + + cdrom_insert_blank(drv, "/home/claunia/foo_86box.cue"); // (claunia) Temporary hardcoded path until the above is fixed ui_sb_update_icon_state(SB_CDROM | i, 1); }