CD-ROM interface API to get raw track data, IOCTL now actually provides it, and IOCTL is now actually instantiable, as well as cleaned up a bit.
This commit is contained in:
@@ -1167,27 +1167,81 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
|
||||
static int
|
||||
read_toc_raw(cdrom_t *dev, unsigned char *b)
|
||||
{
|
||||
track_info_t ti;
|
||||
int len = 4;
|
||||
int first_track;
|
||||
int last_track;
|
||||
|
||||
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
|
||||
|
||||
dev->ops->get_tracks(dev, &first_track, &last_track);
|
||||
track_info_t ti;
|
||||
raw_track_info_t rti[256] = { 0 };
|
||||
int num = 0;
|
||||
int len = 4;
|
||||
int first_track;
|
||||
int last_track;
|
||||
|
||||
/* Bytes 2 and 3 = Number of first and last sessions */
|
||||
b[2] = b[3] = 1;
|
||||
|
||||
for (int i = 0; i <= last_track; i++) {
|
||||
dev->ops->get_track_info(dev, i + 1, 0, &ti);
|
||||
if (dev->ops->get_raw_track_info != NULL) {
|
||||
cdrom_log("read_toc_raw(%08X, %08X): Raw tracks\n", dev, b);
|
||||
pclog("read_toc_raw(%016" PRIXPTR ", %016" PRIXPTR "): Raw tracks\n",
|
||||
(uintptr_t) dev, (uintptr_t) b);
|
||||
|
||||
dev->ops->get_raw_track_info(dev, &num, (raw_track_info_t *) rti);
|
||||
|
||||
if (num != 0) for (int i = 0; i < num; i++) {
|
||||
b[len++] = rti[i].session;
|
||||
b[len++] = rti[i].adr_ctl;
|
||||
b[len++] = rti[i].tno;
|
||||
b[len++] = rti[i].point;
|
||||
b[len++] = rti[i].m;
|
||||
b[len++] = rti[i].s;
|
||||
b[len++] = rti[i].f;
|
||||
b[len++] = rti[i].zero;
|
||||
b[len++] = rti[i].pm;
|
||||
b[len++] = rti[i].ps;
|
||||
b[len++] = rti[i].pf;
|
||||
}
|
||||
} else {
|
||||
cdrom_log("read_toc_raw(%08X, %08X): Cooked tracks\n", dev, b);
|
||||
pclog("read_toc_raw(%016" PRIXPTR ", %016" PRIXPTR "): Cooked tracks\n",
|
||||
(uintptr_t) dev, (uintptr_t) b);
|
||||
|
||||
dev->ops->get_tracks(dev, &first_track, &last_track);
|
||||
|
||||
dev->ops->get_track_info(dev, 1, 0, &ti);
|
||||
|
||||
b[len++] = 1; /* Session number */
|
||||
b[len++] = ti.attr; /* Track ADR and Control */
|
||||
b[len++] = 0; /* TNO (always 0) */
|
||||
b[len++] = 0xA0; /* Point (for track points - track number) */
|
||||
/* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = ti.number; /* First track number */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
|
||||
dev->ops->get_track_info(dev, last_track, 0, &ti);
|
||||
|
||||
b[len++] = 1; /* Session number */
|
||||
b[len++] = ti.attr; /* Track ADR and Control */
|
||||
b[len++] = 0; /* TNO (always 0) */
|
||||
b[len++] = 0xA1; /* Point (for track points - track number) */
|
||||
/* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = ti.number; /* First track number */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
|
||||
dev->ops->get_track_info(dev, last_track + 1, 0, &ti);
|
||||
|
||||
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
|
||||
|
||||
b[len++] = 1; /* Session number */
|
||||
b[len++] = ti.attr; /* Track ADR and Control */
|
||||
b[len++] = 0; /* TNO (always 0) */
|
||||
b[len++] = ti.number; /* Point (for track points - track number) */
|
||||
b[len++] = 0xA2; /* Point (for track points - track number) */
|
||||
/* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
@@ -1196,6 +1250,25 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
|
||||
b[len++] = ti.m; /* PM */
|
||||
b[len++] = ti.s; /* PS */
|
||||
b[len++] = ti.f; /* PF */
|
||||
|
||||
for (int i = 0; i < last_track; i++) {
|
||||
dev->ops->get_track_info(dev, i + 1, 0, &ti);
|
||||
|
||||
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
|
||||
|
||||
b[len++] = 1; /* Session number */
|
||||
b[len++] = ti.attr; /* Track ADR and Control */
|
||||
b[len++] = 0; /* TNO (always 0) */
|
||||
b[len++] = ti.number; /* Point (for track points - track number) */
|
||||
/* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = ti.m; /* PM */
|
||||
b[len++] = ti.s; /* PS */
|
||||
b[len++] = ti.f; /* PF */
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
@@ -1954,6 +2027,22 @@ cdrom_drive_reset(cdrom_t *dev)
|
||||
dev->get_channel = NULL;
|
||||
}
|
||||
|
||||
/* Will be removed later. */
|
||||
#ifdef ENABLE_CDROM_LOG
|
||||
static void
|
||||
cdrom_toc_dump(cdrom_t *dev)
|
||||
{
|
||||
uint8_t b[65536] = { 0 };
|
||||
int len = cdrom_read_toc(dev, b, CD_TOC_RAW, 0, 0, 65536);
|
||||
const char *fn2 = "d:\\86boxnew\\toc_cue.dmp";
|
||||
FILE * f = fopen(fn2, "wb");
|
||||
fwrite(b, 1, len, f);
|
||||
fflush(f);
|
||||
fclose(f);
|
||||
pclog("Written TOC of %i bytes to %s\n", len, fn2);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
cdrom_hard_reset(void)
|
||||
{
|
||||
@@ -1994,6 +2083,10 @@ cdrom_hard_reset(void)
|
||||
cdrom_ioctl_open(dev, dev->image_path);
|
||||
else
|
||||
cdrom_image_open(dev, dev->image_path);
|
||||
|
||||
#ifdef ENABLE_CDROM_LOG
|
||||
cdrom_toc_dump(dev);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2095,15 +2188,13 @@ cdrom_reload(uint8_t id)
|
||||
strcpy(dev->image_path, dev->prev_image_path);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (strlen(dev->prev_image_path) > 0) {
|
||||
if ((strlen(dev->image_path) >= 1) && (dev->image_path[strlen(dev->image_path) - 1] == '/'))
|
||||
dev->image_path[strlen(dev->image_path) - 1] = '\\';
|
||||
}
|
||||
if ((strlen(dev->prev_image_path) > 0) && (strlen(dev->image_path) >= 1) &&
|
||||
(dev->image_path[strlen(dev->image_path) - 1] == '/'))
|
||||
dev->image_path[strlen(dev->image_path) - 1] = '\\';
|
||||
#else
|
||||
if (strlen(dev->prev_image_path) > 0) {
|
||||
if ((strlen(dev->image_path) >= 1) && (dev->image_path[strlen(dev->image_path) - 1] == '\\'))
|
||||
dev->image_path[strlen(dev->image_path) - 1] = '/';
|
||||
}
|
||||
if ((strlen(dev->prev_image_path) > 0) && (strlen(dev->image_path) >= 1) &&
|
||||
(dev->image_path[strlen(dev->image_path) - 1] == '\\'))
|
||||
dev->image_path[strlen(dev->image_path) - 1] = '/';
|
||||
#endif
|
||||
|
||||
if ((strlen(dev->image_path) != 0) && (strstr(dev->image_path, "ioctl://") == dev->image_path))
|
||||
@@ -2111,6 +2202,10 @@ cdrom_reload(uint8_t id)
|
||||
else
|
||||
cdrom_image_open(dev, dev->image_path);
|
||||
|
||||
#ifdef ENABLE_CDROM_LOG
|
||||
cdrom_toc_dump(dev);
|
||||
#endif
|
||||
|
||||
cdrom_insert(id);
|
||||
}
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ cdrom_image_log(const char *fmt, ...)
|
||||
static void
|
||||
image_get_tracks(cdrom_t *dev, int *first, int *last)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
TMSF tmsf;
|
||||
|
||||
cdi_get_audio_tracks(img, first, last, &tmsf);
|
||||
@@ -70,7 +70,7 @@ image_get_tracks(cdrom_t *dev, int *first, int *last)
|
||||
static void
|
||||
image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
TMSF tmsf;
|
||||
|
||||
cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr);
|
||||
@@ -83,7 +83,7 @@ image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
|
||||
static void
|
||||
image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
TMSF rel_pos;
|
||||
TMSF abs_pos;
|
||||
|
||||
@@ -105,7 +105,7 @@ image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
|
||||
static int
|
||||
image_get_capacity(cdrom_t *dev)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
int first_track;
|
||||
int last_track;
|
||||
int number;
|
||||
@@ -130,7 +130,7 @@ image_get_capacity(cdrom_t *dev)
|
||||
static int
|
||||
image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
uint8_t attr;
|
||||
TMSF tmsf;
|
||||
int m;
|
||||
@@ -162,7 +162,7 @@ image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
|
||||
static int
|
||||
image_is_track_pre(cdrom_t *dev, uint32_t lba)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
int track;
|
||||
|
||||
/* GetTrack requires LBA. */
|
||||
@@ -177,7 +177,7 @@ image_is_track_pre(cdrom_t *dev, uint32_t lba)
|
||||
static int
|
||||
image_sector_size(struct cdrom *dev, uint32_t lba)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
|
||||
return cdi_get_sector_size(img, lba);
|
||||
}
|
||||
@@ -185,7 +185,7 @@ image_sector_size(struct cdrom *dev, uint32_t lba)
|
||||
static int
|
||||
image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
|
||||
switch (type) {
|
||||
case CD_READ_DATA:
|
||||
@@ -206,7 +206,7 @@ image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
|
||||
static int
|
||||
image_track_type(cdrom_t *dev, uint32_t lba)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
|
||||
if (img) {
|
||||
if (image_is_track_audio(dev, lba, 0))
|
||||
@@ -229,14 +229,14 @@ image_ext_medium_changed(cdrom_t *dev)
|
||||
static void
|
||||
image_exit(cdrom_t *dev)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->local;
|
||||
|
||||
cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path);
|
||||
dev->cd_status = CD_STATUS_EMPTY;
|
||||
|
||||
if (img) {
|
||||
cdi_close(img);
|
||||
dev->image = NULL;
|
||||
dev->local = NULL;
|
||||
}
|
||||
|
||||
dev->ops = NULL;
|
||||
@@ -245,6 +245,7 @@ image_exit(cdrom_t *dev)
|
||||
static const cdrom_ops_t cdrom_image_ops = {
|
||||
image_get_tracks,
|
||||
image_get_track_info,
|
||||
NULL,
|
||||
image_get_subchannel,
|
||||
image_is_track_pre,
|
||||
image_sector_size,
|
||||
@@ -282,7 +283,7 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
return image_open_abort(dev);
|
||||
|
||||
memset(img, 0, sizeof(cd_img_t));
|
||||
dev->image = img;
|
||||
dev->local = img;
|
||||
|
||||
/* Open the image. */
|
||||
int i = cdi_set_device(img, fn);
|
||||
@@ -298,6 +299,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
dev->cd_buflen = 0;
|
||||
dev->cdrom_capacity = image_get_capacity(dev);
|
||||
cdrom_image_log("CD-ROM capacity: %i sectors (%" PRIi64 " bytes)\n", dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity) << 11ULL);
|
||||
int cm, cs, cf;
|
||||
cf = dev->cdrom_capacity % 75;
|
||||
cs = (dev->cdrom_capacity / 75) % 60;
|
||||
cm = (dev->cdrom_capacity / 75) / 60;
|
||||
pclog("CD-ROM capacity: %i sectors (%" PRIi64 " bytes) (time: %02i:%02i:%02i)\n",
|
||||
dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity - 150ULL) * 2352ULL, cm, cs, cf);
|
||||
|
||||
/* Attach this handler to the drive. */
|
||||
dev->ops = &cdrom_image_ops;
|
||||
|
||||
@@ -1189,7 +1189,6 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
/* Add lead out track. */
|
||||
trk.number++;
|
||||
trk.track_number = 0xAA;
|
||||
trk.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
|
||||
trk.start = 0;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
#include <86box/config.h>
|
||||
#include <86box/path.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/plat_cdrom.h>
|
||||
#include <86box/scsi_device.h>
|
||||
#include <86box/cdrom.h>
|
||||
#include <86box/plat_cdrom.h>
|
||||
|
||||
#ifdef ENABLE_CDROM_IOCTL_LOG
|
||||
int cdrom_ioctl_do_log = ENABLE_CDROM_IOCTL_LOG;
|
||||
@@ -56,19 +56,19 @@ cdrom_ioctl_log(const char *fmt, ...)
|
||||
#define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
|
||||
|
||||
static void
|
||||
ioctl_get_tracks(UNUSED(cdrom_t *dev), int *first, int *last)
|
||||
ioctl_get_tracks(cdrom_t *dev, int *first, int *last)
|
||||
{
|
||||
TMSF tmsf;
|
||||
|
||||
plat_cdrom_get_audio_tracks(first, last, &tmsf);
|
||||
plat_cdrom_get_audio_tracks(dev->local, first, last, &tmsf);
|
||||
}
|
||||
|
||||
static void
|
||||
ioctl_get_track_info(UNUSED(cdrom_t *dev), uint32_t track, int end, track_info_t *ti)
|
||||
ioctl_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
|
||||
{
|
||||
TMSF tmsf;
|
||||
|
||||
plat_cdrom_get_audio_track_info(end, track, &ti->number, &tmsf, &ti->attr);
|
||||
plat_cdrom_get_audio_track_info(dev->local, end, track, &ti->number, &tmsf, &ti->attr);
|
||||
|
||||
ti->m = tmsf.min;
|
||||
ti->s = tmsf.sec;
|
||||
@@ -76,13 +76,19 @@ ioctl_get_track_info(UNUSED(cdrom_t *dev), uint32_t track, int end, track_info_t
|
||||
}
|
||||
|
||||
static void
|
||||
ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc)
|
||||
ioctl_get_raw_track_info(cdrom_t *dev, int *num, raw_track_info_t *rti)
|
||||
{
|
||||
plat_cdrom_get_raw_track_info(dev->local, num, rti);
|
||||
}
|
||||
|
||||
static void
|
||||
ioctl_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
|
||||
{
|
||||
TMSF rel_pos;
|
||||
TMSF abs_pos;
|
||||
|
||||
if ((dev->cd_status == CD_STATUS_PLAYING) || (dev->cd_status == CD_STATUS_PAUSED)) {
|
||||
const uint32_t trk = plat_cdrom_get_track_start(lba, &subc->attr, &subc->track);
|
||||
const uint32_t trk = plat_cdrom_get_track_start(dev->local, lba, &subc->attr, &subc->track);
|
||||
|
||||
FRAMES_TO_MSF(lba + 150, &abs_pos.min, &abs_pos.sec, &abs_pos.fr);
|
||||
|
||||
@@ -91,7 +97,7 @@ ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc)
|
||||
|
||||
subc->index = 1;
|
||||
} else
|
||||
plat_cdrom_get_audio_sub(lba, &subc->attr, &subc->track, &subc->index,
|
||||
plat_cdrom_get_audio_sub(dev->local, lba, &subc->attr, &subc->track, &subc->index,
|
||||
&rel_pos, &abs_pos);
|
||||
|
||||
subc->abs_m = abs_pos.min;
|
||||
@@ -107,11 +113,11 @@ ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc)
|
||||
}
|
||||
|
||||
static int
|
||||
ioctl_get_capacity(UNUSED(cdrom_t *dev))
|
||||
ioctl_get_capacity(cdrom_t *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = plat_cdrom_get_last_block();
|
||||
ret = plat_cdrom_get_last_block(dev->local);
|
||||
cdrom_ioctl_log("GetCapacity=%x.\n", ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -134,35 +140,35 @@ ioctl_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
|
||||
}
|
||||
|
||||
/* GetTrack requires LBA. */
|
||||
return plat_cdrom_is_track_audio(pos);
|
||||
return plat_cdrom_is_track_audio(dev->local, pos);
|
||||
}
|
||||
|
||||
static int
|
||||
ioctl_is_track_pre(UNUSED(cdrom_t *dev), uint32_t lba)
|
||||
ioctl_is_track_pre(cdrom_t *dev, uint32_t lba)
|
||||
{
|
||||
return plat_cdrom_is_track_pre(lba);
|
||||
return plat_cdrom_is_track_pre(dev->local, lba);
|
||||
}
|
||||
|
||||
static int
|
||||
ioctl_sector_size(UNUSED(cdrom_t *dev), uint32_t lba)
|
||||
ioctl_sector_size(cdrom_t *dev, uint32_t lba)
|
||||
{
|
||||
cdrom_ioctl_log("LBA=%x.\n", lba);
|
||||
return plat_cdrom_get_sector_size(lba);
|
||||
return plat_cdrom_get_sector_size(dev->local, lba);
|
||||
}
|
||||
|
||||
static int
|
||||
ioctl_read_sector(UNUSED(cdrom_t *dev), int type, uint8_t *b, uint32_t lba)
|
||||
ioctl_read_sector(cdrom_t *dev, int type, uint8_t *b, uint32_t lba)
|
||||
{
|
||||
switch (type) {
|
||||
case CD_READ_DATA:
|
||||
cdrom_ioctl_log("cdrom_ioctl_read_sector(): Data.\n");
|
||||
return plat_cdrom_read_sector(b, 0, lba);
|
||||
return plat_cdrom_read_sector(dev->local, b, 0, lba);
|
||||
case CD_READ_AUDIO:
|
||||
cdrom_ioctl_log("cdrom_ioctl_read_sector(): Audio.\n");
|
||||
return plat_cdrom_read_sector(b, 1, lba);
|
||||
return plat_cdrom_read_sector(dev->local, b, 1, lba);
|
||||
case CD_READ_RAW:
|
||||
cdrom_ioctl_log("cdrom_ioctl_read_sector(): Raw.\n");
|
||||
return plat_cdrom_read_sector(b, 1, lba);
|
||||
return plat_cdrom_read_sector(dev->local, b, 1, lba);
|
||||
default:
|
||||
cdrom_ioctl_log("cdrom_ioctl_read_sector(): Unknown CD read type.\n");
|
||||
break;
|
||||
@@ -191,7 +197,7 @@ ioctl_ext_medium_changed(cdrom_t *dev)
|
||||
if ((dev->cd_status == CD_STATUS_PLAYING) || (dev->cd_status == CD_STATUS_PAUSED))
|
||||
ret = 0;
|
||||
else
|
||||
ret = plat_cdrom_ext_medium_changed();
|
||||
ret = plat_cdrom_ext_medium_changed(dev->local);
|
||||
|
||||
if (ret == 1) {
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
@@ -208,7 +214,8 @@ ioctl_exit(cdrom_t *dev)
|
||||
cdrom_ioctl_log("CDROM: ioctl_exit(%s)\n", dev->image_path);
|
||||
dev->cd_status = CD_STATUS_EMPTY;
|
||||
|
||||
plat_cdrom_close();
|
||||
plat_cdrom_close(dev->local);
|
||||
dev->local = NULL;
|
||||
|
||||
dev->ops = NULL;
|
||||
}
|
||||
@@ -216,6 +223,7 @@ ioctl_exit(cdrom_t *dev)
|
||||
static const cdrom_ops_t cdrom_ioctl_ops = {
|
||||
ioctl_get_tracks,
|
||||
ioctl_get_track_info,
|
||||
ioctl_get_raw_track_info,
|
||||
ioctl_get_subchannel,
|
||||
ioctl_is_track_pre,
|
||||
ioctl_sector_size,
|
||||
@@ -238,9 +246,10 @@ int
|
||||
cdrom_ioctl_open(cdrom_t *dev, const char *drv)
|
||||
{
|
||||
const char *actual_drv = &(drv[8]);
|
||||
int local_size = plat_cdrom_get_local_size();
|
||||
|
||||
/* Make sure to not STRCPY if the two are pointing
|
||||
at the same place. */
|
||||
at the same place. */
|
||||
if (drv != dev->image_path)
|
||||
strcpy(dev->image_path, drv);
|
||||
|
||||
@@ -248,7 +257,9 @@ cdrom_ioctl_open(cdrom_t *dev, const char *drv)
|
||||
if (strstr(drv, "ioctl://") != drv)
|
||||
return cdrom_ioctl_open_abort(dev);
|
||||
cdrom_ioctl_log("actual_drv = %s\n", actual_drv);
|
||||
int i = plat_cdrom_set_drive(actual_drv);
|
||||
if (dev->local == NULL)
|
||||
dev->local = calloc(1, local_size);
|
||||
int i = plat_cdrom_set_drive(dev->local, actual_drv);
|
||||
if (!i)
|
||||
return cdrom_ioctl_open_abort(dev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user