clang-format in src/cdrom/
This commit is contained in:
@@ -29,76 +29,71 @@
|
||||
#include <86box/scsi_device.h>
|
||||
#include <86box/sound.h>
|
||||
|
||||
|
||||
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
|
||||
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
|
||||
of the audio while audio still plays. With an absolute conversion, the counter is fine. */
|
||||
#undef MSFtoLBA
|
||||
#define MSFtoLBA(m,s,f) ((((m*60)+s)*75)+f)
|
||||
#define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
|
||||
|
||||
#define RAW_SECTOR_SIZE 2352
|
||||
#define COOKED_SECTOR_SIZE 2048
|
||||
#define RAW_SECTOR_SIZE 2352
|
||||
#define COOKED_SECTOR_SIZE 2048
|
||||
|
||||
#define MIN_SEEK 2000
|
||||
#define MAX_SEEK 333333
|
||||
#define MIN_SEEK 2000
|
||||
#define MAX_SEEK 333333
|
||||
|
||||
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
#define CD_DCB(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))
|
||||
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
#define CD_DCB(x) ((((x) &0xf0) >> 4) * 10 + ((x) &0x0f))
|
||||
|
||||
#pragma pack(push,1)
|
||||
#pragma pack(push, 1)
|
||||
typedef struct {
|
||||
uint8_t user_data[2048],
|
||||
ecc[288];
|
||||
ecc[288];
|
||||
} m1_data_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t sub_header[8],
|
||||
user_data[2328];
|
||||
user_data[2328];
|
||||
} m2_data_t;
|
||||
|
||||
typedef union {
|
||||
m1_data_t m1_data;
|
||||
m2_data_t m2_data;
|
||||
uint8_t raw_data[2336];
|
||||
uint8_t raw_data[2336];
|
||||
} sector_data_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t sync[12];
|
||||
uint8_t header[4];
|
||||
uint8_t sync[12];
|
||||
uint8_t header[4];
|
||||
sector_data_t data;
|
||||
} sector_raw_data_t;
|
||||
|
||||
typedef union {
|
||||
sector_raw_data_t sector_data;
|
||||
uint8_t raw_data[2352];
|
||||
uint8_t raw_data[2352];
|
||||
} sector_t;
|
||||
|
||||
typedef struct {
|
||||
sector_t sector;
|
||||
uint8_t c2[296];
|
||||
uint8_t subchannel_raw[96];
|
||||
uint8_t subchannel_q[16];
|
||||
uint8_t subchannel_rw[96];
|
||||
uint8_t c2[296];
|
||||
uint8_t subchannel_raw[96];
|
||||
uint8_t subchannel_q[16];
|
||||
uint8_t subchannel_rw[96];
|
||||
} cdrom_sector_t;
|
||||
|
||||
typedef union {
|
||||
cdrom_sector_t cdrom_sector;
|
||||
uint8_t buffer[2856];
|
||||
uint8_t buffer[2856];
|
||||
} sector_buffer_t;
|
||||
#pragma pack(pop)
|
||||
|
||||
static int cdrom_sector_size;
|
||||
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
|
||||
static uint8_t extra_buffer[296];
|
||||
|
||||
static int cdrom_sector_size;
|
||||
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
|
||||
static uint8_t extra_buffer[296];
|
||||
|
||||
|
||||
cdrom_t cdrom[CDROM_NUM];
|
||||
|
||||
cdrom_t cdrom[CDROM_NUM];
|
||||
|
||||
#ifdef ENABLE_CDROM_LOG
|
||||
int cdrom_do_log = ENABLE_CDROM_LOG;
|
||||
|
||||
int cdrom_do_log = ENABLE_CDROM_LOG;
|
||||
|
||||
void
|
||||
cdrom_log(const char *fmt, ...)
|
||||
@@ -112,10 +107,9 @@ cdrom_log(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define cdrom_log(fmt, ...)
|
||||
# define cdrom_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
cdrom_lba_to_msf_accurate(int lba)
|
||||
{
|
||||
@@ -123,7 +117,7 @@ cdrom_lba_to_msf_accurate(int lba)
|
||||
int m, s, f;
|
||||
|
||||
pos = lba + 150;
|
||||
f = pos % 75;
|
||||
f = pos % 75;
|
||||
pos -= f;
|
||||
pos /= 75;
|
||||
s = pos % 60;
|
||||
@@ -134,11 +128,10 @@ cdrom_lba_to_msf_accurate(int lba)
|
||||
return ((m << 16) | (s << 8) | f);
|
||||
}
|
||||
|
||||
|
||||
static double
|
||||
cdrom_get_short_seek(cdrom_t *dev)
|
||||
{
|
||||
switch(dev->cur_speed) {
|
||||
switch (dev->cur_speed) {
|
||||
case 0:
|
||||
fatal("CD-ROM %i: 0x speed\n", dev->id);
|
||||
return 0.0;
|
||||
@@ -148,16 +141,37 @@ cdrom_get_short_seek(cdrom_t *dev)
|
||||
return 160.0;
|
||||
case 3:
|
||||
return 150.0;
|
||||
case 4: case 5: case 6: case 7: case 8:
|
||||
case 9: case 10: case 11:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
return 112.0;
|
||||
case 12: case 13: case 14: case 15:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
return 75.0;
|
||||
case 16: case 17: case 18: case 19:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
return 58.0;
|
||||
case 20: case 21: case 22: case 23:
|
||||
case 40: case 41: case 42: case 43:
|
||||
case 44: case 45: case 46: case 47:
|
||||
case 20:
|
||||
case 21:
|
||||
case 22:
|
||||
case 23:
|
||||
case 40:
|
||||
case 41:
|
||||
case 42:
|
||||
case 43:
|
||||
case 44:
|
||||
case 45:
|
||||
case 46:
|
||||
case 47:
|
||||
case 48:
|
||||
return 50.0;
|
||||
default:
|
||||
@@ -166,11 +180,10 @@ cdrom_get_short_seek(cdrom_t *dev)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static double
|
||||
cdrom_get_long_seek(cdrom_t *dev)
|
||||
{
|
||||
switch(dev->cur_speed) {
|
||||
switch (dev->cur_speed) {
|
||||
case 0:
|
||||
fatal("CD-ROM %i: 0x speed\n", dev->id);
|
||||
return 0.0;
|
||||
@@ -180,16 +193,37 @@ cdrom_get_long_seek(cdrom_t *dev)
|
||||
return 1000.0;
|
||||
case 3:
|
||||
return 900.0;
|
||||
case 4: case 5: case 6: case 7: case 8:
|
||||
case 9: case 10: case 11:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
return 675.0;
|
||||
case 12: case 13: case 14: case 15:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
return 400.0;
|
||||
case 16: case 17: case 18: case 19:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
return 350.0;
|
||||
case 20: case 21: case 22: case 23:
|
||||
case 40: case 41: case 42: case 43:
|
||||
case 44: case 45: case 46: case 47:
|
||||
case 20:
|
||||
case 21:
|
||||
case 22:
|
||||
case 23:
|
||||
case 40:
|
||||
case 41:
|
||||
case 42:
|
||||
case 43:
|
||||
case 44:
|
||||
case 45:
|
||||
case 46:
|
||||
case 47:
|
||||
case 48:
|
||||
return 300.0;
|
||||
default:
|
||||
@@ -198,12 +232,11 @@ cdrom_get_long_seek(cdrom_t *dev)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
double
|
||||
cdrom_seek_time(cdrom_t *dev)
|
||||
{
|
||||
uint32_t diff = dev->seek_diff;
|
||||
double sd = (double) (MAX_SEEK - MIN_SEEK);
|
||||
double sd = (double) (MAX_SEEK - MIN_SEEK);
|
||||
|
||||
if (diff < MIN_SEEK)
|
||||
return 0.0;
|
||||
@@ -215,7 +248,6 @@ cdrom_seek_time(cdrom_t *dev)
|
||||
return cdrom_get_short_seek(dev) + ((cdrom_get_long_seek(dev) * ((double) diff)) / sd);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_stop(cdrom_t *dev)
|
||||
{
|
||||
@@ -223,7 +255,6 @@ cdrom_stop(cdrom_t *dev)
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_seek(cdrom_t *dev, uint32_t pos)
|
||||
{
|
||||
@@ -232,11 +263,10 @@ cdrom_seek(cdrom_t *dev, uint32_t pos)
|
||||
|
||||
cdrom_log("CD-ROM %i: Seek to LBA %08X\n", dev->id, pos);
|
||||
|
||||
dev->seek_pos = pos;
|
||||
dev->seek_pos = pos;
|
||||
cdrom_stop(dev);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdrom_is_pre(cdrom_t *dev, uint32_t lba)
|
||||
{
|
||||
@@ -246,7 +276,6 @@ cdrom_is_pre(cdrom_t *dev, uint32_t lba)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
|
||||
{
|
||||
@@ -273,14 +302,14 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
|
||||
memset(&(dev->cd_buffer[dev->cd_buflen]), 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
dev->cd_buflen = len;
|
||||
ret = 0;
|
||||
ret = 0;
|
||||
}
|
||||
} else {
|
||||
cdrom_log("CD-ROM %i: Playing completed\n", dev->id);
|
||||
memset(&dev->cd_buffer[dev->cd_buflen], 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
|
||||
dev->cd_status = CD_STATUS_PLAYING_COMPLETED;
|
||||
dev->cd_buflen = len;
|
||||
ret = 0;
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,12 +321,11 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
|
||||
{
|
||||
track_info_t ti;
|
||||
int m = 0, s = 0, f = 0;
|
||||
int m = 0, s = 0, f = 0;
|
||||
|
||||
if (dev->cd_status == CD_STATUS_DATA_ONLY)
|
||||
return 0;
|
||||
@@ -325,9 +353,9 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
|
||||
} else
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
|
||||
m = (len >> 16) & 0xff;
|
||||
s = (len >> 8) & 0xff;
|
||||
f = len & 0xff;
|
||||
m = (len >> 16) & 0xff;
|
||||
s = (len >> 8) & 0xff;
|
||||
f = len & 0xff;
|
||||
len = MSFtoLBA(m, s, f) - 150;
|
||||
|
||||
cdrom_log("CD-ROM %i: MSF - pos = %08X len = %08X\n", dev->id, pos, len);
|
||||
@@ -347,15 +375,14 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->seek_pos = pos;
|
||||
dev->cd_end = len;
|
||||
dev->seek_pos = pos;
|
||||
dev->cd_end = len;
|
||||
dev->cd_status = CD_STATUS_PLAYING;
|
||||
dev->cd_buflen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
|
||||
{
|
||||
@@ -367,9 +394,9 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
|
||||
switch (type) {
|
||||
case 0x40:
|
||||
cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
break;
|
||||
}
|
||||
@@ -382,13 +409,12 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->seek_pos = pos;
|
||||
dev->noplay = !playbit;
|
||||
dev->seek_pos = pos;
|
||||
dev->noplay = !playbit;
|
||||
dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
|
||||
{
|
||||
@@ -404,9 +430,9 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
|
||||
switch (type) {
|
||||
case 0x40:
|
||||
cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
break;
|
||||
}
|
||||
@@ -419,12 +445,11 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->cd_end = pos;
|
||||
dev->cd_end = pos;
|
||||
dev->cd_buflen = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
|
||||
{
|
||||
@@ -432,14 +457,13 @@ cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
|
||||
dev->cd_status = (dev->cd_status & 0xfe) | (resume & 0x01);
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
|
||||
{
|
||||
uint8_t ret;
|
||||
uint8_t ret;
|
||||
subchannel_t subc;
|
||||
int pos = 1;
|
||||
uint32_t dat;
|
||||
int pos = 1;
|
||||
uint32_t dat;
|
||||
|
||||
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
|
||||
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i\n", subc.abs_m, subc.abs_s, subc.abs_f);
|
||||
@@ -474,12 +498,12 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
|
||||
b[pos + 3] = subc.rel_f;
|
||||
pos += 4;
|
||||
} else {
|
||||
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
|
||||
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
|
||||
b[pos++] = (dat >> 24) & 0xff;
|
||||
b[pos++] = (dat >> 16) & 0xff;
|
||||
b[pos++] = (dat >> 8) & 0xff;
|
||||
b[pos++] = dat & 0xff;
|
||||
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
|
||||
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
|
||||
b[pos++] = (dat >> 24) & 0xff;
|
||||
b[pos++] = (dat >> 16) & 0xff;
|
||||
b[pos++] = (dat >> 8) & 0xff;
|
||||
@@ -489,11 +513,10 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
|
||||
{
|
||||
uint8_t ret;
|
||||
uint8_t ret;
|
||||
subchannel_t subc;
|
||||
|
||||
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
|
||||
@@ -522,14 +545,13 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf)
|
||||
{
|
||||
track_info_t ti;
|
||||
int i, len = 4;
|
||||
int first_track, last_track;
|
||||
uint32_t temp;
|
||||
int i, len = 4;
|
||||
int first_track, last_track;
|
||||
uint32_t temp;
|
||||
|
||||
cdrom_log("read_toc_normal(%08X, %08X, %02X, %i)\n", dev, b, start_track, msf);
|
||||
|
||||
@@ -571,18 +593,18 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
|
||||
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
|
||||
dev->ops->get_track_info(dev, i + 1, 0, &ti);
|
||||
|
||||
b[len++] = 0; /* reserved */
|
||||
b[len++] = ti.attr;
|
||||
b[len++] = ti.number; /* track number */
|
||||
b[len++] = 0; /* reserved */
|
||||
b[len++] = 0; /* reserved */
|
||||
b[len++] = ti.attr;
|
||||
b[len++] = ti.number; /* track number */
|
||||
b[len++] = 0; /* reserved */
|
||||
|
||||
if (msf) {
|
||||
if (msf) {
|
||||
b[len++] = 0;
|
||||
b[len++] = ti.m;
|
||||
b[len++] = ti.s;
|
||||
b[len++] = ti.f;
|
||||
} else {
|
||||
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
|
||||
} else {
|
||||
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
|
||||
b[len++] = temp >> 24;
|
||||
b[len++] = temp >> 16;
|
||||
b[len++] = temp >> 8;
|
||||
@@ -593,13 +615,12 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
|
||||
{
|
||||
track_info_t ti;
|
||||
int len = 4;
|
||||
uint32_t temp;
|
||||
int len = 4;
|
||||
uint32_t temp;
|
||||
|
||||
cdrom_log("read_toc_session(%08X, %08X, %i)\n", dev, b, msf);
|
||||
|
||||
@@ -613,7 +634,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
|
||||
b[len++] = 0; /* reserved */
|
||||
b[len++] = ti.attr;
|
||||
b[len++] = ti.number; /* track number */
|
||||
b[len++] = 0; /* reserved */
|
||||
b[len++] = 0; /* reserved */
|
||||
|
||||
if (msf) {
|
||||
b[len++] = 0;
|
||||
@@ -621,7 +642,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
|
||||
b[len++] = ti.s;
|
||||
b[len++] = ti.f;
|
||||
} else {
|
||||
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
|
||||
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
|
||||
b[len++] = temp >> 24;
|
||||
b[len++] = temp >> 16;
|
||||
b[len++] = temp >> 8;
|
||||
@@ -631,13 +652,12 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_toc_raw(cdrom_t *dev, unsigned char *b)
|
||||
{
|
||||
track_info_t ti;
|
||||
int i, len = 4;
|
||||
int first_track, last_track;
|
||||
int i, len = 4;
|
||||
int first_track, last_track;
|
||||
|
||||
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
|
||||
|
||||
@@ -651,13 +671,13 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
|
||||
|
||||
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++] = ti.m; /* M */
|
||||
b[len++] = ti.s; /* S */
|
||||
b[len++] = ti.f; /* 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++] = ti.m; /* M */
|
||||
b[len++] = ti.s; /* S */
|
||||
b[len++] = ti.f; /* F */
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
b[len++] = 0;
|
||||
@@ -666,13 +686,12 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len)
|
||||
{
|
||||
int len;
|
||||
|
||||
switch(type) {
|
||||
switch (type) {
|
||||
case CD_TOC_NORMAL:
|
||||
len = read_toc_normal(dev, b, start_track, msf);
|
||||
break;
|
||||
@@ -695,13 +714,12 @@ cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_tra
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
/* A new API call for Mitsumi CD-ROM. */
|
||||
void
|
||||
cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
|
||||
{
|
||||
track_info_t ti;
|
||||
int first_track, last_track;
|
||||
int first_track, last_track;
|
||||
|
||||
if (dev != NULL) {
|
||||
dev->ops->get_tracks(dev, &first_track, &last_track);
|
||||
@@ -720,12 +738,11 @@ cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
|
||||
memset(buf, 0x00, 9);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type)
|
||||
{
|
||||
track_info_t ti;
|
||||
int first_track, last_track;
|
||||
int first_track, last_track;
|
||||
|
||||
dev->ops->get_tracks(dev, &first_track, &last_track);
|
||||
|
||||
@@ -760,11 +777,10 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
|
||||
{
|
||||
if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */
|
||||
if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */
|
||||
cdrom_log("CD-ROM %i: [Any Mode] 0x08/0x80/0x88 are illegal modes\n", id);
|
||||
return 0;
|
||||
}
|
||||
@@ -780,22 +796,22 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */
|
||||
if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */
|
||||
cdrom_log("CD-ROM %i: [Any Data Mode] EDC/ECC without user data is an illegal mode\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */
|
||||
if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */
|
||||
cdrom_log("CD-ROM %i: [Any Data Mode] 0x90/0x98/0xC0/0xC8 are illegal modes\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (((type > 3) && (type != 8)) || (mode2 && (mode2 & 0x03))) {
|
||||
if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */
|
||||
if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */
|
||||
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0x30/0x38 are illegal modes\n", id);
|
||||
return 0;
|
||||
}
|
||||
if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */
|
||||
if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */
|
||||
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0xBx and 0xDx are illegal modes\n", id);
|
||||
return 0;
|
||||
}
|
||||
@@ -805,7 +821,6 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, int mode2, int len)
|
||||
{
|
||||
@@ -833,7 +848,6 @@ read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, i
|
||||
memset(bb, 0, 288);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
|
||||
{
|
||||
@@ -844,7 +858,6 @@ read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
|
||||
cdrom_sector_size = 2352;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
|
||||
{
|
||||
@@ -899,7 +912,6 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
|
||||
{
|
||||
@@ -944,7 +956,6 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
|
||||
{
|
||||
@@ -996,7 +1007,6 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
|
||||
{
|
||||
@@ -1040,15 +1050,14 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type,
|
||||
int cdrom_sector_flags, int *len)
|
||||
int cdrom_sector_flags, int *len)
|
||||
{
|
||||
uint8_t *b, *temp_b;
|
||||
uint32_t msf, lba;
|
||||
int audio = 0, mode2 = 0;
|
||||
int m, s, f;
|
||||
int audio = 0, mode2 = 0;
|
||||
int m, s, f;
|
||||
|
||||
if (dev->cd_status == CD_STATUS_EMPTY)
|
||||
return 0;
|
||||
@@ -1058,9 +1067,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
|
||||
*len = 0;
|
||||
|
||||
if (ismsf) {
|
||||
m = (sector >> 16) & 0xff;
|
||||
s = (sector >> 8) & 0xff;
|
||||
f = sector & 0xff;
|
||||
m = (sector >> 16) & 0xff;
|
||||
s = (sector >> 8) & 0xff;
|
||||
f = sector & 0xff;
|
||||
lba = MSFtoLBA(m, s, f) - 150;
|
||||
msf = sector;
|
||||
} else {
|
||||
@@ -1185,7 +1194,6 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* Peform a master init on the entire module. */
|
||||
void
|
||||
cdrom_global_init(void)
|
||||
@@ -1194,23 +1202,21 @@ cdrom_global_init(void)
|
||||
memset(cdrom, 0x00, sizeof(cdrom));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cdrom_drive_reset(cdrom_t *dev)
|
||||
{
|
||||
dev->priv = NULL;
|
||||
dev->insert = NULL;
|
||||
dev->close = NULL;
|
||||
dev->get_volume = NULL;
|
||||
dev->priv = NULL;
|
||||
dev->insert = NULL;
|
||||
dev->close = NULL;
|
||||
dev->get_volume = NULL;
|
||||
dev->get_channel = NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_hard_reset(void)
|
||||
{
|
||||
cdrom_t *dev;
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CDROM_NUM; i++) {
|
||||
dev = &cdrom[i];
|
||||
@@ -1221,7 +1227,7 @@ cdrom_hard_reset(void)
|
||||
|
||||
cdrom_drive_reset(dev);
|
||||
|
||||
switch(dev->bus_type) {
|
||||
switch (dev->bus_type) {
|
||||
case CDROM_BUS_ATAPI:
|
||||
case CDROM_BUS_SCSI:
|
||||
scsi_cdrom_drive_reset(i);
|
||||
@@ -1241,12 +1247,11 @@ cdrom_hard_reset(void)
|
||||
sound_cd_thread_reset();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_close(void)
|
||||
{
|
||||
cdrom_t *dev;
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CDROM_NUM; i++) {
|
||||
dev = &cdrom[i];
|
||||
@@ -1260,14 +1265,13 @@ cdrom_close(void)
|
||||
if (dev->ops && dev->ops->exit)
|
||||
dev->ops->exit(dev);
|
||||
|
||||
dev->ops = NULL;
|
||||
dev->ops = NULL;
|
||||
dev->priv = NULL;
|
||||
|
||||
cdrom_drive_reset(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Signal disc change to the emulated machine. */
|
||||
void
|
||||
cdrom_insert(uint8_t id)
|
||||
@@ -1280,7 +1284,6 @@ cdrom_insert(uint8_t id)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The mechanics of ejecting a CD-ROM from a drive. */
|
||||
void
|
||||
cdrom_eject(uint8_t id)
|
||||
@@ -1297,7 +1300,7 @@ cdrom_eject(uint8_t id)
|
||||
strcpy(dev->prev_image_path, dev->image_path);
|
||||
|
||||
dev->prev_host_drive = dev->host_drive;
|
||||
dev->host_drive = 0;
|
||||
dev->host_drive = 0;
|
||||
|
||||
dev->ops->exit(dev);
|
||||
dev->ops = NULL;
|
||||
@@ -1310,15 +1313,13 @@ cdrom_eject(uint8_t id)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
/* The mechanics of re-loading a CD-ROM drive. */
|
||||
void
|
||||
cdrom_reload(uint8_t id)
|
||||
{
|
||||
cdrom_t *dev = &cdrom[id];
|
||||
|
||||
if ((dev->host_drive == dev->prev_host_drive) ||
|
||||
(dev->prev_host_drive == 0) || (dev->host_drive != 0)) {
|
||||
if ((dev->host_drive == dev->prev_host_drive) || (dev->prev_host_drive == 0) || (dev->host_drive != 0)) {
|
||||
/* Switch from empty to empty. Do nothing. */
|
||||
return;
|
||||
}
|
||||
|
@@ -33,11 +33,9 @@
|
||||
#include <86box/cdrom.h>
|
||||
#include <86box/cdrom_image.h>
|
||||
|
||||
|
||||
#ifdef ENABLE_CDROM_IMAGE_LOG
|
||||
int cdrom_image_do_log = ENABLE_CDROM_IMAGE_LOG;
|
||||
|
||||
|
||||
void
|
||||
cdrom_image_log(const char *fmt, ...)
|
||||
{
|
||||
@@ -50,31 +48,28 @@ cdrom_image_log(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define cdrom_image_log(fmt, ...)
|
||||
# define cdrom_image_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
|
||||
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
|
||||
of the audio while audio still plays. With an absolute conversion, the counter is fine. */
|
||||
#define MSFtoLBA(m,s,f) ((((m * 60) + s) * 75) + f)
|
||||
|
||||
#define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
|
||||
|
||||
static void
|
||||
image_get_tracks(cdrom_t *dev, int *first, int *last)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *)dev->image;
|
||||
TMSF tmsf;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
TMSF tmsf;
|
||||
|
||||
cdi_get_audio_tracks(img, first, last, &tmsf);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
TMSF tmsf;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
TMSF tmsf;
|
||||
|
||||
cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr);
|
||||
|
||||
@@ -83,12 +78,11 @@ image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
|
||||
ti->f = tmsf.fr;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *)dev->image;
|
||||
TMSF rel_pos, abs_pos;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
TMSF rel_pos, abs_pos;
|
||||
|
||||
cdi_get_audio_sub(img, lba, &subc->attr, &subc->track, &subc->index,
|
||||
&rel_pos, &abs_pos);
|
||||
@@ -102,15 +96,14 @@ image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
|
||||
subc->rel_f = rel_pos.fr;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
image_get_capacity(cdrom_t *dev)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *)dev->image;
|
||||
int first_track, last_track;
|
||||
int number, c;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
int first_track, last_track;
|
||||
int number, c;
|
||||
unsigned char attr;
|
||||
uint32_t address = 0, lb = 0;
|
||||
uint32_t address = 0, lb = 0;
|
||||
|
||||
if (!img)
|
||||
return 0;
|
||||
@@ -126,23 +119,22 @@ image_get_capacity(cdrom_t *dev)
|
||||
return lb;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *)dev->image;
|
||||
uint8_t attr;
|
||||
TMSF tmsf;
|
||||
int m, s, f;
|
||||
int number, track;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
uint8_t attr;
|
||||
TMSF tmsf;
|
||||
int m, s, f;
|
||||
int number, track;
|
||||
|
||||
if (!img || (dev->cd_status == CD_STATUS_DATA_ONLY))
|
||||
return 0;
|
||||
|
||||
if (ismsf) {
|
||||
m = (pos >> 16) & 0xff;
|
||||
s = (pos >> 8) & 0xff;
|
||||
f = pos & 0xff;
|
||||
m = (pos >> 16) & 0xff;
|
||||
s = (pos >> 8) & 0xff;
|
||||
f = pos & 0xff;
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
}
|
||||
|
||||
@@ -156,12 +148,11 @@ 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;
|
||||
int track;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
int track;
|
||||
|
||||
/* GetTrack requires LBA. */
|
||||
track = cdi_get_track(img, lba);
|
||||
@@ -172,20 +163,18 @@ image_is_track_pre(cdrom_t *dev, uint32_t lba)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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->image;
|
||||
|
||||
return cdi_get_sector_size(img, 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->image;
|
||||
|
||||
switch (type) {
|
||||
case CD_READ_DATA:
|
||||
@@ -203,11 +192,10 @@ 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->image;
|
||||
|
||||
if (img) {
|
||||
if (image_is_track_audio(dev, lba, 0))
|
||||
@@ -215,17 +203,16 @@ image_track_type(cdrom_t *dev, uint32_t lba)
|
||||
else {
|
||||
if (cdi_is_mode2(img, lba))
|
||||
return CD_TRACK_MODE2 | cdi_get_mode2_form(img, lba);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
image_exit(cdrom_t *dev)
|
||||
{
|
||||
cd_img_t *img = (cd_img_t *)dev->image;
|
||||
cd_img_t *img = (cd_img_t *) dev->image;
|
||||
|
||||
cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path);
|
||||
dev->cd_status = CD_STATUS_EMPTY;
|
||||
@@ -238,7 +225,6 @@ image_exit(cdrom_t *dev)
|
||||
dev->ops = NULL;
|
||||
}
|
||||
|
||||
|
||||
static const cdrom_ops_t cdrom_image_ops = {
|
||||
image_get_tracks,
|
||||
image_get_track_info,
|
||||
@@ -250,18 +236,16 @@ static const cdrom_ops_t cdrom_image_ops = {
|
||||
image_exit
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
image_open_abort(cdrom_t *dev)
|
||||
{
|
||||
cdrom_image_close(dev);
|
||||
dev->ops = NULL;
|
||||
dev->host_drive = 0;
|
||||
dev->ops = NULL;
|
||||
dev->host_drive = 0;
|
||||
dev->image_path[0] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
{
|
||||
@@ -288,12 +272,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
return image_open_abort(dev);
|
||||
|
||||
/* All good, reset state. */
|
||||
if (! strcasecmp(path_get_extension((char *) fn), "ISO"))
|
||||
dev->cd_status = CD_STATUS_DATA_ONLY;
|
||||
if (!strcasecmp(path_get_extension((char *) fn), "ISO"))
|
||||
dev->cd_status = CD_STATUS_DATA_ONLY;
|
||||
else
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
dev->seek_pos = 0;
|
||||
dev->cd_buflen = 0;
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
dev->seek_pos = 0;
|
||||
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);
|
||||
|
||||
@@ -303,7 +287,6 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdrom_image_close(cdrom_t *dev)
|
||||
{
|
||||
|
@@ -26,9 +26,9 @@
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#ifdef _WIN32
|
||||
# include <string.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <libgen.h>
|
||||
# include <libgen.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
@@ -37,21 +37,17 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/cdrom_image_backend.h>
|
||||
|
||||
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
|
||||
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
|
||||
#define MAX_LINE_LENGTH 512
|
||||
#define MAX_FILENAME_LENGTH 256
|
||||
#define CROSS_LEN 512
|
||||
|
||||
|
||||
static char temp_keyword[1024];
|
||||
#define MAX_LINE_LENGTH 512
|
||||
#define MAX_FILENAME_LENGTH 256
|
||||
#define CROSS_LEN 512
|
||||
|
||||
static char temp_keyword[1024];
|
||||
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
int cdrom_image_backend_do_log = ENABLE_CDROM_IMAGE_BACKEND_LOG;
|
||||
|
||||
|
||||
void
|
||||
cdrom_image_backend_log(const char *fmt, ...)
|
||||
{
|
||||
@@ -64,10 +60,9 @@ cdrom_image_backend_log(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define cdrom_image_backend_log(fmt, ...)
|
||||
# define cdrom_image_backend_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
/* Binary file functions. */
|
||||
static int
|
||||
bin_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
@@ -97,11 +92,10 @@ bin_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static uint64_t
|
||||
bin_get_length(void *p)
|
||||
{
|
||||
off64_t len;
|
||||
off64_t len;
|
||||
track_file_t *tf = (track_file_t *) p;
|
||||
|
||||
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->file);
|
||||
@@ -116,7 +110,6 @@ bin_get_length(void *p)
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
bin_close(void *p)
|
||||
{
|
||||
@@ -135,7 +128,6 @@ bin_close(void *p)
|
||||
free(p);
|
||||
}
|
||||
|
||||
|
||||
static track_file_t *
|
||||
bin_init(const char *filename, int *error)
|
||||
{
|
||||
@@ -155,9 +147,9 @@ bin_init(const char *filename, int *error)
|
||||
|
||||
/* Set the function pointers. */
|
||||
if (!*error) {
|
||||
tf->read = bin_read;
|
||||
tf->read = bin_read;
|
||||
tf->get_length = bin_get_length;
|
||||
tf->close = bin_close;
|
||||
tf->close = bin_close;
|
||||
} else {
|
||||
free(tf);
|
||||
tf = NULL;
|
||||
@@ -166,7 +158,6 @@ bin_init(const char *filename, int *error)
|
||||
return tf;
|
||||
}
|
||||
|
||||
|
||||
static track_file_t *
|
||||
track_file_init(const char *filename, int *error)
|
||||
{
|
||||
@@ -175,7 +166,6 @@ track_file_init(const char *filename, int *error)
|
||||
return bin_init(filename, error);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
track_file_close(track_t *trk)
|
||||
{
|
||||
@@ -192,14 +182,13 @@ track_file_close(track_t *trk)
|
||||
trk->file = NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Root functions. */
|
||||
static void
|
||||
cdi_clear_tracks(cd_img_t *cdi)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
track_file_t *last = NULL;
|
||||
track_t *cur = NULL;
|
||||
track_t *cur = NULL;
|
||||
|
||||
if ((cdi->tracks == NULL) || (cdi->tracks_num == 0))
|
||||
return;
|
||||
@@ -223,7 +212,6 @@ cdi_clear_tracks(cd_img_t *cdi)
|
||||
cdi->tracks_num = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cdi_close(cd_img_t *cdi)
|
||||
{
|
||||
@@ -231,7 +219,6 @@ cdi_close(cd_img_t *cdi)
|
||||
free(cdi);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_set_device(cd_img_t *cdi, const char *path)
|
||||
{
|
||||
@@ -244,31 +231,28 @@ cdi_set_device(cd_img_t *cdi, const char *path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* TODO: This never returns anything other than 1, should it even be an int? */
|
||||
int
|
||||
cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out)
|
||||
{
|
||||
*st_track = 1;
|
||||
*end = cdi->tracks_num - 1;
|
||||
*end = cdi->tracks_num - 1;
|
||||
FRAMES_TO_MSF(cdi->tracks[*end].start + 150, &lead_out->min, &lead_out->sec, &lead_out->fr);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* TODO: This never returns anything other than 1, should it even be an int? */
|
||||
int
|
||||
cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_out)
|
||||
{
|
||||
*st_track = 1;
|
||||
*end = cdi->tracks_num - 1;
|
||||
*end = cdi->tracks_num - 1;
|
||||
*lead_out = cdi->tracks[*end].start;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_get_audio_track_pre(cd_img_t *cdi, int track)
|
||||
{
|
||||
@@ -280,13 +264,12 @@ cdi_get_audio_track_pre(cd_img_t *cdi, int track)
|
||||
return trk->pre;
|
||||
}
|
||||
|
||||
|
||||
/* This replaces both Info and EndInfo, they are specified by a variable. */
|
||||
int
|
||||
cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF *start, uint8_t *attr)
|
||||
{
|
||||
track_t *trk = &cdi->tracks[track - 1];
|
||||
int pos = trk->start + 150;
|
||||
int pos = trk->start + 150;
|
||||
|
||||
if ((track < 1) || (track > cdi->tracks_num))
|
||||
return 0;
|
||||
@@ -296,12 +279,11 @@ cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF
|
||||
FRAMES_TO_MSF(pos, &start->min, &start->sec, &start->fr);
|
||||
|
||||
*track_num = trk->track_number;
|
||||
*attr = trk->attr;
|
||||
*attr = trk->attr;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num, uint32_t *start, uint8_t *attr)
|
||||
{
|
||||
@@ -313,16 +295,15 @@ cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num,
|
||||
*start = (uint32_t) trk->start;
|
||||
|
||||
*track_num = trk->track_number;
|
||||
*attr = trk->attr;
|
||||
*attr = trk->attr;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
track_t *cur, *next;
|
||||
|
||||
/* There must be at least two tracks - data and lead out. */
|
||||
@@ -332,7 +313,7 @@ cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
||||
/* This has a problem - the code skips the last track, which is
|
||||
lead out - is that correct? */
|
||||
for (i = 0; i < (cdi->tracks_num - 1); i++) {
|
||||
cur = &cdi->tracks[i];
|
||||
cur = &cdi->tracks[i];
|
||||
next = &cdi->tracks[i + 1];
|
||||
if ((cur->start <= sector) && (sector < next->start))
|
||||
return cur->number;
|
||||
@@ -341,20 +322,19 @@ cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* TODO: See if track start is adjusted by 150 or not. */
|
||||
int
|
||||
cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos)
|
||||
{
|
||||
int cur_track = cdi_get_track(cdi, sector);
|
||||
int cur_track = cdi_get_track(cdi, sector);
|
||||
track_t *trk;
|
||||
|
||||
if (cur_track < 1)
|
||||
return 0;
|
||||
|
||||
*track = (uint8_t) cur_track;
|
||||
trk = &cdi->tracks[*track - 1];
|
||||
*attr = trk->attr;
|
||||
trk = &cdi->tracks[*track - 1];
|
||||
*attr = trk->attr;
|
||||
*index = 1;
|
||||
|
||||
FRAMES_TO_MSF(sector + 150, &abs_pos->min, &abs_pos->sec, &abs_pos->fr);
|
||||
@@ -365,23 +345,22 @@ cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track,
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||
{
|
||||
size_t length;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
uint64_t sect = (uint64_t) sector, seek;
|
||||
size_t length;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
uint64_t sect = (uint64_t) sector, seek;
|
||||
track_t *trk;
|
||||
int track_is_raw, ret;
|
||||
int raw_size, cooked_size;
|
||||
int track_is_raw, ret;
|
||||
int raw_size, cooked_size;
|
||||
uint64_t offset = 0ULL;
|
||||
int m = 0, s = 0, f = 0;
|
||||
int m = 0, s = 0, f = 0;
|
||||
|
||||
if (track < 0)
|
||||
return 0;
|
||||
|
||||
trk = &cdi->tracks[track];
|
||||
trk = &cdi->tracks[track];
|
||||
track_is_raw = ((trk->sector_size == RAW_SECTOR_SIZE) || (trk->sector_size == 2448));
|
||||
|
||||
seek = trk->skip + ((sect - trk->start) * trk->sector_size);
|
||||
@@ -393,7 +372,7 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||
|
||||
if (trk->mode2 && (trk->form != 1)) {
|
||||
if (trk->form == 2)
|
||||
cooked_size = (track_is_raw ? 2328 : trk->sector_size); /* Both 2324 + ECC and 2328 variants are valid. */
|
||||
cooked_size = (track_is_raw ? 2328 : trk->sector_size); /* Both 2324 + ECC and 2328 variants are valid. */
|
||||
else
|
||||
cooked_size = 2336;
|
||||
} else
|
||||
@@ -428,29 +407,27 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||
return trk->file->read(trk->file, buffer, seek, length);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
||||
{
|
||||
int sector_size, success = 1;
|
||||
int sector_size, success = 1;
|
||||
uint8_t *buf;
|
||||
uint32_t buf_len, i;
|
||||
|
||||
/* TODO: This fails to account for Mode 2. Shouldn't we have a function
|
||||
to get sector size? */
|
||||
sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE;
|
||||
buf_len = num * sector_size;
|
||||
buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t));
|
||||
buf_len = num * sector_size;
|
||||
buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t));
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i);
|
||||
if (!success)
|
||||
break;
|
||||
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
|
||||
audio track. */
|
||||
if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 &&
|
||||
(cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068]))
|
||||
return 0;
|
||||
break;
|
||||
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
|
||||
audio track. */
|
||||
if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068]))
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy((void *) buffer, buf, buf_len);
|
||||
@@ -460,19 +437,18 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
/* TODO: Do CUE+BIN images with a sector size of 2448 even exist? */
|
||||
int
|
||||
cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector)
|
||||
{
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
track_t *trk;
|
||||
uint64_t s = (uint64_t) sector, seek;
|
||||
|
||||
if (track < 0)
|
||||
return 0;
|
||||
|
||||
trk = &cdi->tracks[track];
|
||||
trk = &cdi->tracks[track];
|
||||
seek = trk->skip + ((s - trk->start) * trk->sector_size);
|
||||
if (trk->sector_size != 2448)
|
||||
return 0;
|
||||
@@ -480,11 +456,10 @@ cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector)
|
||||
return trk->file->read(trk->file, buffer, seek, 2448);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_get_sector_size(cd_img_t *cdi, uint32_t sector)
|
||||
{
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
track_t *trk;
|
||||
|
||||
if (track < 0)
|
||||
@@ -494,11 +469,10 @@ cdi_get_sector_size(cd_img_t *cdi, uint32_t sector)
|
||||
return trk->sector_size;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_is_mode2(cd_img_t *cdi, uint32_t sector)
|
||||
{
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
track_t *trk;
|
||||
|
||||
if (track < 0)
|
||||
@@ -509,11 +483,10 @@ cdi_is_mode2(cd_img_t *cdi, uint32_t sector)
|
||||
return !!(trk->mode2);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector)
|
||||
{
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
int track = cdi_get_track(cdi, sector) - 1;
|
||||
track_t *trk;
|
||||
|
||||
if (track < 0)
|
||||
@@ -524,12 +497,11 @@ cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector)
|
||||
return trk->form;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form)
|
||||
{
|
||||
uint8_t pvd[COOKED_SECTOR_SIZE];
|
||||
uint64_t seek = 16ULL * sector_size; /* First VD is located at sector 16. */
|
||||
uint8_t pvd[COOKED_SECTOR_SIZE];
|
||||
uint64_t seek = 16ULL * sector_size; /* First VD is located at sector 16. */
|
||||
|
||||
if ((!mode2 || (form == 0)) && (sector_size == RAW_SECTOR_SIZE))
|
||||
seek += 16;
|
||||
@@ -538,11 +510,9 @@ cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form)
|
||||
|
||||
file->read(file, pvd, seek, COOKED_SECTOR_SIZE);
|
||||
|
||||
return ((pvd[0] == 1 && !strncmp((char*)(&pvd[1]), "CD001", 5) && pvd[6] == 1) ||
|
||||
(pvd[8] == 1 && !strncmp((char*)(&pvd[9]), "CDROM", 5) && pvd[14] == 1));
|
||||
return ((pvd[0] == 1 && !strncmp((char *) (&pvd[1]), "CD001", 5) && pvd[6] == 1) || (pvd[8] == 1 && !strncmp((char *) (&pvd[9]), "CDROM", 5) && pvd[14] == 1));
|
||||
}
|
||||
|
||||
|
||||
/* This reallocates the array and returns the pointer to the last track. */
|
||||
static void
|
||||
cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
||||
@@ -559,14 +529,13 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
||||
cdi->tracks_num++;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_load_iso(cd_img_t *cdi, const char *filename)
|
||||
{
|
||||
int error;
|
||||
int error;
|
||||
track_t trk;
|
||||
|
||||
cdi->tracks = NULL;
|
||||
cdi->tracks = NULL;
|
||||
cdi->tracks_num = 0;
|
||||
|
||||
memset(&trk, 0, sizeof(track_t));
|
||||
@@ -578,26 +547,26 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
|
||||
trk.file->close(trk.file);
|
||||
return 0;
|
||||
}
|
||||
trk.number = 1;
|
||||
trk.number = 1;
|
||||
trk.track_number = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.attr = DATA_TRACK;
|
||||
|
||||
/* Try to detect ISO type. */
|
||||
trk.form = 0;
|
||||
trk.form = 0;
|
||||
trk.mode2 = 0;
|
||||
/* TODO: Merge the first and last cases since they result in the same thing. */
|
||||
if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 0, 0))
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
else if (cdi_can_read_pvd(trk.file, 2336, 1, 0)) {
|
||||
trk.sector_size = 2336;
|
||||
trk.mode2 = 1;
|
||||
trk.mode2 = 1;
|
||||
} else if (cdi_can_read_pvd(trk.file, 2324, 1, 2)) {
|
||||
trk.sector_size = 2324;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 2;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 2;
|
||||
} else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 0)) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.mode2 = 1;
|
||||
trk.mode2 = 1;
|
||||
} else {
|
||||
/* We use 2048 mode 1 as the default. */
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
@@ -608,30 +577,29 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
|
||||
/* Lead out track. */
|
||||
trk.number = 2;
|
||||
trk.number = 2;
|
||||
trk.track_number = 0xAA;
|
||||
trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */
|
||||
trk.start = trk.length;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */
|
||||
trk.start = trk.length;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_cue_get_buffer(char *str, char **line, int up)
|
||||
{
|
||||
char *s = *line;
|
||||
char *p = str;
|
||||
int quote = 0;
|
||||
int done = 0;
|
||||
int space = 1;
|
||||
char *s = *line;
|
||||
char *p = str;
|
||||
int quote = 0;
|
||||
int done = 0;
|
||||
int space = 1;
|
||||
|
||||
/* Copy to local buffer until we have end of string or whitespace. */
|
||||
while (! done) {
|
||||
switch(*s) {
|
||||
while (!done) {
|
||||
switch (*s) {
|
||||
case '\0':
|
||||
if (quote) {
|
||||
/* Ouch, unterminated string.. */
|
||||
@@ -644,11 +612,12 @@ cdi_cue_get_buffer(char *str, char **line, int up)
|
||||
quote ^= 1;
|
||||
break;
|
||||
|
||||
case ' ': case '\t':
|
||||
case ' ':
|
||||
case '\t':
|
||||
if (space)
|
||||
break;
|
||||
break;
|
||||
|
||||
if (! quote) {
|
||||
if (!quote) {
|
||||
done = 1;
|
||||
break;
|
||||
}
|
||||
@@ -663,7 +632,7 @@ cdi_cue_get_buffer(char *str, char **line, int up)
|
||||
break;
|
||||
}
|
||||
|
||||
if (! done)
|
||||
if (!done)
|
||||
s++;
|
||||
}
|
||||
*p = '\0';
|
||||
@@ -673,7 +642,6 @@ cdi_cue_get_buffer(char *str, char **line, int up)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_cue_get_keyword(char **dest, char **line)
|
||||
{
|
||||
@@ -686,12 +654,11 @@ cdi_cue_get_keyword(char **dest, char **line)
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
/* Get a string from the input line, handling quotes properly. */
|
||||
static uint64_t
|
||||
cdi_cue_get_number(char **line)
|
||||
{
|
||||
char temp[128];
|
||||
char temp[128];
|
||||
uint64_t num;
|
||||
|
||||
if (!cdi_cue_get_buffer(temp, line, 0))
|
||||
@@ -703,13 +670,12 @@ cdi_cue_get_number(char **line)
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_cue_get_frame(uint64_t *frames, char **line)
|
||||
{
|
||||
char temp[128];
|
||||
int min, sec, fr;
|
||||
int success;
|
||||
int min, sec, fr;
|
||||
int success;
|
||||
|
||||
success = cdi_cue_get_buffer(temp, line, 0);
|
||||
if (!success)
|
||||
@@ -724,12 +690,11 @@ cdi_cue_get_frame(uint64_t *frames, char **line)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_cue_get_flags(track_t *cur, char **line)
|
||||
{
|
||||
char temp[128], temp2[128];
|
||||
int success;
|
||||
int success;
|
||||
|
||||
success = cdi_cue_get_buffer(temp, line, 0);
|
||||
if (!success)
|
||||
@@ -745,7 +710,6 @@ cdi_cue_get_flags(track_t *cur, char **line)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, uint64_t *total_pregap, uint64_t cur_pregap)
|
||||
{
|
||||
@@ -788,11 +752,11 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u
|
||||
*total_pregap += cur_pregap;
|
||||
cur->start += *total_pregap;
|
||||
} else {
|
||||
temp = prev->file->get_length(prev->file) - ((uint64_t) prev->skip);
|
||||
temp = prev->file->get_length(prev->file) - ((uint64_t) prev->skip);
|
||||
prev->length = temp / ((uint64_t) prev->sector_size);
|
||||
if ((temp % prev->sector_size) != 0)
|
||||
prev->length++;
|
||||
/* Padding. */
|
||||
/* Padding. */
|
||||
|
||||
cur->start += prev->start + prev->length + cur_pregap;
|
||||
cur->skip = skip * cur->sector_size;
|
||||
@@ -813,24 +777,23 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
{
|
||||
track_t trk;
|
||||
char pathname[MAX_FILENAME_LENGTH], filename[MAX_FILENAME_LENGTH];
|
||||
char temp[MAX_FILENAME_LENGTH];
|
||||
track_t trk;
|
||||
char pathname[MAX_FILENAME_LENGTH], filename[MAX_FILENAME_LENGTH];
|
||||
char temp[MAX_FILENAME_LENGTH];
|
||||
uint64_t shift = 0ULL, prestart = 0ULL;
|
||||
uint64_t cur_pregap = 0ULL, total_pregap = 0ULL;
|
||||
uint64_t frame = 0ULL, index;
|
||||
int i, success;
|
||||
int error, can_add_track = 0;
|
||||
FILE *fp;
|
||||
char buf[MAX_LINE_LENGTH], ansi[MAX_FILENAME_LENGTH];
|
||||
char *line, *command;
|
||||
char *type;
|
||||
int i, success;
|
||||
int error, can_add_track = 0;
|
||||
FILE *fp;
|
||||
char buf[MAX_LINE_LENGTH], ansi[MAX_FILENAME_LENGTH];
|
||||
char *line, *command;
|
||||
char *type;
|
||||
|
||||
cdi->tracks = NULL;
|
||||
cdi->tracks = NULL;
|
||||
cdi->tracks_num = 0;
|
||||
|
||||
memset(&trk, 0, sizeof(track_t));
|
||||
@@ -859,10 +822,10 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
if (strlen(buf) > 0) {
|
||||
if (buf[strlen(buf) - 1] == '\n')
|
||||
buf[strlen(buf) - 1] = '\0';
|
||||
/* nuke trailing newline */
|
||||
/* nuke trailing newline */
|
||||
else if (buf[strlen(buf) - 1] == '\r')
|
||||
buf[strlen(buf) - 1] = '\0';
|
||||
/* nuke trailing newline */
|
||||
/* nuke trailing newline */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -876,86 +839,86 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
if (!success)
|
||||
break;
|
||||
|
||||
trk.start = 0;
|
||||
trk.skip = 0;
|
||||
trk.start = 0;
|
||||
trk.skip = 0;
|
||||
cur_pregap = 0;
|
||||
prestart = 0;
|
||||
prestart = 0;
|
||||
|
||||
trk.number = cdi_cue_get_number(&line);
|
||||
trk.number = cdi_cue_get_number(&line);
|
||||
trk.track_number = trk.number;
|
||||
success = cdi_cue_get_keyword(&type, &line);
|
||||
success = cdi_cue_get_keyword(&type, &line);
|
||||
if (!success)
|
||||
break;
|
||||
|
||||
trk.form = 0;
|
||||
trk.form = 0;
|
||||
trk.mode2 = 0;
|
||||
|
||||
trk.pre = 0;
|
||||
|
||||
if (!strcmp(type, "AUDIO")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = AUDIO_TRACK;
|
||||
trk.attr = AUDIO_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2048")) {
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE2/2048")) {
|
||||
trk.form = 1;
|
||||
trk.form = 1;
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2324")) {
|
||||
trk.form = 2;
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2324;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2328")) {
|
||||
trk.form = 2;
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2328;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2336")) {
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2352")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.form = 1;
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2448")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.form = 1;
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDG/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2336")) {
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else
|
||||
success = 0;
|
||||
|
||||
can_add_track = 1;
|
||||
} else if (!strcmp(command, "INDEX")) {
|
||||
index = cdi_cue_get_number(&line);
|
||||
index = cdi_cue_get_number(&line);
|
||||
success = cdi_cue_get_frame(&frame, &line);
|
||||
|
||||
switch(index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
prestart = frame;
|
||||
break;
|
||||
@@ -988,7 +951,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
break;
|
||||
|
||||
trk.file = NULL;
|
||||
error = 1;
|
||||
error = 1;
|
||||
|
||||
if (!strcmp(type, "BINARY")) {
|
||||
memset(temp, 0, MAX_FILENAME_LENGTH * sizeof(char));
|
||||
@@ -1010,9 +973,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
success = cdi_cue_get_frame(&cur_pregap, &line);
|
||||
else if (!strcmp(command, "FLAGS"))
|
||||
success = cdi_cue_get_flags(&trk, &line);
|
||||
else if (!strcmp(command, "CATALOG") || !strcmp(command, "CDTEXTFILE") || !strcmp(command, "ISRC") ||
|
||||
!strcmp(command, "PERFORMER") || !strcmp(command, "POSTGAP") || !strcmp(command, "REM") ||
|
||||
!strcmp(command, "SONGWRITER") || !strcmp(command, "TITLE") || !strcmp(command, "")) {
|
||||
else if (!strcmp(command, "CATALOG") || !strcmp(command, "CDTEXTFILE") || !strcmp(command, "ISRC") || !strcmp(command, "PERFORMER") || !strcmp(command, "POSTGAP") || !strcmp(command, "REM") || !strcmp(command, "SONGWRITER") || !strcmp(command, "TITLE") || !strcmp(command, "")) {
|
||||
/* Ignored commands. */
|
||||
success = 1;
|
||||
} else {
|
||||
@@ -1020,7 +981,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
cdrom_image_backend_log("CUE: unsupported command '%s' in cue sheet!\n", command);
|
||||
#endif
|
||||
success = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success)
|
||||
break;
|
||||
@@ -1037,17 +998,16 @@ 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;
|
||||
trk.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
|
||||
trk.start = 0;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
if (!cdi_add_track(cdi, &trk, &shift, 0, &total_pregap, 0))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_has_data_track(cd_img_t *cdi)
|
||||
{
|
||||
@@ -1065,7 +1025,6 @@ cdi_has_data_track(cd_img_t *cdi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cdi_has_audio_track(cd_img_t *cdi)
|
||||
{
|
||||
|
Reference in New Issue
Block a user