From bc690b3d2f999b6d3513d56a29e6742383e627c3 Mon Sep 17 00:00:00 2001 From: SarahW Date: Tue, 16 Jan 2018 20:05:56 +0000 Subject: [PATCH] CD-ROM fixes : - Fixed track handling in is_track_audio() - ioctl_readtoc() First Track field returns first track in the TOC, not the first track specified by the command - SCSI CD-ROM code now looks at correct cd_status variable - SCSI CD-ROM now identifies as SCSI compliant Fixes CD audio via QCD with Adaptec SCSI card + ASPI drivers. --- src/cdrom-ioctl.c | 10 +++++++--- src/scsi_cd.c | 12 ++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/cdrom-ioctl.c b/src/cdrom-ioctl.c index 62c8319..58e05da 100644 --- a/src/cdrom-ioctl.c +++ b/src/cdrom-ioctl.c @@ -500,14 +500,19 @@ static int is_track_audio(uint32_t pos) if (!tocvalid) return 0; - for (c = toc.FirstTrack; c < toc.LastTrack; c++) + for (c = 0; toc.TrackData[c].TrackNumber != 0xaa; c++) { uint32_t track_address = toc.TrackData[c].Address[3] + (toc.TrackData[c].Address[2] * 75) + (toc.TrackData[c].Address[1] * 75 * 60); - if (track_address <= pos) + if (toc.TrackData[c].TrackNumber >= toc.FirstTrack && + toc.TrackData[c].TrackNumber <= toc.LastTrack && + track_address >= pos) + { control = toc.TrackData[c].Control; + break; + } } return (control & 4) ? 0 : 1; } @@ -562,7 +567,6 @@ static int ioctl_readtoc(unsigned char *b, unsigned char starttrack, int msf, in break; } } - b[2]=toc.TrackData[c].TrackNumber; last_block = 0; for (c=d;c<=toc.LastTrack;c++) { diff --git a/src/scsi_cd.c b/src/scsi_cd.c index 1f9e411..fb32c01 100644 --- a/src/scsi_cd.c +++ b/src/scsi_cd.c @@ -355,10 +355,10 @@ static uint32_t ide_atapi_mode_sense(scsi_cd_data_t *data, uint32_t pos, uint8_t } else { + buf[pos++] = 5; /* Reserved */ buf[pos++] = 4; /* Reserved */ buf[pos++] = 0; /* Reserved */ - buf[pos++] = 0; /* Reserved */ - buf[pos++] = 0; /* Reserved */ + buf[pos++] = 0x80; /* Reserved */ buf[pos++] = 0; buf[pos++] = 75; /* Logical audio block per second */ buf[pos++] = 1; /* CDDA Output Port 0 Channel Selection */ buf[pos++] = 0xFF; /* CDDA Output Port 0 Volume */ @@ -502,7 +502,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p) data->data_in[0] = 0x80 | 0x70; - if ((data->sense_key > 0) || (cd_status < CD_STATUS_PLAYING)) + if ((data->sense_key > 0) || (data->cd_status < CD_STATUS_PLAYING)) { if (completed) { @@ -523,7 +523,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p) { data->data_in[2] = SENSE_ILLEGAL_REQUEST; data->data_in[12] = ASC_AUDIO_PLAY_OPERATION; - data->data_in[13] = (cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; + data->data_in[13] = (data->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; } //data->data_in[7] = 10; @@ -895,7 +895,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p) } - if ((cdrom_drive < 1) || (cd_status <= CD_STATUS_DATA_ONLY) || + if ((cdrom_drive < 1) || (data->cd_status <= CD_STATUS_DATA_ONLY) || !atapi->is_track_audio(pos, (cdb[0] == GPCMD_PLAY_AUDIO_MSF) ? 1 : 0)) { atapi_cmd_error(data, SENSE_ILLEGAL_REQUEST, ASC_ILLEGAL_MODE_FOR_THIS_TRACK, 0); @@ -1002,7 +1002,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p) data->data_in[0] = 5; /*CD-ROM*/ data->data_in[1] = 0x80; /*Removable*/ - data->data_in[2] = 0; + data->data_in[2] = 2; /*SCSI-2 compliant*/ data->data_in[3] = 0x21; data->data_in[4] = 31; data->data_in[5] = 0;