From be0d31e422b5cea92b1a6b7d441693ef11210122 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 7 Mar 2004 16:40:15 +0000 Subject: [PATCH] Date: Sun, 07 Mar 2004 22:54:11 +0900 From: Hayashi Naoyuki Subject: Tru64 cdrom and pthread option fix SDL-1.2.7/src/cdrom/osf/SDL_syscdrom.c Fixes Some CD-ROM drives(ex. TEAC CD-532E) cannot play first 150 frames(aka gap). CheckDrive() fix. The end of comment is "* /" in AddDrive(). SDL-1.2.7/configure.in Fixes Add *-*-osf pthread option and delete line SDL_LIBS="$SDL_LIBS -lrt". --- configure.in | 10 +++- src/cdrom/osf/SDL_syscdrom.c | 108 +++++++++++++++++------------------ 2 files changed, 62 insertions(+), 56 deletions(-) diff --git a/configure.in b/configure.in index 257ca0c83..6f4c9a730 100644 --- a/configure.in +++ b/configure.in @@ -1217,6 +1217,15 @@ CheckPTHREAD() pthread_cflags="" pthread_lib="" ;; + *-*-osf*) + if test x$ac_cv_prog_gcc = xyes; then + pthread_cflags="-D_REENTRANT" + pthread_lib="-lpthread -lrt" + else + pthread_cflags="-pthread" + pthread_lib="-lpthread -lrt" + fi + ;; *) pthread_cflags="-D_REENTRANT" pthread_lib="-lpthread" @@ -2268,7 +2277,6 @@ case "$target" in CheckOpenGL CheckPTHREAD CheckSIGACTION - SDL_LIBS="$SDL_LIBS -lrt" # Set up files for the audio library if test x$enable_audio = xyes; then CFLAGS="$CFLAGS -I/usr/include/mme -DMMEAUDIO_SUPPORT" diff --git a/src/cdrom/osf/SDL_syscdrom.c b/src/cdrom/osf/SDL_syscdrom.c index 4ee92c0c1..1934f4702 100644 --- a/src/cdrom/osf/SDL_syscdrom.c +++ b/src/cdrom/osf/SDL_syscdrom.c @@ -59,46 +59,45 @@ static int SDL_SYS_CDStop(SDL_CD *cdrom); 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 @@ static void AddDrive(char *drive, struct stat *stbuf) /* 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; ist_rdev == SDL_cdmode[i] ) { #ifdef DEBUG_CDROM @@ -142,8 +141,7 @@ static void AddDrive(char *drive, struct stat *stbuf) 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 @@ static int SDL_SYS_CDGetTOC(SDL_CD *cdrom) 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 @@ static CDstatus SDL_SYS_CDStatus(SDL_CD *cdrom, int *position) /* 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 @@ void SDL_SYS_CDQuit(void) } } -