[mb-commits] r9882 - in libdiscid/branches/isrc: examples include/discid src

root at musicbrainz.org root at musicbrainz.org
Wed Jun 25 12:22:22 UTC 2008


Author: luks
Date: 2008-06-25 12:22:21 +0000 (Wed, 25 Jun 2008)
New Revision: 9882

Modified:
   libdiscid/branches/isrc/examples/Makefile.am
   libdiscid/branches/isrc/include/discid/discid.h
   libdiscid/branches/isrc/include/discid/discid_private.h
   libdiscid/branches/isrc/src/disc.c
   libdiscid/branches/isrc/src/disc_darwin.c
Log:
Initial patch from Nicholas Humfrey, see #3803

Modified: libdiscid/branches/isrc/examples/Makefile.am
===================================================================
--- libdiscid/branches/isrc/examples/Makefile.am	2008-06-25 12:17:41 UTC (rev 9881)
+++ libdiscid/branches/isrc/examples/Makefile.am	2008-06-25 12:22:21 UTC (rev 9882)
@@ -1,8 +1,10 @@
 
-noinst_PROGRAMS = discid
+noinst_PROGRAMS = discid discisrc
 
 AM_CPPFLAGS = -I$(top_srcdir)/include
 
 discid_SOURCES = discid.c
 discid_LDADD = $(top_builddir)/src/libdiscid.la
 
+discisrc_SOURCES = discisrc.c
+discisrc_LDADD = $(top_builddir)/src/libdiscid.la

Modified: libdiscid/branches/isrc/include/discid/discid.h
===================================================================
--- libdiscid/branches/isrc/include/discid/discid.h	2008-06-25 12:17:41 UTC (rev 9881)
+++ libdiscid/branches/isrc/include/discid/discid.h	2008-06-25 12:22:21 UTC (rev 9882)
@@ -277,7 +277,27 @@
  */
 LIBDISCID_API int discid_get_track_length(DiscId *d, int track_num);
 
+/**
+ * Return the Media Catalogue Number for the disc.
+ *
+ * @param d a DiscId object created by discid_new()
+ * @return a string containing an Media Catalogue Number of the disk
+ */
+LIBDISCID_API char* discid_get_mcn(DiscId *d);
 
+/**
+ * Return the ISRC for a track.
+ *
+ * Only track numbers between (and including) discid_get_first_track_num()
+ * and discid_get_last_track_num() may be used.
+ *
+ * @param d a DiscId object created by discid_new()
+ * @param track_num the number of a track
+ * @return a string containing an ISRC for the specified track
+ */
+LIBDISCID_API char* discid_get_track_isrc(DiscId *d, int track_num);
+
+
 #ifdef __cplusplus
   }
 #endif

Modified: libdiscid/branches/isrc/include/discid/discid_private.h
===================================================================
--- libdiscid/branches/isrc/include/discid/discid_private.h	2008-06-25 12:17:41 UTC (rev 9881)
+++ libdiscid/branches/isrc/include/discid/discid_private.h	2008-06-25 12:22:21 UTC (rev 9882)
@@ -46,6 +46,12 @@
 /* The URL that can be used for retrieving XML for a CD */
 #define MB_WEBSERVICE_URL		"http://mm.musicbrainz.org/ws/1/release"
 
