Add ISRC track info to cd-info output. Code from Scot C. Bontrager.

This commit is contained in:
rocky
2011-05-18 09:48:03 -04:00
parent 46876a2040
commit f2438edcbc
6 changed files with 263 additions and 257 deletions

2
THANKS
View File

@@ -78,5 +78,5 @@ Robert William Fuller
Scot C. Bontrager Scot C. Bontrager
mmc routine to get the ISRC information on a CD that is in the q subchannel mmc routine to get the ISRC information on a CD that is in the q subchannel
but not showing up in the CDTEXT. but not showing up in the CDTEXT. Addition of this information to cd-info.

View File

@@ -1,6 +1,4 @@
/* -*- c -*- /* -*- c -*-
$Id: audio.h,v 1.12 2008/03/25 15:59:08 karl Exp $
Copyright (C) 2005, 2007, 2008 Rocky Bernstein <rocky@gnu.org> Copyright (C) 2005, 2007, 2008 Rocky Bernstein <rocky@gnu.org>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -272,6 +272,7 @@ typedef uint8_t ubyte;
/*! /*!
Number of ASCII bytes in a media catalog number (MCN). Number of ASCII bytes in a media catalog number (MCN).
We include an extra 0 byte so these can be used as C strings.
*/ */
#define CDIO_MCN_SIZE 13 #define CDIO_MCN_SIZE 13
@@ -288,7 +289,7 @@ typedef uint8_t ubyte;
#define CDIO_ISRC_SIZE 12 #define CDIO_ISRC_SIZE 12
/*! /*!
Type to hold ASCII bytes in a media catalog number (MCN). Type to hold ASCII bytes in a ISRC.
We include an extra 0 byte so these can be used as C strings. We include an extra 0 byte so these can be used as C strings.
*/ */
typedef char cdio_isrc_t[CDIO_ISRC_SIZE+1]; typedef char cdio_isrc_t[CDIO_ISRC_SIZE+1];

View File

@@ -1,6 +1,4 @@
/* /*
$Id: udf_file.h,v 1.12 2008/03/25 15:59:09 karl Exp $
Copyright (C) 2005, 2006, 2008 Rocky Bernstein <rocky@gnu.org> Copyright (C) 2005, 2006, 2008 Rocky Bernstein <rocky@gnu.org>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -505,7 +505,7 @@ mmc_isrc_track_read_subchannel (CdIo_t *p_cdio, /*in*/ const track_t track,
i_rc = mmc_run_cmd(p_cdio, mmc_timeout_ms, &cdb, SCSI_MMC_DATA_READ, i_rc = mmc_run_cmd(p_cdio, mmc_timeout_ms, &cdb, SCSI_MMC_DATA_READ,
sizeof(buf), buf); sizeof(buf), buf);
if (DRIVER_OP_SUCCESS == i_rc) { if (DRIVER_OP_SUCCESS == i_rc) {
strncpy(p_isrc, &buf[9], sizeof(buf)-9); strncpy(p_isrc, &buf[9], CDIO_ISRC_SIZE+1);
} }
return i_rc; return i_rc;
} }

View File

