Implement inserting blank media into drive.
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright 2018-2021 Miran Grca.
|
* Copyright 2018-2021 Miran Grca.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#ifdef ENABLE_CDROM_LOG
|
#ifdef ENABLE_CDROM_LOG
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -26,6 +27,7 @@
|
|||||||
#include <86box/config.h>
|
#include <86box/config.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/cdrom_image.h>
|
#include <86box/cdrom_image.h>
|
||||||
|
#include <86box/cdrom_image_writable.h>
|
||||||
#include <86box/cdrom_interface.h>
|
#include <86box/cdrom_interface.h>
|
||||||
#ifdef USE_CDROM_MITSUMI
|
#ifdef USE_CDROM_MITSUMI
|
||||||
#include <86box/cdrom_mitsumi.h>
|
#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
|
int
|
||||||
cdrom_load(cdrom_t *dev, const char *fn, const int skip_insert)
|
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);
|
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
|
void
|
||||||
cdrom_exit(const uint8_t id)
|
cdrom_exit(const uint8_t id)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ typedef struct track_index_t {
|
|||||||
uint64_t length;
|
uint64_t length;
|
||||||
uint64_t file_start;
|
uint64_t file_start;
|
||||||
uint64_t file_length;
|
uint64_t file_length;
|
||||||
track_file_t *file;
|
wtrack_file_t *file;
|
||||||
} track_index_t;
|
} track_index_t;
|
||||||
|
|
||||||
typedef struct track_t {
|
typedef struct track_t {
|
||||||
|
|||||||
@@ -31,6 +31,8 @@
|
|||||||
#define CD_STATUS_HOLD 8
|
#define CD_STATUS_HOLD 8
|
||||||
#define CD_STATUS_DVD_REJECTED 16
|
#define CD_STATUS_DVD_REJECTED 16
|
||||||
#define CD_STATUS_HAS_AUDIO 0xc
|
#define CD_STATUS_HAS_AUDIO 0xc
|
||||||
|
#define CD_STATUS_BLANK_CDR 0x10
|
||||||
|
#define CD_STATUS_BLANK_MASK 0x10
|
||||||
#define CD_STATUS_MASK 0x1f
|
#define CD_STATUS_MASK 0x1f
|
||||||
|
|
||||||
/* Medium changed flag. */
|
/* 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 int cdrom_is_empty(const uint8_t id);
|
||||||
extern void cdrom_eject(const uint8_t id);
|
extern void cdrom_eject(const uint8_t id);
|
||||||
extern void cdrom_reload(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,
|
extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
||||||
uint32_t major_count, uint32_t minor_count,
|
uint32_t major_count, uint32_t minor_count,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#define CDROM_IMAGE_WRITABLE_H
|
#define CDROM_IMAGE_WRITABLE_H
|
||||||
|
|
||||||
/* Track file struct. */
|
/* 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);
|
int (*read)(void *priv, uint8_t *buffer, uint64_t seek, size_t count);
|
||||||
uint64_t (*get_length)(void *priv);
|
uint64_t (*get_length)(void *priv);
|
||||||
void (*close)(void *priv);
|
void (*close)(void *priv);
|
||||||
@@ -27,7 +27,7 @@ typedef struct track_file_t {
|
|||||||
void *log;
|
void *log;
|
||||||
|
|
||||||
int motorola;
|
int motorola;
|
||||||
} track_file_t;
|
} wtrack_file_t;
|
||||||
|
|
||||||
extern void *wimage_open(cdrom_t *dev, const char *path);
|
extern void *wimage_open(cdrom_t *dev, const char *path);
|
||||||
|
|
||||||
|
|||||||
@@ -620,8 +620,40 @@ MediaMenu::cdromInsertBlank(int i)
|
|||||||
return;
|
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
|
// 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);
|
ui_sb_update_icon_state(SB_CDROM | i, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user