|
|
|
@ -48,14 +48,14 @@
|
|
|
|
|
#define SCMD_PLAY_AUDIO_MSF 0x47
|
|
|
|
|
#define SCMD_PAUSE_RESUME 0x4b
|
|
|
|
|
|
|
|
|
|
#define SUBTQ_STATUS_INVALID 0x00
|
|
|
|
|
#define SUBTQ_STATUS_PLAY 0x11
|
|
|
|
|
#define SUBTQ_STATUS_PAUSE 0x12
|
|
|
|
|
#define SUBTQ_STATUS_DONE 0x13
|
|
|
|
|
#define SUBTQ_STATUS_ERROR 0x14
|
|
|
|
|
#define SUBTQ_STATUS_NONE 0x15
|
|
|
|
|
#define SUBTQ_STATUS_NO_DISC 0x17 /* Illegal, but Toshiba returns it. */
|
|
|
|
|
#define SUBTQ_ILLEGAL 0xff
|
|
|
|
|
#define SUBQ_STATUS_INVALID 0x00
|
|
|
|
|
#define SUBQ_STATUS_PLAY 0x11
|
|
|
|
|
#define SUBQ_STATUS_PAUSE 0x12
|
|
|
|
|
#define SUBQ_STATUS_DONE 0x13
|
|
|
|
|
#define SUBQ_STATUS_ERROR 0x14
|
|
|
|
|
#define SUBQ_STATUS_NONE 0x15
|
|
|
|
|
#define SUBQ_STATUS_NO_DISC 0x17 /* Illegal, but Toshiba returns it. */
|
|
|
|
|
#define SUBQ_ILLEGAL 0xff
|
|
|
|
|
|
|
|
|
|
#define PAGE_AUDIO 0x0e
|
|
|
|
|
#define LEADOUT 0xaa
|
|
|
|
@ -346,20 +346,20 @@ wm_scsi2_get_drive_status(struct wm_drive *d, int oldmode,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If we can't read status, the CD has been ejected. */
|
|
|
|
|
buf[1] = SUBTQ_ILLEGAL;
|
|
|
|
|
buf[1] = SUBQ_ILLEGAL;
|
|
|
|
|
if (sendscsi(d, buf, sizeof(buf), 1, SCMD_READ_SUBCHANNEL, 2, 64, 1,
|
|
|
|
|
0, 0, 0, sizeof(buf) / 256, sizeof(buf) % 256, 0,0,0))
|
|
|
|
|
return (0);
|
|
|
|
|
|
|
|
|
|
switch (buf[1]) {
|
|
|
|
|
case SUBTQ_STATUS_PLAY:
|
|
|
|
|
case SUBQ_STATUS_PLAY:
|
|
|
|
|
*mode = WM_CDM_PLAYING;
|
|
|
|
|
*track = buf[6];
|
|
|
|
|
*ind = buf[7];
|
|
|
|
|
*pos = buf[9] * 60 * 75 + buf[10] * 75 + buf[11];
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SUBTQ_STATUS_PAUSE:
|
|
|
|
|
case SUBQ_STATUS_PAUSE:
|
|
|
|
|
if (oldmode == WM_CDM_PLAYING || oldmode == WM_CDM_PAUSED)
|
|
|
|
|
{
|
|
|
|
|
*mode = WM_CDM_PAUSED;
|
|
|
|
@ -374,13 +374,13 @@ wm_scsi2_get_drive_status(struct wm_drive *d, int oldmode,
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* SUBTQ_STATUS_DONE is sometimes returned when the CD is idle,
|
|
|
|
|
* SUBQ_STATUS_DONE is sometimes returned when the CD is idle,
|
|
|
|
|
* even though the spec says it should only be returned when an
|
|
|
|
|
* audio play operation finishes.
|
|
|
|
|
*/
|
|
|
|
|
case SUBTQ_STATUS_DONE:
|
|
|
|
|
case SUBTQ_STATUS_NONE:
|
|
|
|
|
case SUBTQ_STATUS_INVALID:
|
|
|
|
|
case SUBQ_STATUS_DONE:
|
|
|
|
|
case SUBQ_STATUS_NONE:
|
|
|
|
|
case SUBQ_STATUS_INVALID:
|
|
|
|
|
if (oldmode == WM_CDM_PLAYING)
|
|
|
|
|
*mode = WM_CDM_TRACK_DONE;
|
|
|
|
|
else
|
|
|
|
@ -390,16 +390,16 @@ wm_scsi2_get_drive_status(struct wm_drive *d, int oldmode,
|
|
|
|
|
/*
|
|
|
|
|
* This usually means there's no disc in the drive.
|
|
|
|
|
*/
|
|
|
|
|
case SUBTQ_STATUS_NO_DISC:
|
|
|
|
|
case SUBQ_STATUS_NO_DISC:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This usually means the user ejected the CD manually.
|
|
|
|
|
*/
|
|
|
|
|
case SUBTQ_STATUS_ERROR:
|
|
|
|
|
case SUBQ_STATUS_ERROR:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SUBTQ_ILLEGAL: /* call didn't really succeed */
|
|
|
|
|
case SUBQ_ILLEGAL: /* call didn't really succeed */
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|