Blame example/discid.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2011
Packit dd8086
  Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* http://sourceforge.net/projects/discid/ using libcdio:
Packit dd8086
Packit dd8086
   a small program to calculate the disc-ID for audio compact
Packit dd8086
   discs. The disc-ID can be used to query info (tracks, title,
Packit dd8086
   interpret) about compact audio discs from a CDDB-Server.
Packit dd8086
*/
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
Packit dd8086
static int cddb_sum(int n)
Packit dd8086
{
Packit dd8086
  int result = 0;
Packit dd8086
  while (n > 0)
Packit dd8086
  {
Packit dd8086
    result += n % 10;
Packit dd8086
    n /= 10;
Packit dd8086
  }
Packit dd8086
Packit dd8086
  return result;
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
  CdIo_t *p_cdio = cdio_open (NULL, DRIVER_UNKNOWN);
Packit dd8086
  track_t i_track;
Packit dd8086
  track_t i_tracks;
Packit dd8086
  unsigned n = 0;
Packit dd8086
Packit dd8086
  if (NULL == p_cdio) {
Packit dd8086
    printf("Couldn't find a driver.. leaving.\n");
Packit dd8086
    return 1;
Packit dd8086
  }
Packit dd8086
  
Packit dd8086
  i_tracks = cdio_get_num_tracks(p_cdio);
Packit dd8086
  for (i_track = 1; i_track <= i_tracks; ++i_track) {
Packit dd8086
      lba_t lba = cdio_get_track_lba(p_cdio, i_track);
Packit dd8086
      n += cddb_sum(lba / CDIO_CD_FRAMES_PER_SEC);
Packit dd8086
  }
Packit dd8086
  { 
Packit dd8086
      unsigned start_sec = 
Packit dd8086
	  cdio_get_track_lba(p_cdio, 1) /  CDIO_CD_FRAMES_PER_SEC;
Packit dd8086
      unsigned leadout_sec = 
Packit dd8086
	  cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) 
Packit dd8086
	  / CDIO_CD_FRAMES_PER_SEC;
Packit dd8086
      unsigned total = leadout_sec - start_sec;
Packit dd8086
      unsigned id = ((n % 0xff) << 24 | total << 8 | i_tracks);
Packit dd8086
Packit dd8086
      printf("%08X %d", id, i_tracks);
Packit dd8086
      for (i_track = 1; i_track <= i_tracks; ++i_track) {
Packit dd8086
	  lba_t lba = cdio_get_track_lba(p_cdio, i_track);
Packit dd8086
	  printf(" %ld", (long) lba);
Packit dd8086
      }
Packit dd8086
      printf(" %ld\n", (long) cdio_get_track_lba(p_cdio, 
Packit dd8086
						 CDIO_CDROM_LEADOUT_TRACK)
Packit dd8086
	     / CDIO_CD_FRAMES_PER_SEC);
Packit dd8086
  }
Packit dd8086
Packit dd8086
  cdio_destroy(p_cdio);
Packit dd8086
  return 0;
Packit dd8086
}