Implement inserting blank media into drive.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user