changeset 20581:bfcc98ad59ba

Factor out common code in stream_cddb read_toc function.
author reimar
date Wed, 01 Nov 2006 19:14:28 +0000
parents b129981eee49
children 04b535afeaea
files stream/stream_cddb.c
diffstat 1 files changed, 11 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/stream/stream_cddb.c	Wed Nov 01 19:11:43 2006 +0000
+++ b/stream/stream_cddb.c	Wed Nov 01 19:14:28 2006 +0000
@@ -62,13 +62,14 @@
 static cd_toc_t cdtoc[100];
 static int cdtoc_last_track;
 
-#if defined(__linux__) || defined(__bsdi__)
 int 
 read_toc(const char *dev) {
+	int first, last;
+	int i;
+#if defined(__linux__) || defined(__bsdi__)
 	int drive;
 	struct cdrom_tochdr tochdr;
 	struct cdrom_tocentry tocentry;
-	int i;
 
 	drive = open(dev, O_RDONLY | O_NONBLOCK);
 	if( drive<0 ) {
@@ -76,6 +77,7 @@
 	}
 	
 	ioctl(drive, CDROMREADTOCHDR, &tochdr);
+	first = tochdr.cdth_trk0 - 1; last = tochdr.cdth_trk1;
 	for (i = tochdr.cdth_trk0; i <= tochdr.cdth_trk1; i++) {
 		tocentry.cdte_track = i;
 		tocentry.cdte_format = CDROM_MSF;
@@ -83,8 +85,6 @@
 		cdtoc[i-1].min = tocentry.cdte_addr.msf.minute;
 		cdtoc[i-1].sec = tocentry.cdte_addr.msf.second;
 		cdtoc[i-1].frame = tocentry.cdte_addr.msf.frame;
-		cdtoc[i-1].frame += cdtoc[i-1].min*60*75;
-		cdtoc[i-1].frame += cdtoc[i-1].sec*75;
 	}
 	tocentry.cdte_track = 0xAA;
 	tocentry.cdte_format = CDROM_MSF;
@@ -92,20 +92,13 @@
 	cdtoc[tochdr.cdth_trk1].min = tocentry.cdte_addr.msf.minute;
 	cdtoc[tochdr.cdth_trk1].sec = tocentry.cdte_addr.msf.second;
 	cdtoc[tochdr.cdth_trk1].frame = tocentry.cdte_addr.msf.frame;
-	cdtoc[tochdr.cdth_trk1].frame += cdtoc[tochdr.cdth_trk1].min*60*75;
-	cdtoc[tochdr.cdth_trk1].frame += cdtoc[tochdr.cdth_trk1].sec*75;
 	close(drive);
-	return tochdr.cdth_trk1;
-}
 
 #elif defined(WIN32)
-int
-read_toc(const char *dev) {
         HANDLE drive;
         DWORD r;
         CDROM_TOC toc;
         char device[10];
-        int i;
 
         sprintf(device, "\\\\.\\%s", dev);
         drive = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
@@ -115,29 +108,21 @@
                 return 0;
         }
 
+        first = toc.FirstTrack - 1; last = toc.LastTrack;
         for (i = toc.FirstTrack; i <= toc.LastTrack; i++) {
 		cdtoc[i-1].min = toc.TrackData[i - 1].Address[1];
 		cdtoc[i-1].sec = toc.TrackData[i - 1].Address[2];
 		cdtoc[i-1].frame = toc.TrackData[i - 1].Address[3];
-		cdtoc[i-1].frame += cdtoc[i-1].min*60*75;
-		cdtoc[i-1].frame += cdtoc[i-1].sec*75;
         }
         cdtoc[toc.LastTrack].min = toc.TrackData[toc.LastTrack].Address[1];
         cdtoc[toc.LastTrack].sec = toc.TrackData[toc.LastTrack].Address[2];
         cdtoc[toc.LastTrack].frame = toc.TrackData[toc.LastTrack].Address[3];
-        cdtoc[toc.LastTrack].frame += cdtoc[toc.LastTrack].min*60*75;
-        cdtoc[toc.LastTrack].frame += cdtoc[toc.LastTrack].sec*75;
         CloseHandle(drive);
-        return toc.LastTrack;
-}
 
 #elif defined(__FreeBSD__) || defined(__DragonFly__)
-int 
-read_toc(const char *dev) {
 	int drive;
 	struct ioc_toc_header tochdr;
 	struct ioc_read_toc_single_entry tocentry;
-	int i;
 
 	drive = open(dev, O_RDONLY | O_NONBLOCK);
 	if( drive<0 ) {
@@ -145,6 +130,7 @@
 	}
 
 	ioctl(drive, CDIOREADTOCHEADER, &tochdr);
+	first = tochdr.starting_track; last = tochdr.ending_track;
 	for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
 		tocentry.track = i;
 		tocentry.address_format = CD_MSF_FORMAT;
@@ -152,8 +138,6 @@
 		cdtoc[i-1].min = tocentry.entry.addr.msf.minute;
 		cdtoc[i-1].sec = tocentry.entry.addr.msf.second;
 		cdtoc[i-1].frame = tocentry.entry.addr.msf.frame;
-		cdtoc[i-1].frame += cdtoc[i-1].min*60*75;
-		cdtoc[i-1].frame += cdtoc[i-1].sec*75;
 	}
 	tocentry.track = 0xAA;
 	tocentry.address_format = CD_MSF_FORMAT;
@@ -161,19 +145,12 @@
 	cdtoc[tochdr.ending_track].min = tocentry.entry.addr.msf.minute;
 	cdtoc[tochdr.ending_track].sec = tocentry.entry.addr.msf.second;
 	cdtoc[tochdr.ending_track].frame = tocentry.entry.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(__NetBSD__) || defined(__OpenBSD__)
-int
-read_toc(const char *dev) {
 	int drive;
 	struct ioc_toc_header tochdr;
 	struct ioc_read_toc_entry tocentry;
-	int i;
 	struct cd_toc_entry toc_buffer;
 
 	drive = open(dev, O_RDONLY | O_NONBLOCK);
@@ -182,6 +159,7 @@
 	}
 
 	ioctl(drive, CDIOREADTOCHEADER, &tochdr);
+	first = tochdr.starting_track - 1; last = tochdr.ending_track;
 	for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
 		tocentry.starting_track = i;
 		tocentry.address_format = CD_MSF_FORMAT;
@@ -191,8 +169,6 @@
 		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;
@@ -200,12 +176,12 @@
 	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;
+#endif
+	for (i = first; i <= last; i++)
+	  cdtoc[i].frame += (cdtoc[i].min * 60 + cdtoc[i].sec) * 75;
+	return last;
 }
-#endif
 
 /** 
 \brief Reads TOC from CD in the given device and prints the number of tracks