diff --git a/include/cdio/track.h b/include/cdio/track.h index 87b94dea..93e67ba5 100644 --- a/include/cdio/track.h +++ b/include/cdio/track.h @@ -1,5 +1,5 @@ /* -*- c -*- - $Id: track.h,v 1.12 2008/03/16 00:12:42 rocky Exp $ + $Id: track.h,v 1.13 2008/03/20 01:40:28 edsdead Exp $ Copyright (C) 2005, 2006 Rocky Bernstein @@ -218,6 +218,20 @@ extern "C" { @return the starting LSN or CDIO_INVALID_LSN on error. */ lsn_t cdio_get_track_pregap_lsn(const CdIo_t *p_cdio, track_t i_track); + + /*! + Get the International Standard Recording Code (ISRC) for track number + i_track in p_cdio. Track numbers usually start at something + greater than 0, usually 1. + + @return the International Standard Recording Code (ISRC) or NULL + if there is none or we don't have the ability to get it. + + Note: string is malloc'd so caller has to free() the returned + string when done with it. + + */ + char * cdio_get_track_isrc (const CdIo_t *p_cdio, track_t i_track); /*! Return the starting MSF (minutes/secs/frames) for track number diff --git a/lib/driver/cdio_private.h b/lib/driver/cdio_private.h index ad0bbe17..85386073 100644 --- a/lib/driver/cdio_private.h +++ b/lib/driver/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.32 2008/03/16 00:12:43 rocky Exp $ + $Id: cdio_private.h,v 1.33 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2003, 2004, 2005 Rocky Bernstein @@ -267,6 +267,15 @@ extern "C" { CDIO_INVALID_LBA is returned on error. */ lba_t (*get_track_pregap_lba) ( const void *p_env, track_t i_track ); + + /*! + Return the International Standard Recording Code (ISRC) for track number + i_track in p_cdio. Track numbers start at 1. + + Note: string is malloc'd so caller has to free() the returned + string when done with it. + */ + char * (*get_track_isrc) ( const CdIo_t *p_cdio, track_t i_track ); /*! Get format of track. diff --git a/lib/driver/image/bincue.c b/lib/driver/image/bincue.c index ab5ef77f..171e216b 100644 --- a/lib/driver/image/bincue.c +++ b/lib/driver/image/bincue.c @@ -1,5 +1,5 @@ /* - $Id: bincue.c,v 1.21 2008/03/19 04:38:52 edsdead Exp $ + $Id: bincue.c,v 1.22 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2002, 2003, 2004, 2005, 2006 Rocky Bernstein @@ -27,7 +27,7 @@ (*.cue). */ -static const char _rcsid[] = "$Id: bincue.c,v 1.21 2008/03/19 04:38:52 edsdead Exp $"; +static const char _rcsid[] = "$Id: bincue.c,v 1.22 2008/03/20 01:40:29 edsdead Exp $"; #include "image.h" #include "cdio_assert.h" @@ -1154,14 +1154,15 @@ cdio_open_cue (const char *psz_cue_name) _funcs.get_media_changed = get_media_changed_image; _funcs.get_mcn = _get_mcn_image; _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_channels = get_track_channels_image, - _funcs.get_track_copy_permit = get_track_copy_permit_image, + _funcs.get_track_channels = get_track_channels_image; + _funcs.get_track_copy_permit = get_track_copy_permit_image; _funcs.get_track_format = _get_track_format_bincue; _funcs.get_track_green = _get_track_green_bincue; _funcs.get_track_lba = _get_lba_track_bincue; _funcs.get_track_msf = _get_track_msf_image; - _funcs.get_track_preemphasis = get_track_preemphasis_image, + _funcs.get_track_preemphasis = get_track_preemphasis_image; _funcs.get_track_pregap_lba = get_track_pregap_lba_image; + _funcs.get_track_isrc = get_track_isrc_image; _funcs.lseek = _lseek_bincue; _funcs.read = _read_bincue; _funcs.read_audio_sectors = _read_audio_sectors_bincue; diff --git a/lib/driver/image/cdrdao.c b/lib/driver/image/cdrdao.c index 973f3b49..710bbdfe 100644 --- a/lib/driver/image/cdrdao.c +++ b/lib/driver/image/cdrdao.c @@ -1,5 +1,5 @@ /* - $Id: cdrdao.c,v 1.25 2008/03/19 04:38:52 edsdead Exp $ + $Id: cdrdao.c,v 1.26 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2004, 2005, 2006, 2007 Rocky Bernstein toc reading routine adapted from cuetools @@ -25,7 +25,7 @@ (*.cue). */ -static const char _rcsid[] = "$Id: cdrdao.c,v 1.25 2008/03/19 04:38:52 edsdead Exp $"; +static const char _rcsid[] = "$Id: cdrdao.c,v 1.26 2008/03/20 01:40:29 edsdead Exp $"; #include "image.h" #include "cdio_assert.h" @@ -1276,14 +1276,15 @@ cdio_open_cdrdao (const char *psz_cue_name) _funcs.get_media_changed = get_media_changed_image; _funcs.get_mcn = _get_mcn_image; _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_channels = get_track_channels_image, - _funcs.get_track_copy_permit = get_track_copy_permit_image, + _funcs.get_track_channels = get_track_channels_image; + _funcs.get_track_copy_permit = get_track_copy_permit_image; _funcs.get_track_format = _get_track_format_cdrdao; _funcs.get_track_green = _get_track_green_cdrdao; _funcs.get_track_lba = _get_lba_track_cdrdao; _funcs.get_track_msf = _get_track_msf_image; - _funcs.get_track_preemphasis = get_track_preemphasis_image, + _funcs.get_track_preemphasis = get_track_preemphasis_image; _funcs.get_track_pregap_lba = get_track_pregap_lba_image; + _funcs.get_track_isrc = get_track_isrc_image; _funcs.lseek = _lseek_cdrdao; _funcs.read = _read_cdrdao; _funcs.read_audio_sectors = _read_audio_sectors_cdrdao; diff --git a/lib/driver/image/nrg.c b/lib/driver/image/nrg.c index 5606ffb4..61f65f00 100644 --- a/lib/driver/image/nrg.c +++ b/lib/driver/image/nrg.c @@ -1,5 +1,5 @@ /* - $Id: nrg.c,v 1.25 2008/03/16 00:12:43 rocky Exp $ + $Id: nrg.c,v 1.26 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2003, 2004, 2005, 2006 Rocky Bernstein Copyright (C) 2001, 2003 Herbert Valerio Riedel @@ -46,7 +46,7 @@ #include "_cdio_stdio.h" #include "nrg.h" -static const char _rcsid[] = "$Id: nrg.c,v 1.25 2008/03/16 00:12:43 rocky Exp $"; +static const char _rcsid[] = "$Id: nrg.c,v 1.26 2008/03/20 01:40:29 edsdead Exp $"; nero_id_t nero_id; nero_dtype_t nero_dtype; @@ -373,7 +373,8 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name, { _daox_t *_xentries = NULL; _daoi_t *_ientries = NULL; - _dao_common_t *_dao_common = (void *) chunk->data; + _dao_array_common_t *_dao_array_common = NULL; + _dao_common_t *_dao_common = (void *) chunk->data; int disc_mode = _dao_common->unknown[1]; track_format_t track_format; int i; @@ -385,10 +386,10 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name, if (DAOX_ID == opcode) { _xentries = (void *) chunk->data; - p_env->dtyp = _xentries->track_info[0].common.unknown[0]; + p_env->dtyp = _xentries->track_info[0].common.unknown[2]; } else { _ientries = (void *) chunk->data; - p_env->dtyp = _ientries->track_info[0].common.unknown[0]; + p_env->dtyp = _ientries->track_info[0].common.unknown[2]; } p_env->is_dao = true; @@ -473,6 +474,19 @@ parse_nrg (_img_private_t *p_env, const char *psz_nrg_name, } for (i=0; igen.i_tracks; i++) { + + if (DAOX_ID == opcode) { + _dao_array_common = &_xentries->track_info[i].common; + } else { + _dao_array_common = &_ientries->track_info[i].common; + } + p_env->tocent[i].isrc = calloc(1, CDIO_ISRC_SIZE+1); + memcpy(p_env->tocent[i].isrc, _dao_array_common->psz_isrc, CDIO_ISRC_SIZE); + p_env->tocent[i].isrc[CDIO_ISRC_SIZE] = '\0'; + if (p_env->tocent[i].isrc[0]) { + cdio_info("nrg isrc has value \"%s\"", p_env->tocent[i].isrc); + } + if (!p_env->tocent[i].datasize) { continue; } @@ -1263,6 +1277,7 @@ cdio_open_nrg (const char *psz_source) _funcs.get_track_msf = _get_track_msf_image; _funcs.get_track_preemphasis = get_track_preemphasis_generic; _funcs.get_track_pregap_lba = get_track_pregap_lba_image; + _funcs.get_track_isrc = get_track_isrc_image; _funcs.lseek = _lseek_nrg; _funcs.read = _read_nrg; _funcs.read_audio_sectors = _read_audio_sectors_nrg; diff --git a/lib/driver/image/nrg.h b/lib/driver/image/nrg.h index e5b223e6..b1a4c94f 100644 --- a/lib/driver/image/nrg.h +++ b/lib/driver/image/nrg.h @@ -1,5 +1,5 @@ /* - $Id: nrg.h,v 1.4 2008/03/16 00:12:43 rocky Exp $ + $Id: nrg.h,v 1.5 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2004, 2006 Rocky Bernstein Copyright (C) 2001, 2003 Herbert Valerio Riedel @@ -75,9 +75,8 @@ typedef struct { */ typedef struct { - uint8_t zero[10]; - uint32_t sector_size GNUC_PACKED; - uint8_t unknown[4]; + char psz_isrc[CDIO_ISRC_SIZE]; + uint8_t unknown[6]; } _dao_array_common_t; typedef struct { diff --git a/lib/driver/image_common.c b/lib/driver/image_common.c index 6e3d51f3..81ac40c9 100644 --- a/lib/driver/image_common.c +++ b/lib/driver/image_common.c @@ -1,5 +1,5 @@ /* - $Id: image_common.c,v 1.13 2008/03/16 00:12:43 rocky Exp $ + $Id: image_common.c,v 1.14 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2004, 2005 Rocky Bernstein @@ -270,6 +270,26 @@ get_track_pregap_lba_image(const void *p_user_data, track_t i_track) return pregap; } +/*! + Return the International Standard Recording Code (ISRC) for track number + i_track in p_cdio. Track numbers start at 1. + + Note: string is malloc'd so caller has to free() the returned + string when done with it. +*/ +char * +get_track_isrc_image(const void *p_user_data, track_t i_track) +{ + const _img_private_t *p_env = p_user_data; + char *isrc = p_env->tocent[i_track-p_env->gen.i_first_track].isrc; + + if (isrc && isrc[0]) { + return strdup(isrc); + } else { + return NULL; + } +} + /*! Read a data sector diff --git a/lib/driver/image_common.h b/lib/driver/image_common.h index 02922114..e332f983 100644 --- a/lib/driver/image_common.h +++ b/lib/driver/image_common.h @@ -1,5 +1,5 @@ /* - $Id: image_common.h,v 1.11 2008/03/16 00:12:43 rocky Exp $ + $Id: image_common.h,v 1.12 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2004, 2005 Rocky Bernstein @@ -157,6 +157,15 @@ track_flag_t get_track_preemphasis_image(const void *p_user_data, */ lba_t get_track_pregap_lba_image(const void *p_user_data, track_t i_track); +/*! + Return the International Standard Recording Code (ISRC) for track number + i_track in p_cdio. Track numbers start at 1. + + Note: string is malloc'd so caller has to free() the returned + string when done with it. +*/ +char *get_track_isrc_image(const void *p_user_data, track_t i_track); + /*! Read a data sector diff --git a/lib/driver/libcdio.sym b/lib/driver/libcdio.sym index 0e2f0468..4855803d 100644 --- a/lib/driver/libcdio.sym +++ b/lib/driver/libcdio.sym @@ -82,6 +82,7 @@ cdio_get_track_last_lsn cdio_get_track_lba cdio_get_track_pregap_lba cdio_get_track_pregap_lsn +cdio_get_track_isrc cdio_get_track_lsn cdio_get_track_msf cdio_get_track_preemphasis diff --git a/lib/driver/track.c b/lib/driver/track.c index 16cf71d9..f9daa576 100644 --- a/lib/driver/track.c +++ b/lib/driver/track.c @@ -1,5 +1,5 @@ /* - $Id: track.c,v 1.5 2008/03/16 00:12:43 rocky Exp $ + $Id: track.c,v 1.6 2008/03/20 01:40:29 edsdead Exp $ Copyright (C) 2003, 2004, 2005 Rocky Bernstein Copyright (C) 2001 Herbert Valerio Riedel @@ -246,6 +246,25 @@ cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track) } } +/*! + Return the International Standard Recording Code (ISRC) for track number + i_track in p_cdio. Track numbers start at 1. + + Note: string is malloc'd so caller has to free() the returned + string when done with it. +*/ +char * +cdio_get_track_isrc (const CdIo_t *p_cdio, track_t i_track) +{ + if (p_cdio == NULL) return NULL; + + if (p_cdio->op.get_track_isrc) { + return p_cdio->op.get_track_isrc (p_cdio->env, i_track); + } else { + return NULL; + } +} + /*! Return the starting LBA for the pregap for track number i_track in cdio. Track numbers start at 1.