summaryrefslogtreecommitdiff
path: root/src/input/input_cdda.c
diff options
context:
space:
mode:
authorHeiko Schaefer <heikos@users.sourceforge.net>2003-03-29 09:37:24 +0000
committerHeiko Schaefer <heikos@users.sourceforge.net>2003-03-29 09:37:24 +0000
commit343a97eaa67d1bc20856841312a235e2602d723e (patch)
tree5281d54c6da97c47b46ba36516e03ffb0b9e8f4f /src/input/input_cdda.c
parent776aad6cb89785094fb2fbc22efbbd4f19619d7a (diff)
downloadxine-lib-343a97eaa67d1bc20856841312a235e2602d723e.tar.gz
xine-lib-343a97eaa67d1bc20856841312a235e2602d723e.tar.bz2
FreeBSD implementation. thanks to Vladimir Kushnir.
CVS patchset: 4508 CVS date: 2003/03/29 09:37:24
Diffstat (limited to 'src/input/input_cdda.c')
-rw-r--r--src/input/input_cdda.c91
1 files changed, 90 insertions, 1 deletions
diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c
index 7c06dd17d..e21fd11dc 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.10 2003/02/26 21:02:39 mroi Exp $
+ * $Id: input_cdda.c,v 1.11 2003/03/29 09:37:24 heikos Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -271,6 +271,95 @@ static void read_cdrom_frame(int fd, int frame,
}
}
+#elif defined(__FreeBSD__)
+
+#include <sys/cdio.h>
+
+static void read_cdrom_toc(int fd, cdrom_toc *toc) {
+
+ struct ioc_toc_header tochdr;
+ struct ioc_read_toc_single_entry tocentry;
+ int i;
+
+ /* fetch the table of contents */
+ if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) {
+ perror("CDIOREADTOCHEADER");
+ return;
+ }
+
+ toc->first_track = tochdr.starting_track;
+ toc->last_track = tochdr.ending_track;
+ 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.track = i;
+ tocentry.address_format = CD_MSF_FORMAT;
+ if (ioctl(fd, CDIOREADTOCENTRY, &tocentry) == -1) {
+ perror("CDIOREADTOCENTRY");
+ return;
+ }
+
+ toc->toc_entries[i-1].track_mode = (tocentry.entry.control & 0x04) ? 1 : 0;
+ toc->toc_entries[i-1].first_frame_minute = tocentry.entry.addr.msf.minute;
+ toc->toc_entries[i-1].first_frame_second = tocentry.entry.addr.msf.second;
+ toc->toc_entries[i-1].first_frame_frame = tocentry.entry.addr.msf.frame;
+ toc->toc_entries[i-1].first_frame =
+ (tocentry.entry.addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) +
+ (tocentry.entry.addr.msf.second * CD_FRAMES_PER_SECOND) +
+ tocentry.entry.addr.msf.frame;
+ }
+
+ /* fetch the leadout as well */
+ memset(&tocentry, 0, sizeof(tocentry));
+
+ tocentry.track = CD_LEADOUT_TRACK;
+ tocentry.address_format = CD_MSF_FORMAT;
+ if (ioctl(fd, CDIOREADTOCENTRY, &tocentry) == -1) {
+ perror("CDIOREADTOCENTRY");
+ return;
+ }
+
+ toc->leadout_track.track_mode = (tocentry.entry.control & 0x04) ? 1 : 0;
+ toc->leadout_track.first_frame_minute = tocentry.entry.addr.msf.minute;
+ toc->leadout_track.first_frame_second = tocentry.entry.addr.msf.second;
+ toc->leadout_track.first_frame_frame = tocentry.entry.addr.msf.frame;
+ toc->leadout_track.first_frame =
+ (tocentry.entry.addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) +
+ (tocentry.entry.addr.msf.second * CD_FRAMES_PER_SECOND) +
+ tocentry.entry.addr.msf.frame;
+}
+
+static void read_cdrom_frame(int fd, int frame,
+ unsigned char data[CD_RAW_FRAME_SIZE]) {
+
+ struct ioc_read_audio cdda;
+
+ cdda.address_format = CD_MSF_FORMAT;
+ cdda.address.msf.minute = frame / CD_SECONDS_PER_MINUTE / CD_FRAMES_PER_SECOND;
+ cdda.address.msf.second = (frame / CD_FRAMES_PER_SECOND) % CD_SECONDS_PER_MINUTE;
+ cdda.address.msf.frame = frame % CD_FRAMES_PER_SECOND;
+ cdda.nframes = 1;
+ cdda.buffer = data;
+
+ /* read a frame */
+ if(ioctl(fd, CDIOCREADAUDIO, &cdda) < 0) {
+ perror("CDIOCREADAUDIO");
+ return;
+ }
+}
+
#else