Wednesday, 25 May 2016

Old CD Ripping Code

I just received a mail from "Experts Exchange" telling me a question I participated in would be deleted... When I opened the question, in question, I have no recollection of answering this whatsoever... it's not even really my style of coding...

I always Alman bracket alignment, never K&R...


I can't comment about "MusicBrainz" however, when using freedb ( you need to compute an ID for the CD you have taken a track from, you can find all this information on their site in the "Software->Howto" sections:

But in essence, when you connect to their server to identify a track, you need to provide a disc ID.  This is an 8-digit hexadecimal (base-16) number, computed using data from a CD's Table-of-Contents (TOC) in MSF (Minute Second Frame) form.

--- Below is taken directly from the "how-to" file regarding generating an ID to use with their service ---

The following is a C code example that illustrates how to generate the CDDB/freedb disc ID. Examples in other programming languages may be found on the freedb web site at in the developers-section. A text description of the algorithm follows, which should contain the necessary information to code the algorithm in any programming language.

struct toc 
      int      min;
      int      sec;
      int      frame;

struct toc cdtoc[100];

      /* Do whatever is appropriate to read the TOC of the CD
       * into the cdtoc[] structure array.
      return (tot_trks);

cddb_sum(int n)
      int      ret;

      /* For backward compatibility this algorithm must not change */

      ret = 0;

      while (n > 0) {
            ret = ret + (n % 10);
            n = n / 10;

      return (ret);

unsigned long
cddb_discid(int tot_trks)
      int      i,
            t = 0,
            n = 0;

      /* For backward compatibility this algorithm must not change */

      i = 0;

      while (i < tot_trks) {
            n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);

      t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
          ((cdtoc[0].min * 60) + cdtoc[0].sec);

      return ((n % 0xff) << 24 | t << 8 | tot_trks);

      int tot_trks;

      tot_trks = read_cdtoc_from_drive();
      printf("The discid is %08x", cddb_discid(tot_trks));

This code assumes that your compiler and architecture support 32-bit integers.

No comments:

Post a Comment