From 446c4adc4cc439d7de8e9eed2d26f8a6e8b69fa3 Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 12 Jan 2005 04:36:57 +0000 Subject: [PATCH] Add an example of using paranoia with libcdio. --- example/Makefile.am | 6 ++- example/paranoia.c | 117 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 example/paranoia.c diff --git a/example/Makefile.am b/example/Makefile.am index baace235..f17a1313 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.12 2004/11/22 01:03:53 rocky Exp $ +# $Id: Makefile.am,v 1.13 2005/01/12 04:36:57 rocky Exp $ # # Copyright (C) 2003, 2004 Rocky Bernstein # @@ -24,7 +24,7 @@ if DISABLE_CPP noinst_PROGRAMS = cdtext drives iso1 iso2 iso3 scsi-mmc1 scsi-mmc2 \ tracks sample2 sample3 sample4 else -noinst_PROGRAMS = cdtext drives iso1 iso2 iso3 scsi-mmc1 scsi-mmc2 \ +noinst_PROGRAMS = cdtext drives iso1 iso2 iso3 paranoia scsi-mmc1 scsi-mmc2 \ tracks sample2 sample3 sample4 iso1cpp iso2cpp iso3cpp endif @@ -34,6 +34,8 @@ cdtext_LDADD = $(LIBCDIO_LIBS) drives_LDADD = $(LIBCDIO_LIBS) +paranoia_LDADD = $(LIBCDIO_PARANOIA_LIBS) $(LIBCDIO_CDDA_LIBS) + iso1_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) iso2_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) iso3_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) diff --git a/example/paranoia.c b/example/paranoia.c new file mode 100644 index 00000000..21eeadde --- /dev/null +++ b/example/paranoia.c @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2005 Rocky Bernstein + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ +/* Simple program to show using libcdio's version of cdparanoia. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#ifdef HAVE_STDLIB_H +#include +#endif + +int +main(int argc, const char *argv[]) +{ + cdrom_drive_t *d = NULL; /* Place to store handle given by cd-parapnioa. */ + driver_id_t driver_id; + char **ppsz_cd_drives; /* List of all drives with a loaded CDDA in it. */ + + /* See if we can find a device with a loaded CD-DA in it. If successful + drive_id will be set. */ + ppsz_cd_drives = cdio_get_devices_with_cap_ret(NULL, CDIO_FS_AUDIO, false, + &driver_id); + + if (ppsz_cd_drives) { + /* Found such a CD-ROM with a CD-DA loaded. Use the first drive in + the list. */ + d=cdda_identify(*ppsz_cd_drives, 1, NULL); + } else { + printf("Unable find or access a CD-ROM drive with an audio CD in it.\n"); + exit(1); + } + + /* Don't need a list of CD's with CD-DA's any more. */ + cdio_free_device_list(ppsz_cd_drives); + free(ppsz_cd_drives); + + /* We'll set for verbose paranoia messages. */ + cdda_verbose_set(d, CDDA_MESSAGE_PRINTIT, CDDA_MESSAGE_PRINTIT); + + if ( 0 != cdda_open(d) ) { + printf("Unable to open disc.\n"); + exit(1); + } + + /* Okay now set up to read up to the first 300 frames of the first + audio track of the Audio CD. */ + { + cdrom_paranoia_t *p = paranoia_init(d); + lsn_t i_first_lsn = cdda_disc_firstsector(d); + + if ( -1 == i_first_lsn ) { + printf("Trouble getting starting LSN\n"); + } else { + lsn_t i_cursor; + track_t i_track = cdda_sector_gettrack(d, i_first_lsn); + lsn_t i_last_lsn = cdda_track_lastsector(d, i_track); + + /* For demo purposes we'll read only 300 frames (about 4 + seconds). We don't want this to take too long. On the other + hand, I suppose it should be something close to a real test. + */ + if ( i_last_lsn - i_first_lsn > 300) i_last_lsn = i_first_lsn + 299; + + printf("Reading track %d from LSN %ld to LSN %ld\n", i_track, + (long int) i_first_lsn, (long int) i_last_lsn); + + /* Set reading mode for full paranoia, but allow skipping sectors. */ + paranoia_modeset(p, PARANOIA_MODE_FULL^PARANOIA_MODE_NEVERSKIP); + + paranoia_seek(p, i_first_lsn, SEEK_SET); + + for ( i_cursor = i_first_lsn; i_cursor <= i_last_lsn; i_cursor ++) { + /* read a sector */ + int16_t *p_readbuf=paranoia_read(p, NULL); + char *psz_err=cdda_errors(d); + char *psz_mes=cdda_messages(d); + + if (psz_mes || psz_err) + printf("%s%s\n", psz_mes ? psz_mes: "", psz_err ? psz_err: ""); + + if (psz_err) free(psz_err); + if (psz_mes) free(psz_mes); + if( !p_readbuf ) { + printf("paranoia read error. Stopping.\n"); + break; + } + } + } + paranoia_free(p); + } + + cdda_close(d); + + exit(0); +} +