@@ -1,7 +1,6 @@
/* /*
$Id: cd-info.c,v 1.156 2008/09/09 14:44:25 rocky Exp $ Copyright (C) 2003, 2004, 2005, 2007, 2008, 2011
Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2003, 2004, 2005, 2007, 2008 Rocky Bernstein <rocky@gnu.org>
Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org> Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org>
and Heiko Ei<45>feldt <heiko@hexco.de> and Heiko Ei<45>feldt <heiko@hexco.de>
@@ -129,9 +128,9 @@ parse_source(int opt)
if (opts.source_image != INPUT_UNKNOWN) { if (opts.source_image != INPUT_UNKNOWN) {
report(stderr, "%s: another source type option given before.\n", report(stderr, "%s: another source type option given before.\n",
program_name); program_name);
report(stderr, "%s: give only one source type option.\n", report(stderr, "%s: give only one source type option.\n",
program_name); program_name);
return; return;
} }
@@ -166,7 +165,6 @@ parse_source(int opt)
} }
} }
/* Parse all options. */ /* Parse all options. */
static bool static bool
parse_options (int argc, char *argv[]) parse_options (int argc, char *argv[])
@@ -346,8 +344,8 @@ parse_options (int argc, char *argv[])
if (source_name != NULL) { if (source_name != NULL) {
report(stderr, "%s: Source '%s' given as an argument of an option and as " report(stderr, "%s: Source '%s' given as an argument of an option and as "
"unnamed option '%s'\n", "unnamed option '%s'\n",
program_name, source_name, remaining_arg); program_name, source_name, remaining_arg);
free(program_name); free(program_name);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
@@ -359,7 +357,7 @@ parse_options (int argc, char *argv[])
if (optind < argc) { if (optind < argc) {
report(stderr, "%s: Source specified in previously %s and %s\n", report(stderr, "%s: Source specified in previously %s and %s\n",
program_name, source_name, remaining_arg); program_name, source_name, remaining_arg);
free(program_name); free(program_name);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
@@ -368,7 +366,6 @@ parse_options (int argc, char *argv[])
return true; return true;
} }
/* CDIO logging routines */ /* CDIO logging routines */
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
@@ -419,7 +416,7 @@ print_cdtext_track_info(CdIo_t *p_cdio, track_t i_track, const char *psz_msg) {
for (i=0; i < MAX_CDTEXT_FIELDS; i++) { for (i=0; i < MAX_CDTEXT_FIELDS; i++) {
if (p_cdtext->field[i]) { if (p_cdtext->field[i]) {
printf("\t%s: %s\n", cdtext_field2str(i), p_cdtext->field[i]); printf("\t%s: %s\n", cdtext_field2str(i), p_cdtext->field[i]);
} }
} }
} }
@@ -433,7 +430,7 @@ print_cdtext_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) {
print_cdtext_track_info(p_cdio, 0, "\nCD-TEXT for Disc:"); print_cdtext_track_info(p_cdio, 0, "\nCD-TEXT for Disc:");
for ( ; i_first_track < i_last_track; i_first_track++ ) { for ( ; i_first_track < i_last_track; i_first_track++ ) {
char msg[50]; char msg[50];
sprintf(msg, "CD-TEXT for Track %d:", i_first_track); sprintf(msg, "CD-TEXT for Track %2d:", i_first_track);
print_cdtext_track_info(p_cdio, i_first_track, msg); print_cdtext_track_info(p_cdio, i_first_track, msg);
} }
} }
@@ -456,16 +453,16 @@ print_cddb_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track)
cddb_disc_t *p_cddb_disc = NULL; cddb_disc_t *p_cddb_disc = NULL;
if ( init_cddb(p_cdio, &p_conn, &p_cddb_disc, cddb_errmsg, i_first_track, if ( init_cddb(p_cdio, &p_conn, &p_cddb_disc, cddb_errmsg, i_first_track,
i_tracks, &i_cddb_matches) ) { i_tracks, &i_cddb_matches) ) {
if (-1 == i_cddb_matches) if (-1 == i_cddb_matches)
printf("%s: %s\n", program_name, cddb_error_str(cddb_errno(p_conn))); printf("%s: %s\n", program_name, cddb_error_str(cddb_errno(p_conn)));
else { else {
printf("%s: Found %d matches in CDDB\n", program_name, i_cddb_matches); printf("%s: Found %d matches in CDDB\n", program_name, i_cddb_matches);
for (i=1; i<=i_cddb_matches; i++) { for (i=1; i<=i_cddb_matches; i++) {
cddb_disc_print(p_cddb_disc); cddb_disc_print(p_cddb_disc);
cddb_query_next(p_conn, p_cddb_disc); cddb_query_next(p_conn, p_cddb_disc);
if (i != i_cddb_matches) cddb_read(p_conn, p_cddb_disc); if (i != i_cddb_matches) cddb_read(p_conn, p_cddb_disc);
} }
} }
@@ -490,7 +487,7 @@ print_vcd_info(driver_id_t driver) {
return; return;
} }
report (stdout, "Format : %s\n", report (stdout, "Format : %s\n",
vcdinfo_get_format_version_str(p_vcd)); vcdinfo_get_format_version_str(p_vcd));
report (stdout, "Album : `%.16s'\n", vcdinfo_get_album_id(p_vcd)); report (stdout, "Album : `%.16s'\n", vcdinfo_get_album_id(p_vcd));
report (stdout, "Volume count : %d\n", vcdinfo_get_volume_count(p_vcd)); report (stdout, "Volume count : %d\n", vcdinfo_get_volume_count(p_vcd));
report (stdout, "volume number: %d\n", vcdinfo_get_volume_num(p_vcd)); report (stdout, "volume number: %d\n", vcdinfo_get_volume_num(p_vcd));
@@ -501,7 +498,7 @@ print_vcd_info(driver_id_t driver) {
break; break;
case VCDINFO_OPEN_OTHER: case VCDINFO_OPEN_OTHER:
report( stderr, "Even though we thought this was a Video CD, " report( stderr, "Even though we thought this was a Video CD, "
" further inspection says it is not.\n" ); " further inspection says it is not.\n" );
break; break;
} }
if (p_vcd) vcdinfo_close(p_vcd); if (p_vcd) vcdinfo_close(p_vcd);
@@ -511,7 +508,7 @@ print_vcd_info(driver_id_t driver) {
static void static void
print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[], print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[],
cdio_fs_anal_t fs) cdio_fs_anal_t fs)
{ {
CdioList_t *p_entlist; CdioList_t *p_entlist;
CdioList_t *p_dirlist = _cdio_list_new (); CdioList_t *p_dirlist = _cdio_list_new ();
@@ -552,13 +549,13 @@ print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[],
} }
if (yep != p_statbuf->rr.b3_rock || 1 == opts.no_rock_ridge) { if (yep != p_statbuf->rr.b3_rock || 1 == opts.no_rock_ridge) {
iso9660_name_translate_ext(psz_iso_name, translated_name, iso9660_name_translate_ext(psz_iso_name, translated_name,
i_joliet_level); i_joliet_level);
} }
snprintf (_fullname, sizeof (_fullname), "%s%s", pathname, snprintf (_fullname, sizeof (_fullname), "%s%s", pathname,
psz_iso_name); psz_iso_name);
strncat (_fullname, "/", sizeof (_fullname)); strncat (_fullname, "/", sizeof (_fullname));
@@ -568,10 +565,10 @@ print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[],
_cdio_list_append (p_dirlist, strdup (_fullname)); _cdio_list_append (p_dirlist, strdup (_fullname));
print_fs_attrs(p_statbuf, 0 == opts.no_rock_ridge, fs & CDIO_FS_ANAL_XA, print_fs_attrs(p_statbuf, 0 == opts.no_rock_ridge, fs & CDIO_FS_ANAL_XA,
psz_iso_name, translated_name); psz_iso_name, translated_name);
if (p_statbuf->rr.i_symlink) { if (p_statbuf->rr.i_symlink) {
free(p_statbuf->rr.psz_symlink); free(p_statbuf->rr.psz_symlink);
p_statbuf->rr.i_symlink = 0; p_statbuf->rr.i_symlink = 0;
} }
} }
free (translated_name); free (translated_name);
@@ -594,7 +591,7 @@ print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[],
static void static void
print_iso9660_fs (CdIo_t *p_cdio, cdio_fs_anal_t fs, print_iso9660_fs (CdIo_t *p_cdio, cdio_fs_anal_t fs,
track_format_t track_format) track_format_t track_format)
{ {
iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
@@ -611,19 +608,19 @@ print_iso9660_fs (CdIo_t *p_cdio, cdio_fs_anal_t fs,
print_iso9660_recurse (p_cdio, "/", fs); print_iso9660_recurse (p_cdio, "/", fs);
} }
#define print_vd_info(title, fn) \ #define print_vd_info(title, fn) \
psz_str = fn(&pvd); \ psz_str = fn(&pvd); \
if (psz_str) { \ if (psz_str) { \
report(stdout, title ": %s\n", psz_str); \ report(stdout, title ": %s\n", psz_str); \
free(psz_str); \ free(psz_str); \
psz_str = NULL; \ psz_str = NULL; \
} }
static void static void
print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis, print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
cdio_fs_anal_t fs, int first_data, unsigned int num_audio, cdio_fs_anal_t fs, int first_data, unsigned int num_audio,
track_t i_tracks, track_t i_first_track, track_t i_tracks, track_t i_first_track,
track_format_t track_format, CdIo_t *p_cdio) track_format_t track_format, CdIo_t *p_cdio)
{ {
int need_lf; int need_lf;
@@ -632,9 +629,9 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
if (num_audio > 0) { if (num_audio > 0) {
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
if (!opts.no_cddb) { if (!opts.no_cddb) {
printf("Audio CD, CDDB disc ID is %08x\n", printf("Audio CD, CDDB disc ID is %08x\n",
cddb_discid(p_cdio, i_tracks)); cddb_discid(p_cdio, i_tracks));
print_cddb_info(p_cdio, i_tracks, i_first_track); print_cddb_info(p_cdio, i_tracks, i_first_track);
} }
#endif #endif
print_cdtext_info(p_cdio, i_tracks, i_first_track); print_cdtext_info(p_cdio, i_tracks, i_first_track);
@@ -669,7 +666,7 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
break; break;
case CDIO_FS_EXT2: case CDIO_FS_EXT2:
printf("CD-ROM with GNU/Linux EXT2 (native) filesystem\n"); printf("CD-ROM with GNU/Linux EXT2 (native) filesystem\n");
break; break;
case CDIO_FS_3DO: case CDIO_FS_3DO:
printf("CD-ROM with Panasonic 3DO filesystem\n"); printf("CD-ROM with Panasonic 3DO filesystem\n");
break; break;
@@ -689,19 +686,19 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
case CDIO_FS_ISO_HFS: case CDIO_FS_ISO_HFS:
case CDIO_FS_ISO_UDF: case CDIO_FS_ISO_UDF:
printf("ISO 9660: %i blocks, label `%.32s'\n", printf("ISO 9660: %i blocks, label `%.32s'\n",
cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label); cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
{ {
iso9660_pvd_t pvd; iso9660_pvd_t pvd;
if ( iso9660_fs_read_pvd(p_cdio, &pvd) ) { if ( iso9660_fs_read_pvd(p_cdio, &pvd) ) {
char *psz_str; char *psz_str;
print_vd_info("Application", iso9660_get_application_id); print_vd_info("Application", iso9660_get_application_id);
print_vd_info("Preparer ", iso9660_get_preparer_id); print_vd_info("Preparer ", iso9660_get_preparer_id);
print_vd_info("Publisher ", iso9660_get_publisher_id); print_vd_info("Publisher ", iso9660_get_publisher_id);
print_vd_info("System ", iso9660_get_system_id); print_vd_info("System ", iso9660_get_system_id);
print_vd_info("Volume ", iso9660_get_volume_id); print_vd_info("Volume ", iso9660_get_volume_id);
print_vd_info("Volume Set ", iso9660_get_volumeset_id); print_vd_info("Volume Set ", iso9660_get_volumeset_id);
} }
} }
@@ -715,7 +712,7 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
case CDIO_FS_UDF: case CDIO_FS_UDF:
case CDIO_FS_ISO_UDF: case CDIO_FS_ISO_UDF:
report(stdout, "UDF: version %x.%2.2x\n", report(stdout, "UDF: version %x.%2.2x\n",
cdio_iso_analysis.UDFVerMajor, cdio_iso_analysis.UDFVerMinor); cdio_iso_analysis.UDFVerMajor, cdio_iso_analysis.UDFVerMinor);
break; break;
default: ; default: ;
} }
@@ -731,7 +728,7 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
need_lf += printf("Hidden Track "); need_lf += printf("Hidden Track ");
if (fs & CDIO_FS_ANAL_PHOTO_CD) if (fs & CDIO_FS_ANAL_PHOTO_CD)
need_lf += printf("%sPhoto CD ", need_lf += printf("%sPhoto CD ",
num_audio > 0 ? " Portfolio " : ""); num_audio > 0 ? " Portfolio " : "");
if (fs & CDIO_FS_ANAL_CDTV) if (fs & CDIO_FS_ANAL_CDTV)
need_lf += printf("Commodore CDTV "); need_lf += printf("Commodore CDTV ");
if (first_data > 1) if (first_data > 1)
@@ -822,13 +819,14 @@ main(int argc, char *argv[])
int first_data = -1; /* # of first data track */ int first_data = -1; /* # of first data track */
int first_audio = -1; /* # of first audio track */ int first_audio = -1; /* # of first audio track */
bool b_playing_audio = false; /* currently playing a bool b_playing_audio = false; /* currently playing a
CD-DA */ CD-DA */
cdio_iso_analysis_t cdio_iso_analysis; cdio_iso_analysis_t cdio_iso_analysis;
char *media_catalog_number; char *media_catalog_number;
discmode_t discmode = CDIO_DISC_MODE_NO_INFO; discmode_t discmode = CDIO_DISC_MODE_NO_INFO;
cdio_drive_read_cap_t i_read_cap = 0; cdio_drive_read_cap_t i_read_cap = 0;
cdio_drive_write_cap_t i_write_cap; cdio_drive_write_cap_t i_write_cap;
cdio_drive_misc_cap_t i_misc_cap; cdio_drive_misc_cap_t i_misc_cap;
cdio_isrc_t isrc;
memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis)); memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
init(); init();
@@ -856,10 +854,10 @@ main(int argc, char *argv[])
if (p_cdio==NULL) { if (p_cdio==NULL) {
if (source_name) { if (source_name) {
err_exit("%s: Error in opening device driver for input %s.\n", err_exit("%s: Error in opening device driver for input %s.\n",
program_name, source_name); program_name, source_name);
} else { } else {
err_exit("%s: Error in opening device driver for unspecified input.\n", err_exit("%s: Error in opening device driver for unspecified input.\n",
program_name); program_name);
} }
} }
@@ -882,9 +880,9 @@ main(int argc, char *argv[])
cdio_hwinfo_t hwinfo; cdio_hwinfo_t hwinfo;
if (cdio_get_hwinfo(p_cdio, &hwinfo)) { if (cdio_get_hwinfo(p_cdio, &hwinfo)) {
printf("%-28s: %s\n%-28s: %s\n%-28s: %s\n", printf("%-28s: %s\n%-28s: %s\n%-28s: %s\n",
"Vendor" , hwinfo.psz_vendor, "Vendor" , hwinfo.psz_vendor,
"Model" , hwinfo.psz_model, "Model" , hwinfo.psz_model,
"Revision", hwinfo.psz_revision); "Revision", hwinfo.psz_revision);
} }
print_drive_capabilities(i_read_cap, i_write_cap, i_misc_cap); print_drive_capabilities(i_read_cap, i_write_cap, i_misc_cap);
} }
@@ -897,16 +895,16 @@ main(int argc, char *argv[])
printf("list of devices found:\n"); printf("list of devices found:\n");
if (NULL != d) { if (NULL != d) {
for ( ; *d != NULL ; d++ ) { for ( ; *d != NULL ; d++ ) {
CdIo_t *p_cdio = cdio_open(source_name, driver_id); CdIo_t *p_cdio = cdio_open(source_name, driver_id);
cdio_hwinfo_t hwinfo; cdio_hwinfo_t hwinfo;
printf("Drive %s\n", *d); printf("Drive %s\n", *d);
if (mmc_get_hwinfo(p_cdio, &hwinfo)) { if (mmc_get_hwinfo(p_cdio, &hwinfo)) {
printf("%-8s: %s\n%-8s: %s\n%-8s: %s\n", printf("%-8s: %s\n%-8s: %s\n%-8s: %s\n",
"Vendor" , hwinfo.psz_vendor, "Vendor" , hwinfo.psz_vendor,
"Model" , hwinfo.psz_model, "Model" , hwinfo.psz_model,
"Revision", hwinfo.psz_revision); "Revision", hwinfo.psz_revision);
} }
if (p_cdio) cdio_destroy(p_cdio); if (p_cdio) cdio_destroy(p_cdio);
} }
} }
cdio_free_device_list(device_list); cdio_free_device_list(device_list);
@@ -918,7 +916,7 @@ main(int argc, char *argv[])
discmode = cdio_get_discmode(p_cdio); discmode = cdio_get_discmode(p_cdio);
if ( 0 == opts.no_disc_mode ) { if ( 0 == opts.no_disc_mode ) {
printf("Disc mode is listed as: %s\n", printf("Disc mode is listed as: %s\n",
discmode2str[discmode]); discmode2str[discmode]);
} }
if (cdio_is_discmode_dvd(discmode) && !opts.show_dvd) { if (cdio_is_discmode_dvd(discmode) && !opts.show_dvd) {
@@ -941,11 +939,11 @@ main(int argc, char *argv[])
if (!opts.no_tracks) { if (!opts.no_tracks) {
printf("CD-ROM Track List (%i - %i)\n" NORMAL, printf("CD-ROM Track List (%i - %i)\n" NORMAL,
i_first_track, i_tracks); i_first_track, i_tracks);
printf(" #: MSF LSN Type Green? Copy?"); printf(" #: MSF LSN Type Green? Copy?");
if ( CDIO_DISC_MODE_CD_DA == discmode if ( CDIO_DISC_MODE_CD_DA == discmode
|| CDIO_DISC_MODE_CD_MIXED == discmode ) || CDIO_DISC_MODE_CD_MIXED == discmode )
printf(" Channels Premphasis?"); printf(" Channels Premphasis?");
printf("\n"); printf("\n");
} }
@@ -966,14 +964,14 @@ main(int argc, char *argv[])
psz_msf = cdio_msf_to_str(&msf); psz_msf = cdio_msf_to_str(&msf);
if (i == CDIO_CDROM_LEADOUT_TRACK) { if (i == CDIO_CDROM_LEADOUT_TRACK) {
if (!opts.no_tracks) { if (!opts.no_tracks) {
lsn_t lsn= cdio_msf_to_lsn(&msf); lsn_t lsn= cdio_msf_to_lsn(&msf);
long unsigned int i_bytes_raw = lsn * CDIO_CD_FRAMESIZE_RAW; long unsigned int i_bytes_raw = lsn * CDIO_CD_FRAMESIZE_RAW;
long unsigned int i_bytes_formatted = lsn - start_track_lsn; long unsigned int i_bytes_formatted = lsn - start_track_lsn;
printf( "%3d: %8s %06lu leadout ", (int) i, psz_msf, printf( "%3d: %8s %06lu leadout ", (int) i, psz_msf,
(long unsigned int) lsn ); (long unsigned int) lsn );
switch (discmode) { switch (discmode) {
case CDIO_DISC_MODE_DVD_ROM: case CDIO_DISC_MODE_DVD_ROM:
case CDIO_DISC_MODE_DVD_RAM: case CDIO_DISC_MODE_DVD_RAM:
case CDIO_DISC_MODE_DVD_R: case CDIO_DISC_MODE_DVD_R:
@@ -981,36 +979,36 @@ main(int argc, char *argv[])
case CDIO_DISC_MODE_DVD_PR: case CDIO_DISC_MODE_DVD_PR:
case CDIO_DISC_MODE_DVD_PRW: case CDIO_DISC_MODE_DVD_PRW:
case CDIO_DISC_MODE_DVD_OTHER: case CDIO_DISC_MODE_DVD_OTHER:
case CDIO_DISC_MODE_CD_DATA: case CDIO_DISC_MODE_CD_DATA:
i_bytes_formatted *= CDIO_CD_FRAMESIZE; i_bytes_formatted *= CDIO_CD_FRAMESIZE;
break; break;
case CDIO_DISC_MODE_CD_DA: case CDIO_DISC_MODE_CD_DA:
i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW;
break; break;
case CDIO_DISC_MODE_CD_XA: case CDIO_DISC_MODE_CD_XA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW0; i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW0;
break; break;
default: default:
i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW;
} }
if (i_bytes_raw < 1024) if (i_bytes_raw < 1024)
printf( "(%lu bytes", i_bytes_raw ); printf( "(%lu bytes", i_bytes_raw );
if (i_bytes_raw < 1024 * 1024) if (i_bytes_raw < 1024 * 1024)
printf( "(%lu KB", i_bytes_raw / 1024 ); printf( "(%lu KB", i_bytes_raw / 1024 );
else else
printf( "(%lu MB", i_bytes_raw / (1024 * 1024) ); printf( "(%lu MB", i_bytes_raw / (1024 * 1024) );
printf(" raw, "); printf(" raw, ");
if (i_bytes_formatted < 1024) if (i_bytes_formatted < 1024)
printf( "%lu bytes", i_bytes_formatted ); printf( "%lu bytes", i_bytes_formatted );
if (i_bytes_formatted < 1024 * 1024) if (i_bytes_formatted < 1024 * 1024)
printf( "%lu KB", i_bytes_formatted / 1024 ); printf( "%lu KB", i_bytes_formatted / 1024 );
else else
printf( "%lu MB", i_bytes_formatted / (1024 * 1024) ); printf( "%lu MB", i_bytes_formatted / (1024 * 1024) );
printf(" formatted)\n"); printf(" formatted)\n");
} }
free(psz_msf); free(psz_msf);
@@ -1018,51 +1016,51 @@ main(int argc, char *argv[])
} else if (!opts.no_tracks) { } else if (!opts.no_tracks) {
const char *psz; const char *psz;
printf( "%3d: %8s %06lu %-6s %-5s ", (int) i, psz_msf, printf( "%3d: %8s %06lu %-6s %-5s ", (int) i, psz_msf,
(long unsigned int) cdio_msf_to_lsn(&msf), (long unsigned int) cdio_msf_to_lsn(&msf),
track_format2str[track_format], track_format2str[track_format],
cdio_get_track_green(p_cdio, i)? "true " : "false"); cdio_get_track_green(p_cdio, i)? "true " : "false");
switch (cdio_get_track_copy_permit(p_cdio, i)) { switch (cdio_get_track_copy_permit(p_cdio, i)) {
case CDIO_TRACK_FLAG_FALSE: case CDIO_TRACK_FLAG_FALSE:
psz="no"; psz="no";
break; break;
case CDIO_TRACK_FLAG_TRUE: case CDIO_TRACK_FLAG_TRUE:
psz="yes"; psz="yes";
break; break;
case CDIO_TRACK_FLAG_UNKNOWN: case CDIO_TRACK_FLAG_UNKNOWN:
psz="?"; psz="?";
break; break;
case CDIO_TRACK_FLAG_ERROR: case CDIO_TRACK_FLAG_ERROR:
default: default:
psz="error"; psz="error";
break; break;
} }
printf("%-5s", psz); printf("%-5s", psz);
if (TRACK_FORMAT_AUDIO == track_format) { if (TRACK_FORMAT_AUDIO == track_format) {
const int i_channels = cdio_get_track_channels(p_cdio, i); const int i_channels = cdio_get_track_channels(p_cdio, i);
switch (cdio_get_track_preemphasis(p_cdio, i)) { switch (cdio_get_track_preemphasis(p_cdio, i)) {
case CDIO_TRACK_FLAG_FALSE: case CDIO_TRACK_FLAG_FALSE:
psz="no"; psz="no";
break; break;
case CDIO_TRACK_FLAG_TRUE: case CDIO_TRACK_FLAG_TRUE:
psz="yes"; psz="yes";
break; break;
case CDIO_TRACK_FLAG_UNKNOWN: case CDIO_TRACK_FLAG_UNKNOWN:
psz="?"; psz="?";
break; break;
case CDIO_TRACK_FLAG_ERROR: case CDIO_TRACK_FLAG_ERROR:
default: default:
psz="error"; psz="error";
break; break;
} }
if (i_channels == -2) if (i_channels == -2)
printf(" %-8s", "unknown"); printf(" %-8s", "unknown");
else if (i_channels == -1) else if (i_channels == -1)
printf(" %-8s", "error"); printf(" %-8s", "error");
else else
printf(" %-8d", i_channels); printf(" %-8d", i_channels);
printf( " %s", psz); printf( " %s", psz);
} }
printf( "\n" ); printf( "\n" );
@@ -1087,91 +1085,102 @@ main(int argc, char *argv[])
report(stdout, "Media Catalog Number (MCN): "); fflush(stdout); report(stdout, "Media Catalog Number (MCN): "); fflush(stdout);
media_catalog_number = cdio_get_mcn(p_cdio); media_catalog_number = cdio_get_mcn(p_cdio);
if (NULL == media_catalog_number) { if (NULL == media_catalog_number) {
if (i_read_cap & CDIO_DRIVE_CAP_READ_MCN) if (i_read_cap & CDIO_DRIVE_CAP_READ_MCN)
report(stdout, "not available\n"); report(stdout, "not available\n");
else else
report(stdout, "not supported by drive/driver\n"); report(stdout, "not supported by drive/driver\n");
} else { } else {
report(stdout, "%s\n", media_catalog_number); report(stdout, "%s\n", media_catalog_number);
free(media_catalog_number); free(media_catalog_number);
} }
if (i_read_cap & CDIO_DRIVE_CAP_READ_ISRC) {
driver_return_code_t status;
for (i = 1; i <= i_tracks; i++) {
bzero(&isrc, sizeof(isrc));
status = mmc_isrc_track_read_subchannel (p_cdio, i, isrc);
if (status == DRIVER_OP_SUCCESS && isrc[0] != '\0') {
report(stdout, "TRACK %2d ISRC: %s\n", i, isrc); fflush(stdout);
}
}
}
/* List number of sessions */ /* List number of sessions */
{ {
lsn_t i_last_session; lsn_t i_last_session;
report(stdout, "Last CD Session LSN: "); fflush(stdout); report(stdout, "Last CD Session LSN: "); fflush(stdout);
if (DRIVER_OP_SUCCESS == cdio_get_last_session(p_cdio, &i_last_session)) if (DRIVER_OP_SUCCESS == cdio_get_last_session(p_cdio, &i_last_session))
{ {
report(stdout, "%d\n", i_last_session); report(stdout, "%d\n", i_last_session);
} else { } else {
if (i_misc_cap & CDIO_DRIVE_CAP_MISC_MULTI_SESSION) if (i_misc_cap & CDIO_DRIVE_CAP_MISC_MULTI_SESSION)
report(stdout, "failed\n"); report(stdout, "failed\n");
else else
report(stdout, "not supported by drive/driver\n"); report(stdout, "not supported by drive/driver\n");
} }
} }
/* get audio status from subchannel */ /* get audio status from subchannel */
if ( CDIO_DISC_MODE_CD_DA == discmode || if ( CDIO_DISC_MODE_CD_DA == discmode ||
CDIO_DISC_MODE_CD_MIXED == discmode ) { CDIO_DISC_MODE_CD_MIXED == discmode ) {
cdio_subchannel_t subchannel; cdio_subchannel_t subchannel;
driver_return_code_t rc; driver_return_code_t rc;
memset(&subchannel, 0, sizeof(subchannel)); memset(&subchannel, 0, sizeof(subchannel));
report( stdout, "audio status: "); fflush(stdout); report( stdout, "audio status: "); fflush(stdout);
rc = cdio_audio_read_subchannel(p_cdio, &subchannel); rc = cdio_audio_read_subchannel(p_cdio, &subchannel);
if (DRIVER_OP_SUCCESS == rc) { if (DRIVER_OP_SUCCESS == rc) {
bool b_volume = false; bool b_volume = false;
bool b_position = false; bool b_position = false;
report ( stdout, "%s\n", report ( stdout, "%s\n",
mmc_audio_state2str(subchannel.audio_status) ); mmc_audio_state2str(subchannel.audio_status) );
switch (subchannel.audio_status) { switch (subchannel.audio_status) {
case CDIO_MMC_READ_SUB_ST_PLAY: case CDIO_MMC_READ_SUB_ST_PLAY:
b_playing_audio = true; b_playing_audio = true;
/* Fall through to next case. */ /* Fall through to next case. */
case CDIO_MMC_READ_SUB_ST_PAUSED: case CDIO_MMC_READ_SUB_ST_PAUSED:
b_position = true; b_position = true;
/* Fall through to next case. */ /* Fall through to next case. */
case CDIO_MMC_READ_SUB_ST_NO_STATUS: case CDIO_MMC_READ_SUB_ST_NO_STATUS:
b_volume = true; b_volume = true;
break; break;
default: default:
; ;
} }
if (b_position) if (b_position)
report( stdout, " at: %02d:%02d abs / %02d:%02d track %d\n", report( stdout, " at: %02d:%02d abs / %02d:%02d track %d\n",
subchannel.abs_addr.m, subchannel.abs_addr.m,
subchannel.abs_addr.s, subchannel.abs_addr.s,
subchannel.rel_addr.m, subchannel.rel_addr.m,
subchannel.rel_addr.s, subchannel.rel_addr.s,
subchannel.track ); subchannel.track );
if (b_volume) { if (b_volume) {
cdio_audio_volume_t volume; cdio_audio_volume_t volume;
if (DRIVER_OP_SUCCESS == cdio_audio_get_volume (p_cdio, &volume)) { if (DRIVER_OP_SUCCESS == cdio_audio_get_volume (p_cdio, &volume)) {
uint8_t i=0; uint8_t i=0;
for (i=0; i<4; i++) { for (i=0; i<4; i++) {
uint8_t i_level = volume.level[i]; uint8_t i_level = volume.level[i];
report( stdout, report( stdout,
"volume level port %d: %3d (0..255) %3d (0..100)\n", "volume level port %d: %3d (0..255) %3d (0..100)\n",
i, i_level, (i_level*100+128) / 256 ); i, i_level, (i_level*100+128) / 256 );
} }
} else } else
report( stdout, " can't get volume levels\n" ); report( stdout, " can't get volume levels\n" );
} }
} else if (DRIVER_OP_UNSUPPORTED == rc) { } else if (DRIVER_OP_UNSUPPORTED == rc) {
report( stdout, "not implemented\n" ); report( stdout, "not implemented\n" );
} else { } else {
report( stdout, "FAILED\n" ); report( stdout, "FAILED\n" );
} }
} }
} }
@@ -1180,8 +1189,8 @@ main(int argc, char *argv[])
if (b_playing_audio) { if (b_playing_audio) {
/* Running a CD Analysis would mess up audio playback.*/ /* Running a CD Analysis would mess up audio playback.*/
report(stdout, report(stdout,
"CD Analysis Report omitted because audio is currently " "CD Analysis Report omitted because audio is currently "
"playing.\n"); "playing.\n");
myexit(p_cdio, EXIT_SUCCESS); myexit(p_cdio, EXIT_SUCCESS);
} }
@@ -1196,76 +1205,76 @@ main(int argc, char *argv[])
/* CD-I/Ready says start_track_lsn <= 30*75 then CDDA */ /* CD-I/Ready says start_track_lsn <= 30*75 then CDDA */
if (start_track_lsn > 100 /* 100 is just a guess */) { if (start_track_lsn > 100 /* 100 is just a guess */) {
fs = cdio_guess_cd_type(p_cdio, 0, 1, &cdio_iso_analysis); fs = cdio_guess_cd_type(p_cdio, 0, 1, &cdio_iso_analysis);
if ((CDIO_FSTYPE(fs)) != CDIO_FS_UNKNOWN) if ((CDIO_FSTYPE(fs)) != CDIO_FS_UNKNOWN)
fs |= CDIO_FS_ANAL_HIDDEN_TRACK; fs |= CDIO_FS_ANAL_HIDDEN_TRACK;
else { else {
fs &= ~CDIO_FS_MASK; /* del filesystem info */ fs &= ~CDIO_FS_MASK; /* del filesystem info */
report( stdout, "Oops: %lu unused sectors at start, " report( stdout, "Oops: %lu unused sectors at start, "
"but hidden track check failed.\n", "but hidden track check failed.\n",
(long unsigned int) start_track_lsn); (long unsigned int) start_track_lsn);
} }
} }
print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, num_audio, print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, num_audio,
i_tracks, i_first_track, i_tracks, i_first_track,
cdio_get_track_format(p_cdio, 1), p_cdio); cdio_get_track_format(p_cdio, 1), p_cdio);
} else { } else {
/* we have data track(s) */ /* we have data track(s) */
int j; int j;
for (j = 2, i = first_data; i <= i_tracks; i++) { for (j = 2, i = first_data; i <= i_tracks; i++) {
msf_t msf; msf_t msf;
track_format_t track_format = cdio_get_track_format(p_cdio, i); track_format_t track_format = cdio_get_track_format(p_cdio, i);
cdio_get_track_msf(p_cdio, i, &msf); cdio_get_track_msf(p_cdio, i, &msf);
switch ( track_format ) { switch ( track_format ) {
case TRACK_FORMAT_AUDIO: case TRACK_FORMAT_AUDIO:
case TRACK_FORMAT_ERROR: case TRACK_FORMAT_ERROR:
break; break;
case TRACK_FORMAT_CDI: case TRACK_FORMAT_CDI:
case TRACK_FORMAT_XA: case TRACK_FORMAT_XA:
case TRACK_FORMAT_DATA: case TRACK_FORMAT_DATA:
case TRACK_FORMAT_PSX: case TRACK_FORMAT_PSX:
; ;
} }
start_track_lsn = (i == 1) ? 0 : cdio_msf_to_lsn(&msf); start_track_lsn = (i == 1) ? 0 : cdio_msf_to_lsn(&msf);
/* save the start of the data area */ /* save the start of the data area */
if (i == first_data) if (i == first_data)
data_start = start_track_lsn; data_start = start_track_lsn;
/* skip tracks which belong to the current walked session */ /* skip tracks which belong to the current walked session */
if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size) if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size)
continue; continue;
fs = cdio_guess_cd_type(p_cdio, start_track_lsn, i, fs = cdio_guess_cd_type(p_cdio, start_track_lsn, i,
&cdio_iso_analysis); &cdio_iso_analysis);
if (i > 1) { if (i > 1) {
/* track is beyond last session -> new session found */ /* track is beyond last session -> new session found */
ms_offset = start_track_lsn; ms_offset = start_track_lsn;
report( stdout, "session #%d starts at track %2i, LSN: %lu," report( stdout, "session #%d starts at track %2i, LSN: %lu,"
" ISO 9660 blocks: %6i\n", " ISO 9660 blocks: %6i\n",
j++, i, (unsigned long int) start_track_lsn, j++, i, (unsigned long int) start_track_lsn,
cdio_iso_analysis.isofs_size); cdio_iso_analysis.isofs_size);
report( stdout, "ISO 9660: %i blocks, label `%.32s'\n", report( stdout, "ISO 9660: %i blocks, label `%.32s'\n",
cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label); cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
fs |= CDIO_FS_ANAL_MULTISESSION; fs |= CDIO_FS_ANAL_MULTISESSION;
} else { } else {
print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, print_analysis(ms_offset, cdio_iso_analysis, fs, first_data,
num_audio, i_tracks, i_first_track, num_audio, i_tracks, i_first_track,
track_format, p_cdio); track_format, p_cdio);
} }
if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 || if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS || CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS ||
/* CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) /* CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE)
&& (fs & XA))) */ && (fs & XA))) */
CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) ) CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
/* no method for non-ISO9660 multisessions */ /* no method for non-ISO9660 multisessions */
break; break;
} }
} }
} }