[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