diff options
Diffstat (limited to 'src/input/input_cdda.c')
-rw-r--r-- | src/input/input_cdda.c | 61 |
1 files changed, 55 insertions, 6 deletions
diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c index 1ad33179a..d2025c4d2 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.52 2004/05/02 15:17:39 valtri Exp $ + * $Id: input_cdda.c,v 1.53 2004/05/05 09:11:39 hadess Exp $ */ #ifdef HAVE_CONFIG_H @@ -54,6 +54,7 @@ #define LOG */ +#include "sha1.h" #include "xine_internal.h" #include "xineutils.h" #include "input_plugin.h" @@ -452,14 +453,20 @@ static int read_cdrom_toc(int fd, cdrom_toc *toc) { return -1; } +#define XA_INTERVAL ((60 + 90 + 2) * CD_FRAMES) + toc->leadout_track.track_mode = (tocentry.cdte_ctrl & 0x04) ? 1 : 0; toc->leadout_track.first_frame_minute = tocentry.cdte_addr.msf.minute; toc->leadout_track.first_frame_second = tocentry.cdte_addr.msf.second; toc->leadout_track.first_frame_frame = tocentry.cdte_addr.msf.frame; - toc->leadout_track.first_frame = - (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) + - (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) + - tocentry.cdte_addr.msf.frame; + if (!ms.xa_flag) { + toc->leadout_track.first_frame = + (tocentry.cdte_addr.msf.minute * CD_SECONDS_PER_MINUTE * CD_FRAMES_PER_SECOND) + + (tocentry.cdte_addr.msf.second * CD_FRAMES_PER_SECOND) + + tocentry.cdte_addr.msf.frame; + } else { + toc->leadout_track.first_frame = ms.addr.lba - XA_INTERVAL + 150; + } return 0; } @@ -1693,6 +1700,46 @@ static unsigned long _cdda_calc_cddb_id(cdda_input_plugin_t *this) { } /* + * Compute Musicbrainz CDIndex ID + */ +static void _cdda_cdindex(cdda_input_plugin_t *this, cdrom_toc *toc) { + char temp[10]; + SHA_INFO sha; + unsigned char digest[33], *base64; + int i, size; + + sha_init(&sha); + + sprintf(temp, "%02X", toc->first_track); + sha_update(&sha, (unsigned char*) temp, strlen(temp)); + + sprintf(temp, "%02X", toc->last_track - toc->ignore_last_track); + sha_update(&sha, (unsigned char*) temp, strlen(temp)); + + sprintf (temp, "%08X", toc->leadout_track.first_frame);// + 150); + sha_update(&sha, (unsigned char*) temp, strlen(temp)); + + for (i = toc->first_track; i <= toc->last_track - toc->ignore_last_track; i++) { + sprintf(temp, "%08X", toc->toc_entries[i - 1].first_frame); + sha_update(&sha, (unsigned char*) temp, strlen(temp)); + } + + for (i = toc->last_track - toc->ignore_last_track + 1; i < 100; i++) { + sha_update(&sha, (unsigned char*) temp, strlen(temp)); + } + + sha_final(digest, &sha); + + base64 = rfc822_binary(digest, 20, &size); + base64[size] = 0; + + printf ("disc id: %s\n", base64); + //_x_meta_info_set(this->stream, XINE_META_INFO_CDINDEX_DISCID, base64); + + free (base64); +} + +/* * return cbbd disc id. */ static unsigned long _cdda_get_cddb_id(cdda_input_plugin_t *this) { @@ -2137,7 +2184,9 @@ static int cdda_plugin_open (input_plugin_t *this_gen ) { /* invalidate cache */ this->cache_first = this->cache_last = -1; - + + /* get the Musicbrainz CDIndex */ + _cdda_cdindex (this, toc); /* * CDDB |