diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-12-28 14:04:54 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-12-28 14:04:54 +0000 |
commit | ff554dc0a002951e3e6ab6a0c126c5d113934fc6 (patch) | |
tree | 1ff2fafbda724e018c039c11990ec73b5bbdd055 | |
parent | 86f78f0cf30ce094e6b029fee5548e2da6d5da74 (diff) | |
download | mpv-ff554dc0a002951e3e6ab6a0c126c5d113934fc6.tar.bz2 mpv-ff554dc0a002951e3e6ab6a0c126c5d113934fc6.tar.xz |
The following patch allows the MPlayer "cdparanoia" support to work on
NetBSD-1.6_STABLE, both "cdda://NN" and "cddb://NN" URI's.
The CDROM ioctl's are actually more like OpenBSD's than FreeBSD's. I
went with the "/dev/cdrom" symlink as the default device, though, as
it otherwise gets messy fast... The first CDROM is "/dev/rcd0d" on
NetBSD/i386, but "/dev/rcd0c" on all other NetBSD ports, and only the
cdda_identify_scsi() form seems to work on NetBSD. (I searched the web
in vain for the Paranoia API, so I'm left to hacking. ;-))
Frederick Bruckman <fredb@immanent.net>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8610 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libmpdemux/cdda.c | 4 | ||||
-rw-r--r-- | libmpdemux/cddb.c | 46 |
2 files changed, 49 insertions, 1 deletions
diff --git a/libmpdemux/cdda.c b/libmpdemux/cdda.c index 33fcfd9ee3..e87b0864af 100644 --- a/libmpdemux/cdda.c +++ b/libmpdemux/cdda.c @@ -12,7 +12,11 @@ static int speed = -1; static int paranoia_mode = 1; +#if defined(__NetBSD__) +static char* generic_dev = "/dev/cdrom"; +#else static char* generic_dev = NULL; +#endif static int sector_size = 0; static int search_overlap = -1; static int toc_bias = 0; diff --git a/libmpdemux/cddb.c b/libmpdemux/cddb.c index 9dd54ce42b..6b1d5fe713 100644 --- a/libmpdemux/cddb.c +++ b/libmpdemux/cddb.c @@ -28,10 +28,14 @@ #include <sys/types.h> #include <sys/stat.h> -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__bsdi__) +#if defined(__FreeBSD__) || defined(__bsdi__) #define SYS_BSD 1 #endif +#if defined(__NetBSD__) + #define SYS_NBSD 1 +#endif + #if defined(__OpenBSD__) #define SYS_OBSD 1 #endif @@ -40,6 +44,8 @@ #include <linux/cdrom.h> #elif defined(SYS_BSD) #include <sys/cdio.h> +#elif defined(SYS_NBSD) + #include <sys/cdio.h> #elif defined(SYS_OBSD) #include <util.h> #include <sys/cdio.h> @@ -119,6 +125,44 @@ read_toc(void) { return tochdr.ending_track; } +#elif defined(SYS_NBSD) +int +read_toc(void) { + int drive; + struct ioc_toc_header tochdr; + struct ioc_read_toc_entry tocentry; + int i; + struct cd_toc_entry toc_buffer; + + drive = open("/dev/cdrom", O_RDONLY | O_NONBLOCK); + if (!drive) + return -1; + + ioctl(drive, CDIOREADTOCHEADER, &tochdr); + for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { + tocentry.starting_track = i; + tocentry.address_format = CD_MSF_FORMAT; + tocentry.data = &toc_buffer; + tocentry.data_len = sizeof(toc_buffer); + ioctl(drive, CDIOREADTOCENTRYS, &tocentry); + cdtoc[i-1].min = toc_buffer.addr.msf.minute; + cdtoc[i-1].sec = toc_buffer.addr.msf.second; + cdtoc[i-1].frame = toc_buffer.addr.msf.frame; + cdtoc[i-1].frame += cdtoc[i-1].min*60*75; + cdtoc[i-1].frame += cdtoc[i-1].sec*75; + } + tocentry.starting_track = 0xAA; + tocentry.address_format = CD_MSF_FORMAT; + ioctl(drive, CDIOREADTOCENTRYS, &tocentry); + cdtoc[tochdr.ending_track].min = toc_buffer.addr.msf.minute; + cdtoc[tochdr.ending_track].sec = toc_buffer.addr.msf.second; + cdtoc[tochdr.ending_track].frame = toc_buffer.addr.msf.frame; + cdtoc[tochdr.ending_track].frame += cdtoc[tochdr.ending_track].min*60*75; + cdtoc[tochdr.ending_track].frame += cdtoc[tochdr.ending_track].sec*75; + close(drive); + return tochdr.ending_track; +} + #elif defined(SYS_OBSD) int read_toc(void) { |