src/cdrom/osf/SDL_syscdrom.c
changeset 873 89666943c598
parent 654 e92bcf2573cb
child 874 9719e7f51a3a
equal deleted inserted replaced
872:e7be95d758e8 873:89666943c598
    57 static int         SDL_SYS_CDResume(SDL_CD *cdrom);
    57 static int         SDL_SYS_CDResume(SDL_CD *cdrom);
    58 static int         SDL_SYS_CDStop(SDL_CD *cdrom);
    58 static int         SDL_SYS_CDStop(SDL_CD *cdrom);
    59 static int         SDL_SYS_CDEject(SDL_CD *cdrom);
    59 static int         SDL_SYS_CDEject(SDL_CD *cdrom);
    60 static void        SDL_SYS_CDClose(SDL_CD *cdrom);
    60 static void        SDL_SYS_CDClose(SDL_CD *cdrom);
    61 
    61 
    62 /* Some ioctl() errno values which occur when the tray is empty */
       
    63 #define ERRNO_TRAYEMPTY(errno)	\
       
    64     ((errno == EIO) || (errno == ENOENT) || (errno == EINVAL))
       
    65 
       
    66 /* Check a drive to see if it is a CD-ROM */
    62 /* Check a drive to see if it is a CD-ROM */
    67 /* Caution!! Not tested. */ 
    63 /* Caution!! Not tested. */ 
    68 static int CheckDrive(char *drive, struct stat *stbuf)
    64 static int CheckDrive(char *drive, struct stat *stbuf)
    69 {
    65 {
    70     int is_cd, cdfd;
    66     int cdfd, is_cd = 0;
    71     struct cd_sub_channel info;
    67     struct mode_sel_sns_params msp;
       
    68     struct inquiry_info inq;
       
    69 
       
    70 #ifdef DEBUG_CDROM
       
    71     char *devtype[] = {"Disk", "Tape", "Printer", "Processor", "WORM",
       
    72 	"CD-ROM", "Scanner", "Optical", "Changer", "Comm", "Unknown"};
       
    73 #endif
       
    74 
       
    75     bzero(&msp, sizeof(msp));
       
    76     bzero(&inq, sizeof(inq));
    72 
    77 
    73     /* If it doesn't exist, return -1 */
    78     /* If it doesn't exist, return -1 */
    74     if ( stat(drive, stbuf) < 0 ) {
    79     if ( stat(drive, stbuf) < 0 ) {
    75 	return(-1);
    80 	return(-1);
    76     }
    81     }
    77 
    82 
    78     /* If it does exist, verify that it's an available CD-ROM */
    83     if ( (cdfd = open(drive, (O_RDWR|O_NDELAY), 0)) >= 0 ) {
    79     is_cd = 0;
    84 	msp.msp_addr   =   (caddr_t) &inq;
    80     if ( S_ISCHR(stbuf->st_mode) || S_ISBLK(stbuf->st_mode) ) {
    85 	msp.msp_pgcode =                0;
    81 	cdfd = open(drive, (O_RDWR|O_NDELAY), 0);
    86 	msp.msp_pgctrl =                0;
    82 	if ( cdfd >= 0 ) {
    87 	msp.msp_length =      sizeof(inq);
    83 	    info.sch_address_format = CDROM_MSF_FORMAT;
    88 	msp.msp_setps  =                0;
    84 	    info.sch_data_format = CDROM_CURRENT_POSITION;
    89 
    85 	    info.sch_alloc_length = 0;
    90 	if ( ioctl(cdfd, SCSI_GET_INQUIRY_DATA, &msp) )
    86 	    info.sch_track_number = 0;
    91 	    return (0);
    87 	    info.sch_buffer = NULL;
    92 
    88 	    /*
    93 #ifdef DEBUG_CDROM
    89 	     *
    94 	fprintf(stderr, "Device Type: %s\n", devtype[inq.perfdt]);
    90 	     * Under Linux, EIO occurs when a disk is not present.
    95 	fprintf(stderr, "Vendor: %.8s\n", inq.vndrid);
    91 	     * This isn't 100% reliable, so we use the USE_MNTENT
    96 	fprintf(stderr, "Product: %.8s\n", inq.prodid);
    92 	     * code above instead.
    97 	fprintf(stderr, "Revision: %.8s\n", inq.revlvl);
    93 	     *
    98 #endif
    94 	     */
    99 	if ( inq.perfdt == DTYPE_RODIRECT )
    95 	    if ( (ioctl(cdfd, CDROM_READ_SUBCHANNEL, &info) == 0) ||
   100 	    is_cd = 1;
    96 		    ERRNO_TRAYEMPTY(errno) ) {
       
    97 		is_cd = 1;
       
    98 	    }
       
    99 
       
   100 	    close(cdfd);
       
   101 	}
       
   102     }
   101     }
   103 
   102 
   104     return(is_cd);
   103     return(is_cd);
   105 }
   104 }
   106 
   105 
   111 
   110 
   112     if ( SDL_numcds < MAX_DRIVES ) {
   111     if ( SDL_numcds < MAX_DRIVES ) {
   113 	/* Check to make sure it's not already in our list.
   112 	/* Check to make sure it's not already in our list.
   114 	 * This can happen when we see a drive via symbolic link.
   113 	 * This can happen when we see a drive via symbolic link.
   115 	 *
   114 	 *
   116 	 * /
   115 	 */
   117 	for ( i=0; i<SDL_numcds; ++i ) {
   116 	for ( i=0; i<SDL_numcds; ++i ) {
   118 	    if ( stbuf->st_rdev == SDL_cdmode[i] ) {
   117 	    if ( stbuf->st_rdev == SDL_cdmode[i] ) {
   119 #ifdef DEBUG_CDROM
   118 #ifdef DEBUG_CDROM
   120   fprintf(stderr, "Duplicate drive detected: %s == %s\n", drive, SDL_cdlist[i]);
   119   fprintf(stderr, "Duplicate drive detected: %s == %s\n", drive, SDL_cdlist[i]);
   121 #endif
   120 #endif
   140     }
   139     }
   141 }
   140 }
   142 
   141 
   143 int  SDL_SYS_CDInit(void)
   142 int  SDL_SYS_CDInit(void)
   144 {
   143 {
   145     /* checklist: /dev/cdrom,/dev/cd?c /dev/acd?c
   144     /* checklist: /dev/rdisk/cdrom?c
   146      * /dev/matcd?c /dev/mcd?c /dev/scd?c
       
   147      *
   145      *
   148      */
   146      */
   149     static char *checklist[] = {
   147     static char *checklist[] = {
   150 	"?0 rdisk/cdrom?",NULL};
   148 	"?0 rdisk/cdrom?",NULL};
   151     char drive[32];
   149     char drive[32];
   285     if (ioctl(cdrom->id, CDROM_TOC_ENTRYS, &toc)) {
   283     if (ioctl(cdrom->id, CDROM_TOC_ENTRYS, &toc)) {
   286 	fprintf(stderr,"ioctl error CDROM_TOC_ENTRYS\n");
   284 	fprintf(stderr,"ioctl error CDROM_TOC_ENTRYS\n");
   287 	return -1;
   285 	return -1;
   288     }
   286     }
   289 
   287 
   290     (char *)cdte = toc.toc_buffer + sizeof(hdr);
   288     cdte =(struct cd_toc_entry *) ((char *) toc.toc_buffer + sizeof(hdr));
   291 	for (i=0; i <= cdrom->numtracks; ++i) {
   289     for (i=0; i <= cdrom->numtracks; ++i) {
   292 	    if (i == cdrom->numtracks ) {
   290 	if (i == cdrom->numtracks ) {
   293 		cdrom->track[i].id = 0xAA;;
   291 	    cdrom->track[i].id = 0xAA;;
   294 	    } else {
   292 	} else {
   295 		cdrom->track[i].id = hdr.th_starting_track + i;
   293 	    cdrom->track[i].id = hdr.th_starting_track + i;
   296 	    }
   294 	}
   297 
   295 
   298 	    cdrom->track[i].type =
   296 	cdrom->track[i].type =
   299 		cdte[i].te_control & CDROM_DATA_TRACK;
   297 	    cdte[i].te_control & CDROM_DATA_TRACK;
   300 	    cdrom->track[i].offset =
   298 	cdrom->track[i].offset =
   301 		cdte[i].te_absaddr.lba.addr3 << 24 |
   299 	    cdte[i].te_absaddr.lba.addr3 << 24 |
   302 		cdte[i].te_absaddr.lba.addr2 << 16 |
   300 	    cdte[i].te_absaddr.lba.addr2 << 16 |
   303 		cdte[i].te_absaddr.lba.addr1 << 8  |
   301 	    cdte[i].te_absaddr.lba.addr1 << 8  |
   304 		cdte[i].te_absaddr.lba.addr0;
   302 	    cdte[i].te_absaddr.lba.addr0;
   305 	    cdrom->track[i].length = 0;
   303 	cdrom->track[i].length = 0;
   306 	    if ( i > 0 ) {
   304 	if ( i > 0 ) {
   307 		cdrom->track[i - 1].length =
   305 	    cdrom->track[i - 1].length =
   308 		    cdrom->track[i].offset -
   306 		cdrom->track[i].offset -
   309 		    cdrom->track[i - 1].offset;
   307 		cdrom->track[i - 1].offset;
   310 	    }
   308 	}
   311 	}
   309     }
   312 #ifdef DEBUG_CDROM
   310 #ifdef DEBUG_CDROM
   313   for (i = 0; i <= cdrom->numtracks; i++) {
   311   for (i = 0; i <= cdrom->numtracks; i++) {
   314     fprintf(stderr,"toc_entry[%d].te_track_number = %d\n",
   312     fprintf(stderr,"toc_entry[%d].te_track_number = %d\n",
   315 	    i,cdte[i].te_track_number);
   313 	    i,cdte[i].te_track_number);
   316     fprintf(stderr,"cdrom->track[%d].id = %d\n", i,cdrom->track[i].id);
   314     fprintf(stderr,"cdrom->track[%d].id = %d\n", i,cdrom->track[i].id);
   386 }
   384 }
   387 
   385 
   388 /* Start play */
   386 /* Start play */
   389 static int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length)
   387 static int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length)
   390 {
   388 {
   391 /* Play MSF
   389 /*
   392  *
   390  * Play MSF
   393  */
   391  */
   394     struct cd_play_audio_msf msf;
   392     struct cd_play_audio_msf msf;
   395     int end;
   393     int end;
   396 
   394 
   397     bzero(&msf, sizeof(msf));
   395     bzero(&msf, sizeof(msf));
       
   396     start += 150; /* Some CD-ROM drives cannot play the first 150 frames. */
   398     end = start +length;
   397     end = start +length;
   399     FRAMES_TO_MSF(start,
   398     FRAMES_TO_MSF(start,
   400 		  &msf.msf_starting_M_unit,
   399 		  &msf.msf_starting_M_unit,
   401 		  &msf.msf_starting_S_unit,
   400 		  &msf.msf_starting_S_unit,
   402 		  &msf.msf_starting_F_unit);
   401 		  &msf.msf_starting_F_unit);
   448 	}
   447 	}
   449 	SDL_numcds = 0;
   448 	SDL_numcds = 0;
   450     }
   449     }
   451 }
   450 }
   452 
   451 
   453