Implement skeleton SEND CUE SHEET command for CD-ROM

This commit is contained in:
2025-09-24 17:13:22 +01:00
parent f84c36c351
commit a46d1365d9
9 changed files with 63 additions and 4 deletions

View File

@@ -3450,3 +3450,9 @@ cdrom_reload(const uint8_t id)
config_save();
}
int
cdrom_send_cuesheet(cdrom_t *dev, const uint8_t *buffer, int len)
{
return dev->ops->send_cuesheet(dev->local, buffer, len);
}

View File

@@ -2658,6 +2658,7 @@ static const cdrom_ops_t image_ops = {
image_has_audio,
NULL,
image_close,
NULL,
NULL
};

View File

@@ -68,6 +68,17 @@ typedef struct cd_image_t {
track_t *tracks;
} cd_image_t;
typedef struct raw_cuesheet_t {
uint8_t ctl_adr;
uint8_t tno;
uint8_t index;
uint8_t data_form;
uint8_t scms;
uint8_t amin;
uint8_t asec;
uint8_t aframe;
} raw_cuesheet_t;
#ifdef ENABLE_IMAGE_LOG
int image_do_log = ENABLE_IMAGE_LOG;
@@ -168,6 +179,14 @@ wimage_close(void *local)
// TODO: Not implemented
}
static int
wimage_send_cuesheet(const void *local, const uint8_t *buffer, const int len)
{
const raw_cuesheet_t* rc = (raw_cuesheet_t*) buffer;
return 0;
}
static const cdrom_ops_t image_ops = {
wimage_get_track_info,
wimage_get_raw_track_info,
@@ -180,7 +199,8 @@ static const cdrom_ops_t image_ops = {
wimage_has_audio,
NULL,
wimage_close,
NULL
NULL,
wimage_send_cuesheet
};
/* Public functions. */

View File

@@ -293,6 +293,8 @@ typedef struct cdrom_ops_t {
int (*is_empty)(const void *local);
void (*close)(void *local);
void (*load)(const void *local);
int (*send_cuesheet)(const void *local, const uint8_t *buffer,
int len);
} cdrom_ops_t;
typedef struct cdrom {
@@ -488,6 +490,7 @@ extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, co
uint32_t major_mult, uint32_t minor_inc, int m2f1);
extern unsigned long cdrom_crc32(unsigned long crc, const unsigned char *buf,
size_t len);
extern int cdrom_send_cuesheet(cdrom_t *dev, const uint8_t *buffer, int len);
extern int cdrom_assigned_letters;

View File

@@ -92,6 +92,7 @@
#define GPCMD_READ_TRACK_INFORMATION 0x52
#define GPCMD_MODE_SELECT_10 0x55
#define GPCMD_MODE_SENSE_10 0x5a
#define GPCMD_SEND_CUE_SHEET 0x5d
#define GPCMD_PLAY_AUDIO_12 0xa5
#define GPCMD_READ_12 0xa8
#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12 0xa9

View File

@@ -215,7 +215,8 @@ static const cdrom_ops_t ioctl_ops = {
ioctl_has_audio,
ioctl_is_empty,
ioctl_close,
ioctl_load
ioctl_load,
NULL
};
/* Public functions. */

View File

@@ -817,7 +817,8 @@ static const cdrom_ops_t ioctl_ops = {
ioctl_has_audio,
ioctl_is_empty,
ioctl_close,
ioctl_load
ioctl_load,
NULL
};
/* Public functions. */

View File

@@ -98,6 +98,7 @@ uint8_t scsi_cdrom_command_flags[0x100] = {
[0x51 ... 0x52] = IMPLEMENTED | CHECK_READY,
[0x55] = IMPLEMENTED,
[0x5a] = IMPLEMENTED,
[0x5d] = IMPLEMENTED | CHECK_READY,
[0xa5] = IMPLEMENTED | CHECK_READY,
[0xa8 ... 0xa9] = IMPLEMENTED | CHECK_READY,
[0xad] = IMPLEMENTED,
@@ -3002,6 +3003,19 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb)
scsi_cdrom_data_command_finish(dev, len, len, len, 1);
break;
case GPCMD_SEND_CUE_SHEET:
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_OUT);
len = (cdb[6] << 16) | (cdb[7] << 8) | cdb[8];
scsi_cdrom_buf_alloc(dev, 65536);
scsi_cdrom_set_buf_len(dev, BufLen, &len);
dev->total_length = len;
scsi_cdrom_data_command_finish(dev, len, len, len, 1);
break;
case GPCMD_GET_CONFIGURATION:
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
@@ -3858,7 +3872,18 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
}
}
break;
case GPCMD_SEND_CUE_SHEET:
int data_length = dev->current_cdb[5] << 16 |
dev->current_cdb[7] << 8 |
dev->current_cdb[8];
int ret = cdrom_send_cuesheet(dev->drv, dev->buffer, data_length);
if (ret) {
scsi_cdrom_invalid_field_pl(dev, 0);
}
scsi_cdrom_buf_free(dev);
break;
default:
break;
}

View File

@@ -213,7 +213,8 @@ static const cdrom_ops_t ioctl_ops = {
ioctl_has_audio,
ioctl_is_empty,
ioctl_close,
ioctl_load
ioctl_load,
NULL
};
/* Public functions. */