diff options
author | Juergen Keil <jkeil@users.sourceforge.net> | 2003-01-08 10:05:46 +0000 |
---|---|---|
committer | Juergen Keil <jkeil@users.sourceforge.net> | 2003-01-08 10:05:46 +0000 |
commit | 1fb58a63872660424777d41389e426dc90f1b660 (patch) | |
tree | bb8d6bda0fd3fce0058b35d79d9f86c3db298a42 /src | |
parent | 942a138423f11bc2322bd6ee5b7d5edd3f01697f (diff) | |
download | xine-lib-1fb58a63872660424777d41389e426dc90f1b660.tar.gz xine-lib-1fb58a63872660424777d41389e426dc90f1b660.tar.bz2 |
Add the missing "solaris" bits for the 'cdda' input plugin
CVS patchset: 3827
CVS date: 2003/01/08 10:05:46
Diffstat (limited to 'src')
-rw-r--r-- | src/input/input_cdda.c | 100 |
1 files changed, 98 insertions, 2 deletions
diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c index 1ae66225f..717412093 100644 --- a/src/input/input_cdda.c +++ b/src/input/input_cdda.c @@ -20,7 +20,7 @@ * Compact Disc Digital Audio (CDDA) Input Plugin * by Mike Melanson (melanson@pcisys.net) * - * $Id: input_cdda.c,v 1.4 2003/01/08 00:03:58 f1rmb Exp $ + * $Id: input_cdda.c,v 1.5 2003/01/08 10:05:46 jkeil Exp $ */ #ifdef HAVE_CONFIG_H @@ -39,6 +39,12 @@ #include "xineutils.h" #include "input_plugin.h" +#if defined(__sun) +#define DEFAULT_CDDA_DEVICE "/vol/dev/aliases/cdrom0" +#else +#define DEFAULT_CDDA_DEVICE "/dev/cdrom" +#endif + /* CD-relevant defines and data structures */ #define CD_SECONDS_PER_MINUTE 60 #define CD_FRAMES_PER_SECOND 75 @@ -169,6 +175,93 @@ static void read_cdrom_frame(int fd, int frame, } } +#elif defined(__sun) + +#include <sys/cdio.h> + +static void read_cdrom_toc(int fd, cdrom_toc *toc) { + + struct cdrom_tochdr tochdr; + struct cdrom_tocentry tocentry; + int i; + + /* fetch the table of contents */ + if (ioctl(fd, CDROMREADTOCHDR, &tochdr) == -1) { + perror("CDROMREADTOCHDR"); + return; + } + + toc->first_track = tochdr.cdth_trk0; + toc->last_track = tochdr.cdth_trk1; + toc->total_tracks = toc->last_track - toc->first_track + 1; + + /* allocate space for the toc entries */ + toc->toc_entries = + (cdrom_toc_entry *)malloc(toc->total_tracks * sizeof(cdrom_toc_entry)); + if (!toc->toc_entries) { + perror("malloc"); + return; + } + + /* fetch each toc entry */ + for (i = toc->first_track; i <= toc->last_track; i++) { + + memset(&tocentry, 0, sizeof(tocentry)); + + tocentry.cdte_track = i; + tocentry.cdte_format = CDROM_MSF; + if (ioctl(fd, CDROMREADTOCENTRY, &tocentry) == -1) { + perror("CDROMREADTOCENTRY"); + return; + } + + toc->toc_entries[i-1].track_mode = (tocentry.cdte_ctrl & 0x04) ? 1 : 0; + toc->toc_entries[i-1].first_frame_minute = tocentry.cdte_addr.msf.minute; + toc->toc_entries[i-1].first_frame_second = tocentry.cdte_addr.msf.second; + toc->toc_entries[i-1].first_frame_frame = tocentry.cdte_addr.msf.frame; + toc->toc_entries[i-1].first_frame = + (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) + + (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) + + tocentry.cdte_addr.msf.frame; + } + + /* fetch the leadout as well */ + memset(&tocentry, 0, sizeof(tocentry)); + + tocentry.cdte_track = CD_LEADOUT_TRACK; + tocentry.cdte_format = CDROM_MSF; + if (ioctl(fd, CDROMREADTOCENTRY, &tocentry) == -1) { + perror("CDROMREADTOCENTRY"); + return; + } + + toc->leadout_track.track_mode = (tocentry.cdte_ctrl & 0x04) ? 1 : 0; + toc->leadout_track.first_frame_minute = tocentry.cdte_addr.msf.minute; + toc->leadout_track.first_frame_second = tocentry.cdte_addr.msf.second; + toc->leadout_track.first_frame_frame = tocentry.cdte_addr.msf.frame; + toc->leadout_track.first_frame = + (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) + + (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) + + tocentry.cdte_addr.msf.frame; +} + +static void read_cdrom_frame(int fd, int frame, + unsigned char data[CD_RAW_FRAME_SIZE]) { + + struct cdrom_cdda cdda; + + cdda.cdda_addr = frame - 2 * CD_FRAMES_PER_SECOND; + cdda.cdda_length = 1; + cdda.cdda_data = data; + cdda.cdda_subcode = CDROM_DA_NO_SUBCODE; + + /* read a frame */ + if(ioctl(fd, CDROMCDDA, &cdda) < 0) { + perror("CDROMCDDA"); + return; + } +} + #else @@ -331,12 +424,15 @@ static input_plugin_t *open_plugin (input_class_t *cls_gen, xine_stream_t *strea track = atoi(&data[5]); else track = atoi(&data[6]); + /* CD tracks start at 1, reject illegal tracks */ + if (track <= 0) + return NULL; } else return NULL; /* get the CD TOC */ init_cdrom_toc(&toc); - fd = open ("/dev/cdrom", O_RDONLY); + fd = open (DEFAULT_CDDA_DEVICE, O_RDONLY); if (fd == -1) return NULL; read_cdrom_toc(fd, &toc); |