Implement inserting blank media into drive.

This commit is contained in:
2025-09-24 02:51:13 +01:00
parent 6029b563e2
commit f534b35257
5 changed files with 75 additions and 18 deletions

View File

@@ -12,6 +12,7 @@
*
* Copyright 2018-2021 Miran Grca.
*/
#include <inttypes.h>
#ifdef ENABLE_CDROM_LOG
#include <stdarg.h>
@@ -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)
{

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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);

View File

@@ -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);
}