+/* Maximum length of a Media Catalogue Number string */
+#define MCN_STR_LENGTH		13
+
+/* Maximum length of a ISRC code string */
+#define ISRC_STR_LENGTH		12
+
 /*
  * This data structure represents an audio disc.
  *
@@ -62,6 +68,8 @@
 	char submission_url[MB_MAX_URL_LENGTH+1];
 	char webservice_url[MB_MAX_URL_LENGTH+1];
 	char error_msg[MB_ERROR_MSG_LENGTH+1];
+	char isrc[100][ISRC_STR_LENGTH+1];
+	char mcn[MCN_STR_LENGTH+1];
 	int success;
 } mb_disc_private;
 

Modified: libdiscid/branches/isrc/src/disc.c
===================================================================
--- libdiscid/branches/isrc/src/disc.c	2008-06-25 12:17:41 UTC (rev 9881)
+++ libdiscid/branches/isrc/src/disc.c	2008-06-25 12:22:21 UTC (rev 9882)
@@ -172,7 +172,6 @@
 	return mb_disc_get_default_device_unportable();
 }
 
-
 int discid_get_first_track_num(DiscId *d) {
 	mb_disc_private *disc = (mb_disc_private *) d;
 
@@ -228,7 +227,28 @@
 		return disc->track_offsets[0] - disc->track_offsets[i];
 }
 
+char *discid_get_mcn(DiscId *d) {
+	mb_disc_private *disc = (mb_disc_private *) d;
 
+	assert( disc != NULL );
+
+	return disc->mcn;
+}
+
+char* discid_get_track_isrc(DiscId *d, int i) {
+	mb_disc_private *disc = (mb_disc_private *) d;
+
+	assert( disc != NULL );
+	assert( TRACK_NUM_IS_VALID(disc, i) );
+
+	if ( ! TRACK_NUM_IS_VALID(disc, i) || i == 0)
+		return NULL;
+
+  return disc->isrc[i];
+}
+
+
+
 /****************************************************************************
  *
  * Private utilities, not exported.

Modified: libdiscid/branches/isrc/src/disc_darwin.c
===================================================================
--- libdiscid/branches/isrc/src/disc_darwin.c	2008-06-25 12:17:41 UTC (rev 9881)
+++ libdiscid/branches/isrc/src/disc_darwin.c	2008-06-25 12:22:21 UTC (rev 9882)
@@ -113,6 +113,33 @@
     return kernResult;
 }
 
+static void read_disc_mcn(int fd, mb_disc_private *disc)
+{
+    dk_cd_read_mcn_t cd_read_mcn;
+    bzero(&cd_read_mcn, sizeof(cd_read_mcn));
+	
+    if(ioctl(fd, DKIOCCDREADMCN, &cd_read_mcn) == -1) {
+        fprintf(stderr, "Warning: Unable to read the disc's media catalog number.\n");
+    } else {
+        strncpy( disc->mcn, cd_read_mcn.mcn, MCN_STR_LENGTH );
+    }
+}
+
+static void read_disc_isrc(int fd, mb_disc_private *disc, int track)
+{
+    dk_cd_read_isrc_t	cd_read_isrc;
+    bzero(&cd_read_isrc, sizeof(cd_read_isrc));
+    cd_read_isrc.track = track;
+	
+    if(ioctl(fd, DKIOCCDREADISRC, &cd_read_isrc) == -1) {
+        fprintf(stderr, "Warning: Unable to read the international standard recording code (ISRC) for track %i\n", track);
+        return;
+    } else {
+        strncpy( disc->isrc[track], cd_read_isrc.isrc, ISRC_STR_LENGTH );
+    }
+}
+
+
 char *mb_disc_get_default_device_unportable(void) 
 {
     kern_return_t kernResult;
@@ -168,6 +195,9 @@
 	    free(toc.buffer);
 	    return 0;
 	}
+
+	// Read in the media catalogue number
+	read_disc_mcn( fd, disc );
   
 	cdToc = (CDTOC *)toc.buffer;
 	int numDesc = CDTOCGetDescriptorCount(cdToc);
@@ -183,11 +213,18 @@
 	    if (desc->point == 0xA2 && desc->adr == 1)
 		 disc->track_offsets[0] = CDConvertMSFToLBA(desc->p) + 150; 
   
-	    if (desc->point <= 99 && desc->adr == 1)
-		 disc->track_offsets[1 + numTracks++] = CDConvertMSFToLBA(desc->p) + 150; 
+	    if (desc->point <= 99 && desc->adr == 1) {
+		disc->track_offsets[1 + numTracks] = CDConvertMSFToLBA(desc->p) + 150; 
+		 
+		// Read in the IRSC codes for tracks
+		read_disc_isrc( fd, disc, 1 + numTracks );
+		 
+		numTracks++;
+	    }
 	}
 	disc->first_track_num = 1;
 	disc->last_track_num = numTracks;
+	
   
 	close(fd);
 	free(toc.buffer);




More information about the MusicBrainz-commits mailing list