src/cdrom/osf/SDL_syscdrom.c
changeset 873 89666943c598
parent 654 e92bcf2573cb
child 874 9719e7f51a3a
--- a/src/cdrom/osf/SDL_syscdrom.c	Sat Mar 06 02:58:06 2004 +0000
+++ b/src/cdrom/osf/SDL_syscdrom.c	Sun Mar 07 16:40:15 2004 +0000
@@ -59,46 +59,45 @@
 static int         SDL_SYS_CDEject(SDL_CD *cdrom);
 static void        SDL_SYS_CDClose(SDL_CD *cdrom);
 
-/* Some ioctl() errno values which occur when the tray is empty */
-#define ERRNO_TRAYEMPTY(errno)	\
-    ((errno == EIO) || (errno == ENOENT) || (errno == EINVAL))
-
 /* Check a drive to see if it is a CD-ROM */
 /* Caution!! Not tested. */ 
 static int CheckDrive(char *drive, struct stat *stbuf)
 {
-    int is_cd, cdfd;
-    struct cd_sub_channel info;
+    int cdfd, is_cd = 0;
+    struct mode_sel_sns_params msp;
+    struct inquiry_info inq;
+
+#ifdef DEBUG_CDROM
+    char *devtype[] = {"Disk", "Tape", "Printer", "Processor", "WORM",
+	"CD-ROM", "Scanner", "Optical", "Changer", "Comm", "Unknown"};
+#endif
+
+    bzero(&msp, sizeof(msp));
+    bzero(&inq, sizeof(inq));
 
     /* If it doesn't exist, return -1 */
     if ( stat(drive, stbuf) < 0 ) {
 	return(-1);
     }
 
-    /* If it does exist, verify that it's an available CD-ROM */
-    is_cd = 0;
-    if ( S_ISCHR(stbuf->st_mode) || S_ISBLK(stbuf->st_mode) ) {
-	cdfd = open(drive, (O_RDWR|O_NDELAY), 0);
-	if ( cdfd >= 0 ) {
-	    info.sch_address_format = CDROM_MSF_FORMAT;
-	    info.sch_data_format = CDROM_CURRENT_POSITION;
-	    info.sch_alloc_length = 0;
-	    info.sch_track_number = 0;
-	    info.sch_buffer = NULL;
-	    /*
-	     *
-	     * Under Linux, EIO occurs when a disk is not present.
-	     * This isn't 100% reliable, so we use the USE_MNTENT
-	     * code above instead.
-	     *
-	     */
-	    if ( (ioctl(cdfd, CDROM_READ_SUBCHANNEL, &info) == 0) ||
-		    ERRNO_TRAYEMPTY(errno) ) {
-		is_cd = 1;
-	    }
+    if ( (cdfd = open(drive, (O_RDWR|O_NDELAY), 0)) >= 0 ) {
+	msp.msp_addr   =   (caddr_t) &inq;
+	msp.msp_pgcode =                0;
+	msp.msp_pgctrl =                0;
+	msp.msp_length =      sizeof(inq);
+	msp.msp_setps  =                0;
 
-	    close(cdfd);
-	}
+	if ( ioctl(cdfd, SCSI_GET_INQUIRY_DATA, &msp) )
+	    return (0);
+
+#ifdef DEBUG_CDROM
+	fprintf(stderr, "Device Type: %s\n", devtype[inq.perfdt]);
+	fprintf(stderr, "Vendor: %.8s\n", inq.vndrid);
+	fprintf(stderr, "Product: %.8s\n", inq.prodid);
+	fprintf(stderr, "Revision: %.8s\n", inq.revlvl);
+#endif
+	if ( inq.perfdt == DTYPE_RODIRECT )
+	    is_cd = 1;
     }
 
     return(is_cd);
@@ -113,7 +112,7 @@
 	/* Check to make sure it's not already in our list.
 	 * This can happen when we see a drive via symbolic link.
 	 *
-	 * /
+	 */
 	for ( i=0; i<SDL_numcds; ++i ) {
 	    if ( stbuf->st_rdev == SDL_cdmode[i] ) {
 #ifdef DEBUG_CDROM
@@ -142,8 +141,7 @@
 
 int  SDL_SYS_CDInit(void)
 {
-    /* checklist: /dev/cdrom,/dev/cd?c /dev/acd?c
-     * /dev/matcd?c /dev/mcd?c /dev/scd?c
+    /* checklist: /dev/rdisk/cdrom?c
      *
      */
     static char *checklist[] = {
@@ -287,28 +285,28 @@
 	return -1;
     }
 
-    (char *)cdte = toc.toc_buffer + sizeof(hdr);
-	for (i=0; i <= cdrom->numtracks; ++i) {
-	    if (i == cdrom->numtracks ) {
-		cdrom->track[i].id = 0xAA;;
-	    } else {
-		cdrom->track[i].id = hdr.th_starting_track + i;
-	    }
+    cdte =(struct cd_toc_entry *) ((char *) toc.toc_buffer + sizeof(hdr));
+    for (i=0; i <= cdrom->numtracks; ++i) {
+	if (i == cdrom->numtracks ) {
+	    cdrom->track[i].id = 0xAA;;
+	} else {
+	    cdrom->track[i].id = hdr.th_starting_track + i;
+	}
 
-	    cdrom->track[i].type =
-		cdte[i].te_control & CDROM_DATA_TRACK;
-	    cdrom->track[i].offset =
-		cdte[i].te_absaddr.lba.addr3 << 24 |
-		cdte[i].te_absaddr.lba.addr2 << 16 |
-		cdte[i].te_absaddr.lba.addr1 << 8  |
-		cdte[i].te_absaddr.lba.addr0;
-	    cdrom->track[i].length = 0;
-	    if ( i > 0 ) {
-		cdrom->track[i - 1].length =
-		    cdrom->track[i].offset -
-		    cdrom->track[i - 1].offset;
-	    }
+	cdrom->track[i].type =
+	    cdte[i].te_control & CDROM_DATA_TRACK;
+	cdrom->track[i].offset =
+	    cdte[i].te_absaddr.lba.addr3 << 24 |
+	    cdte[i].te_absaddr.lba.addr2 << 16 |
+	    cdte[i].te_absaddr.lba.addr1 << 8  |
+	    cdte[i].te_absaddr.lba.addr0;
+	cdrom->track[i].length = 0;
+	if ( i > 0 ) {
+	    cdrom->track[i - 1].length =
+		cdrom->track[i].offset -
+		cdrom->track[i - 1].offset;
 	}
+    }
 #ifdef DEBUG_CDROM
   for (i = 0; i <= cdrom->numtracks; i++) {
     fprintf(stderr,"toc_entry[%d].te_track_number = %d\n",
@@ -388,13 +386,14 @@
 /* Start play */
 static int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length)
 {
-/* Play MSF
- *
+/*
+ * Play MSF
  */
     struct cd_play_audio_msf msf;
     int end;
 
     bzero(&msf, sizeof(msf));
+    start += 150; /* Some CD-ROM drives cannot play the first 150 frames. */
     end = start +length;
     FRAMES_TO_MSF(start,
 		  &msf.msf_starting_M_unit,
@@ -450,4 +449,3 @@
     }
 }
 
-