diff --git a/THANKS b/THANKS index 687fa8e4..eadc73a8 100644 --- a/THANKS +++ b/THANKS @@ -78,5 +78,5 @@ Robert William Fuller Scot C. Bontrager 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. diff --git a/include/cdio/audio.h b/include/cdio/audio.h index 880cd541..e51ba3d2 100644 --- a/include/cdio/audio.h +++ b/include/cdio/audio.h @@ -1,6 +1,4 @@ /* -*- c -*- - $Id: audio.h,v 1.12 2008/03/25 15:59:08 karl Exp $ - Copyright (C) 2005, 2007, 2008 Rocky Bernstein This program is free software: you can redistribute it and/or modify diff --git a/include/cdio/types.h b/include/cdio/types.h index 4bc946e9..4fca860c 100644 --- a/include/cdio/types.h +++ b/include/cdio/types.h @@ -272,6 +272,7 @@ typedef uint8_t ubyte; /*! 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 @@ -288,7 +289,7 @@ typedef uint8_t ubyte; #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. */ typedef char cdio_isrc_t[CDIO_ISRC_SIZE+1]; diff --git a/include/cdio/udf_file.h b/include/cdio/udf_file.h index 0b8fe99e..625e448b 100644 --- a/include/cdio/udf_file.h +++ b/include/cdio/udf_file.h @@ -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 This program is free software: you can redistribute it and/or modify diff --git a/lib/driver/mmc/mmc.c b/lib/driver/mmc/mmc.c index 9140a5a8..6f2685e6 100644 --- a/lib/driver/mmc/mmc.c +++ b/lib/driver/mmc/mmc.c @@ -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, sizeof(buf), buf); 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; } diff --git a/src/cd-info.c b/src/cd-info.c index f2a903e6..173421a8 100644 --- a/src/cd-info.c +++ b/src/cd-info.c @@ -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 Rocky Bernstein + Copyright (C) 2003, 2004, 2005, 2007, 2008, 2011 + Rocky Bernstein Copyright (C) 1996, 1997, 1998 Gerd Knorr and Heiko Eißfeldt @@ -129,9 +128,9 @@ parse_source(int opt) if (opts.source_image != INPUT_UNKNOWN) { report(stderr, "%s: another source type option given before.\n", - program_name); + program_name); report(stderr, "%s: give only one source type option.\n", - program_name); + program_name); return; } @@ -166,7 +165,6 @@ parse_source(int opt) } } - /* Parse all options. */ static bool parse_options (int argc, char *argv[]) @@ -346,8 +344,8 @@ parse_options (int argc, char *argv[]) if (source_name != NULL) { report(stderr, "%s: Source '%s' given as an argument of an option and as " - "unnamed option '%s'\n", - program_name, source_name, remaining_arg); + "unnamed option '%s'\n", + program_name, source_name, remaining_arg); free(program_name); exit (EXIT_FAILURE); } @@ -359,7 +357,7 @@ parse_options (int argc, char *argv[]) if (optind < argc) { 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); exit (EXIT_FAILURE); } @@ -368,7 +366,6 @@ parse_options (int argc, char *argv[]) return true; } - /* CDIO logging routines */ #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++) { 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:"); for ( ; i_first_track < i_last_track; i_first_track++ ) { 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); } } @@ -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; 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) printf("%s: %s\n", program_name, cddb_error_str(cddb_errno(p_conn))); else { printf("%s: Found %d matches in CDDB\n", program_name, i_cddb_matches); for (i=1; i<=i_cddb_matches; i++) { - cddb_disc_print(p_cddb_disc); - cddb_query_next(p_conn, p_cddb_disc); - if (i != i_cddb_matches) cddb_read(p_conn, p_cddb_disc); + cddb_disc_print(p_cddb_disc); + cddb_query_next(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; } 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, "Volume count : %d\n", vcdinfo_get_volume_count(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; case VCDINFO_OPEN_OTHER: 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; } if (p_vcd) vcdinfo_close(p_vcd); @@ -511,7 +508,7 @@ print_vcd_info(driver_id_t driver) { static void 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_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) { - iso9660_name_translate_ext(psz_iso_name, translated_name, - i_joliet_level); + iso9660_name_translate_ext(psz_iso_name, translated_name, + i_joliet_level); } snprintf (_fullname, sizeof (_fullname), "%s%s", pathname, - psz_iso_name); + psz_iso_name); 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)); 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) { - free(p_statbuf->rr.psz_symlink); - p_statbuf->rr.i_symlink = 0; + free(p_statbuf->rr.psz_symlink); + p_statbuf->rr.i_symlink = 0; } } free (translated_name); @@ -594,7 +591,7 @@ print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[], static void 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; @@ -611,19 +608,19 @@ print_iso9660_fs (CdIo_t *p_cdio, cdio_fs_anal_t fs, print_iso9660_recurse (p_cdio, "/", fs); } -#define print_vd_info(title, fn) \ - psz_str = fn(&pvd); \ - if (psz_str) { \ - report(stdout, title ": %s\n", psz_str); \ - free(psz_str); \ - psz_str = NULL; \ +#define print_vd_info(title, fn) \ + psz_str = fn(&pvd); \ + if (psz_str) { \ + report(stdout, title ": %s\n", psz_str); \ + free(psz_str); \ + psz_str = NULL; \ } static void print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis, - cdio_fs_anal_t fs, int first_data, unsigned int num_audio, - track_t i_tracks, track_t i_first_track, - track_format_t track_format, CdIo_t *p_cdio) + cdio_fs_anal_t fs, int first_data, unsigned int num_audio, + track_t i_tracks, track_t i_first_track, + track_format_t track_format, CdIo_t *p_cdio) { int need_lf; @@ -632,9 +629,9 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis, if (num_audio > 0) { #ifdef HAVE_CDDB if (!opts.no_cddb) { - printf("Audio CD, CDDB disc ID is %08x\n", - cddb_discid(p_cdio, i_tracks)); - print_cddb_info(p_cdio, i_tracks, i_first_track); + printf("Audio CD, CDDB disc ID is %08x\n", + cddb_discid(p_cdio, i_tracks)); + print_cddb_info(p_cdio, i_tracks, i_first_track); } #endif 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; case CDIO_FS_EXT2: printf("CD-ROM with GNU/Linux EXT2 (native) filesystem\n"); - break; + break; case CDIO_FS_3DO: printf("CD-ROM with Panasonic 3DO filesystem\n"); 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_UDF: 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; if ( iso9660_fs_read_pvd(p_cdio, &pvd) ) { - char *psz_str; - print_vd_info("Application", iso9660_get_application_id); - print_vd_info("Preparer ", iso9660_get_preparer_id); - print_vd_info("Publisher ", iso9660_get_publisher_id); - print_vd_info("System ", iso9660_get_system_id); - print_vd_info("Volume ", iso9660_get_volume_id); - print_vd_info("Volume Set ", iso9660_get_volumeset_id); + char *psz_str; + print_vd_info("Application", iso9660_get_application_id); + print_vd_info("Preparer ", iso9660_get_preparer_id); + print_vd_info("Publisher ", iso9660_get_publisher_id); + print_vd_info("System ", iso9660_get_system_id); + print_vd_info("Volume ", iso9660_get_volume_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_ISO_UDF: 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; default: ; } @@ -731,7 +728,7 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis, need_lf += printf("Hidden Track "); if (fs & CDIO_FS_ANAL_PHOTO_CD) need_lf += printf("%sPhoto CD ", - num_audio > 0 ? " Portfolio " : ""); + num_audio > 0 ? " Portfolio " : ""); if (fs & CDIO_FS_ANAL_CDTV) need_lf += printf("Commodore CDTV "); if (first_data > 1) @@ -822,13 +819,14 @@ main(int argc, char *argv[]) int first_data = -1; /* # of first data track */ int first_audio = -1; /* # of first audio track */ bool b_playing_audio = false; /* currently playing a - CD-DA */ + CD-DA */ cdio_iso_analysis_t cdio_iso_analysis; char *media_catalog_number; discmode_t discmode = CDIO_DISC_MODE_NO_INFO; cdio_drive_read_cap_t i_read_cap = 0; cdio_drive_write_cap_t i_write_cap; cdio_drive_misc_cap_t i_misc_cap; + cdio_isrc_t isrc; memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis)); init(); @@ -856,10 +854,10 @@ main(int argc, char *argv[]) if (p_cdio==NULL) { if (source_name) { err_exit("%s: Error in opening device driver for input %s.\n", - program_name, source_name); + program_name, source_name); } else { 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; if (cdio_get_hwinfo(p_cdio, &hwinfo)) { printf("%-28s: %s\n%-28s: %s\n%-28s: %s\n", - "Vendor" , hwinfo.psz_vendor, - "Model" , hwinfo.psz_model, - "Revision", hwinfo.psz_revision); + "Vendor" , hwinfo.psz_vendor, + "Model" , hwinfo.psz_model, + "Revision", hwinfo.psz_revision); } 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"); if (NULL != d) { for ( ; *d != NULL ; d++ ) { - CdIo_t *p_cdio = cdio_open(source_name, driver_id); - cdio_hwinfo_t hwinfo; - printf("Drive %s\n", *d); - if (mmc_get_hwinfo(p_cdio, &hwinfo)) { - printf("%-8s: %s\n%-8s: %s\n%-8s: %s\n", - "Vendor" , hwinfo.psz_vendor, - "Model" , hwinfo.psz_model, - "Revision", hwinfo.psz_revision); - } - if (p_cdio) cdio_destroy(p_cdio); + CdIo_t *p_cdio = cdio_open(source_name, driver_id); + cdio_hwinfo_t hwinfo; + printf("Drive %s\n", *d); + if (mmc_get_hwinfo(p_cdio, &hwinfo)) { + printf("%-8s: %s\n%-8s: %s\n%-8s: %s\n", + "Vendor" , hwinfo.psz_vendor, + "Model" , hwinfo.psz_model, + "Revision", hwinfo.psz_revision); + } + if (p_cdio) cdio_destroy(p_cdio); } } cdio_free_device_list(device_list); @@ -918,7 +916,7 @@ main(int argc, char *argv[]) discmode = cdio_get_discmode(p_cdio); if ( 0 == opts.no_disc_mode ) { printf("Disc mode is listed as: %s\n", - discmode2str[discmode]); + discmode2str[discmode]); } if (cdio_is_discmode_dvd(discmode) && !opts.show_dvd) { @@ -941,11 +939,11 @@ main(int argc, char *argv[]) if (!opts.no_tracks) { 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?"); if ( CDIO_DISC_MODE_CD_DA == discmode - || CDIO_DISC_MODE_CD_MIXED == discmode ) + || CDIO_DISC_MODE_CD_MIXED == discmode ) printf(" Channels Premphasis?"); printf("\n"); } @@ -966,14 +964,14 @@ main(int argc, char *argv[]) psz_msf = cdio_msf_to_str(&msf); if (i == CDIO_CDROM_LEADOUT_TRACK) { 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_formatted = lsn - start_track_lsn; - printf( "%3d: %8s %06lu leadout ", (int) i, psz_msf, - (long unsigned int) lsn ); + printf( "%3d: %8s %06lu leadout ", (int) i, psz_msf, + (long unsigned int) lsn ); - switch (discmode) { + switch (discmode) { case CDIO_DISC_MODE_DVD_ROM: case CDIO_DISC_MODE_DVD_RAM: 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_PRW: case CDIO_DISC_MODE_DVD_OTHER: - case CDIO_DISC_MODE_CD_DATA: - i_bytes_formatted *= CDIO_CD_FRAMESIZE; - break; - case CDIO_DISC_MODE_CD_DA: - i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW0; - break; - default: - i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; - } - - if (i_bytes_raw < 1024) - printf( "(%lu bytes", i_bytes_raw ); - if (i_bytes_raw < 1024 * 1024) - printf( "(%lu KB", i_bytes_raw / 1024 ); - else - printf( "(%lu MB", i_bytes_raw / (1024 * 1024) ); + case CDIO_DISC_MODE_CD_DATA: + i_bytes_formatted *= CDIO_CD_FRAMESIZE; + break; + case CDIO_DISC_MODE_CD_DA: + i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; + break; + case CDIO_DISC_MODE_CD_XA: + case CDIO_DISC_MODE_CD_MIXED: + i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW0; + break; + default: + i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW; + } + + if (i_bytes_raw < 1024) + printf( "(%lu bytes", i_bytes_raw ); + if (i_bytes_raw < 1024 * 1024) + printf( "(%lu KB", i_bytes_raw / 1024 ); + else + printf( "(%lu MB", i_bytes_raw / (1024 * 1024) ); - printf(" raw, "); - if (i_bytes_formatted < 1024) - printf( "%lu bytes", i_bytes_formatted ); - if (i_bytes_formatted < 1024 * 1024) - printf( "%lu KB", i_bytes_formatted / 1024 ); - else - printf( "%lu MB", i_bytes_formatted / (1024 * 1024) ); + printf(" raw, "); + if (i_bytes_formatted < 1024) + printf( "%lu bytes", i_bytes_formatted ); + if (i_bytes_formatted < 1024 * 1024) + printf( "%lu KB", i_bytes_formatted / 1024 ); + else + printf( "%lu MB", i_bytes_formatted / (1024 * 1024) ); - printf(" formatted)\n"); + printf(" formatted)\n"); } free(psz_msf); @@ -1018,51 +1016,51 @@ main(int argc, char *argv[]) } else if (!opts.no_tracks) { const char *psz; printf( "%3d: %8s %06lu %-6s %-5s ", (int) i, psz_msf, - (long unsigned int) cdio_msf_to_lsn(&msf), - track_format2str[track_format], - cdio_get_track_green(p_cdio, i)? "true " : "false"); + (long unsigned int) cdio_msf_to_lsn(&msf), + track_format2str[track_format], + cdio_get_track_green(p_cdio, i)? "true " : "false"); switch (cdio_get_track_copy_permit(p_cdio, i)) { case CDIO_TRACK_FLAG_FALSE: - psz="no"; - break; + psz="no"; + break; case CDIO_TRACK_FLAG_TRUE: - psz="yes"; - break; + psz="yes"; + break; case CDIO_TRACK_FLAG_UNKNOWN: - psz="?"; - break; + psz="?"; + break; case CDIO_TRACK_FLAG_ERROR: default: - psz="error"; - break; + psz="error"; + break; } printf("%-5s", psz); - + if (TRACK_FORMAT_AUDIO == track_format) { - const int i_channels = cdio_get_track_channels(p_cdio, i); - switch (cdio_get_track_preemphasis(p_cdio, i)) { - case CDIO_TRACK_FLAG_FALSE: - psz="no"; - break; - case CDIO_TRACK_FLAG_TRUE: - psz="yes"; - break; - case CDIO_TRACK_FLAG_UNKNOWN: - psz="?"; - break; - case CDIO_TRACK_FLAG_ERROR: - default: - psz="error"; - break; - } - if (i_channels == -2) - printf(" %-8s", "unknown"); - else if (i_channels == -1) - printf(" %-8s", "error"); - else - printf(" %-8d", i_channels); - printf( " %s", psz); + const int i_channels = cdio_get_track_channels(p_cdio, i); + switch (cdio_get_track_preemphasis(p_cdio, i)) { + case CDIO_TRACK_FLAG_FALSE: + psz="no"; + break; + case CDIO_TRACK_FLAG_TRUE: + psz="yes"; + break; + case CDIO_TRACK_FLAG_UNKNOWN: + psz="?"; + break; + case CDIO_TRACK_FLAG_ERROR: + default: + psz="error"; + break; + } + if (i_channels == -2) + printf(" %-8s", "unknown"); + else if (i_channels == -1) + printf(" %-8s", "error"); + else + printf(" %-8d", i_channels); + printf( " %s", psz); } printf( "\n" ); @@ -1087,91 +1085,102 @@ main(int argc, char *argv[]) report(stdout, "Media Catalog Number (MCN): "); fflush(stdout); media_catalog_number = cdio_get_mcn(p_cdio); - + if (NULL == media_catalog_number) { if (i_read_cap & CDIO_DRIVE_CAP_READ_MCN) - report(stdout, "not available\n"); + report(stdout, "not available\n"); else - report(stdout, "not supported by drive/driver\n"); + report(stdout, "not supported by drive/driver\n"); } else { report(stdout, "%s\n", 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 */ { lsn_t i_last_session; report(stdout, "Last CD Session LSN: "); fflush(stdout); if (DRIVER_OP_SUCCESS == cdio_get_last_session(p_cdio, &i_last_session)) - { - report(stdout, "%d\n", i_last_session); - } else { - if (i_misc_cap & CDIO_DRIVE_CAP_MISC_MULTI_SESSION) - report(stdout, "failed\n"); - else - report(stdout, "not supported by drive/driver\n"); - } + { + report(stdout, "%d\n", i_last_session); + } else { + if (i_misc_cap & CDIO_DRIVE_CAP_MISC_MULTI_SESSION) + report(stdout, "failed\n"); + else + report(stdout, "not supported by drive/driver\n"); + } } /* get audio status from subchannel */ if ( CDIO_DISC_MODE_CD_DA == discmode || - CDIO_DISC_MODE_CD_MIXED == discmode ) { + CDIO_DISC_MODE_CD_MIXED == discmode ) { cdio_subchannel_t subchannel; driver_return_code_t rc; memset(&subchannel, 0, sizeof(subchannel)); report( stdout, "audio status: "); fflush(stdout); - + rc = cdio_audio_read_subchannel(p_cdio, &subchannel); if (DRIVER_OP_SUCCESS == rc) { - bool b_volume = false; - bool b_position = false; + bool b_volume = false; + bool b_position = false; - report ( stdout, "%s\n", - mmc_audio_state2str(subchannel.audio_status) ); + report ( stdout, "%s\n", + mmc_audio_state2str(subchannel.audio_status) ); - switch (subchannel.audio_status) { - case CDIO_MMC_READ_SUB_ST_PLAY: - b_playing_audio = true; - /* Fall through to next case. */ - case CDIO_MMC_READ_SUB_ST_PAUSED: - b_position = true; - /* Fall through to next case. */ - case CDIO_MMC_READ_SUB_ST_NO_STATUS: - b_volume = true; - break; - default: - ; - } + switch (subchannel.audio_status) { + case CDIO_MMC_READ_SUB_ST_PLAY: + b_playing_audio = true; + /* Fall through to next case. */ + case CDIO_MMC_READ_SUB_ST_PAUSED: + b_position = true; + /* Fall through to next case. */ + case CDIO_MMC_READ_SUB_ST_NO_STATUS: + b_volume = true; + break; + default: + ; + } - if (b_position) - report( stdout, " at: %02d:%02d abs / %02d:%02d track %d\n", - subchannel.abs_addr.m, - subchannel.abs_addr.s, - subchannel.rel_addr.m, - subchannel.rel_addr.s, - subchannel.track ); - - if (b_volume) { - cdio_audio_volume_t volume; + if (b_position) + report( stdout, " at: %02d:%02d abs / %02d:%02d track %d\n", + subchannel.abs_addr.m, + subchannel.abs_addr.s, + subchannel.rel_addr.m, + subchannel.rel_addr.s, + subchannel.track ); + + if (b_volume) { + cdio_audio_volume_t volume; - if (DRIVER_OP_SUCCESS == cdio_audio_get_volume (p_cdio, &volume)) { - uint8_t i=0; - for (i=0; i<4; i++) { - uint8_t i_level = volume.level[i]; - report( stdout, - "volume level port %d: %3d (0..255) %3d (0..100)\n", - i, i_level, (i_level*100+128) / 256 ); - } - - } else - report( stdout, " can't get volume levels\n" ); - } + if (DRIVER_OP_SUCCESS == cdio_audio_get_volume (p_cdio, &volume)) { + uint8_t i=0; + for (i=0; i<4; i++) { + uint8_t i_level = volume.level[i]; + report( stdout, + "volume level port %d: %3d (0..255) %3d (0..100)\n", + i, i_level, (i_level*100+128) / 256 ); + } + + } else + report( stdout, " can't get volume levels\n" ); + } } else if (DRIVER_OP_UNSUPPORTED == rc) { - report( stdout, "not implemented\n" ); + report( stdout, "not implemented\n" ); } else { - report( stdout, "FAILED\n" ); + report( stdout, "FAILED\n" ); } } } @@ -1180,8 +1189,8 @@ main(int argc, char *argv[]) if (b_playing_audio) { /* Running a CD Analysis would mess up audio playback.*/ report(stdout, - "CD Analysis Report omitted because audio is currently " - "playing.\n"); + "CD Analysis Report omitted because audio is currently " + "playing.\n"); 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 */ if (start_track_lsn > 100 /* 100 is just a guess */) { - fs = cdio_guess_cd_type(p_cdio, 0, 1, &cdio_iso_analysis); - if ((CDIO_FSTYPE(fs)) != CDIO_FS_UNKNOWN) - fs |= CDIO_FS_ANAL_HIDDEN_TRACK; - else { - fs &= ~CDIO_FS_MASK; /* del filesystem info */ - report( stdout, "Oops: %lu unused sectors at start, " - "but hidden track check failed.\n", - (long unsigned int) start_track_lsn); - } + fs = cdio_guess_cd_type(p_cdio, 0, 1, &cdio_iso_analysis); + if ((CDIO_FSTYPE(fs)) != CDIO_FS_UNKNOWN) + fs |= CDIO_FS_ANAL_HIDDEN_TRACK; + else { + fs &= ~CDIO_FS_MASK; /* del filesystem info */ + report( stdout, "Oops: %lu unused sectors at start, " + "but hidden track check failed.\n", + (long unsigned int) start_track_lsn); + } } print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, num_audio, - i_tracks, i_first_track, - cdio_get_track_format(p_cdio, 1), p_cdio); + i_tracks, i_first_track, + cdio_get_track_format(p_cdio, 1), p_cdio); } else { /* we have data track(s) */ int j; for (j = 2, i = first_data; i <= i_tracks; i++) { - msf_t msf; - track_format_t track_format = cdio_get_track_format(p_cdio, i); + msf_t msf; + 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 ) { - case TRACK_FORMAT_AUDIO: - case TRACK_FORMAT_ERROR: - break; - case TRACK_FORMAT_CDI: - case TRACK_FORMAT_XA: - case TRACK_FORMAT_DATA: - case TRACK_FORMAT_PSX: - ; - } - - start_track_lsn = (i == 1) ? 0 : cdio_msf_to_lsn(&msf); - - /* save the start of the data area */ - if (i == first_data) - data_start = start_track_lsn; - - /* skip tracks which belong to the current walked session */ - if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size) - continue; - - fs = cdio_guess_cd_type(p_cdio, start_track_lsn, i, - &cdio_iso_analysis); + switch ( track_format ) { + case TRACK_FORMAT_AUDIO: + case TRACK_FORMAT_ERROR: + break; + case TRACK_FORMAT_CDI: + case TRACK_FORMAT_XA: + case TRACK_FORMAT_DATA: + case TRACK_FORMAT_PSX: + ; + } + + start_track_lsn = (i == 1) ? 0 : cdio_msf_to_lsn(&msf); + + /* save the start of the data area */ + if (i == first_data) + data_start = start_track_lsn; + + /* skip tracks which belong to the current walked session */ + if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size) + continue; + + fs = cdio_guess_cd_type(p_cdio, start_track_lsn, i, + &cdio_iso_analysis); - if (i > 1) { - /* track is beyond last session -> new session found */ - ms_offset = start_track_lsn; - report( stdout, "session #%d starts at track %2i, LSN: %lu," - " ISO 9660 blocks: %6i\n", - j++, i, (unsigned long int) start_track_lsn, - cdio_iso_analysis.isofs_size); - report( stdout, "ISO 9660: %i blocks, label `%.32s'\n", - cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label); - fs |= CDIO_FS_ANAL_MULTISESSION; - } else { - print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, - num_audio, i_tracks, i_first_track, - track_format, p_cdio); - } + if (i > 1) { + /* track is beyond last session -> new session found */ + ms_offset = start_track_lsn; + report( stdout, "session #%d starts at track %2i, LSN: %lu," + " ISO 9660 blocks: %6i\n", + j++, i, (unsigned long int) start_track_lsn, + cdio_iso_analysis.isofs_size); + report( stdout, "ISO 9660: %i blocks, label `%.32s'\n", + cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label); + fs |= CDIO_FS_ANAL_MULTISESSION; + } else { + print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, + num_audio, i_tracks, i_first_track, + track_format, p_cdio); + } - if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 || - CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS || - /* CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) - && (fs & XA))) */ - CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) ) - /* no method for non-ISO9660 multisessions */ - break; + if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 || + CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS || + /* CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) + && (fs & XA))) */ + CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) ) + /* no method for non-ISO9660 multisessions */ + break; } } }