diff --git a/example/Makefile.am b/example/Makefile.am index 9489892b..dbb7aa9e 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.22 2005/04/30 02:04:29 rocky Exp $ +# $Id: Makefile.am,v 1.23 2005/04/30 09:42:37 rocky Exp $ # # Copyright (C) 2003, 2004, 2005 Rocky Bernstein # @@ -24,7 +24,8 @@ if !DISABLE_CPP SUBDIRS = C++ endif noinst_PROGRAMS = audio cdtext device drives iso1 iso2 iso3 isofuzzy \ - mmc1 mmc2 paranoia paranoia2 tracks sample3 sample4 + mmc1 mmc2 paranoia paranoia2 tracks \ + sample3 sample4 INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS) diff --git a/include/cdio/mmc.h b/include/cdio/mmc.h index 84347c85..ca62d0ec 100644 --- a/include/cdio/mmc.h +++ b/include/cdio/mmc.h @@ -1,5 +1,5 @@ /* - $Id: mmc.h,v 1.19 2005/03/21 09:19:06 rocky Exp $ + $Id: mmc.h,v 1.20 2005/04/30 09:42:37 rocky Exp $ Copyright (C) 2003, 2004, 2005 Rocky Bernstein @@ -498,6 +498,20 @@ mmc_audio_read_subchannel (CdIo_t *p_cdio, /*out*/ cdio_drive_write_cap_t *p_write_cap, /*out*/ cdio_drive_misc_cap_t *p_misc_cap); + typedef enum { + CDIO_MMC_LEVEL_WEIRD, + CDIO_MMC_LEVEL_1, + CDIO_MMC_LEVEL_2, + CDIO_MMC_LEVEL_3, + CDIO_MMC_LEVEL_NONE + } cdio_mmc_level_t; + + /*! + Get the MMC level supported by the device. + */ + cdio_mmc_level_t mmc_get_drive_mmc_cap(CdIo_t *p_cdio); + + /*! Get the DVD type associated with cd object. @@ -546,7 +560,7 @@ mmc_audio_read_subchannel (CdIo_t *p_cdio, /*! Report if CD-ROM has a praticular kind of interface (ATAPI, SCSCI, ...) Is it possible for an interface to have serveral? If not this - routine could probably return the sincle mmc_feature_interface_t. + routine could probably return the single mmc_feature_interface_t. @return true if we have the interface and false if not. */ bool_3way_t mmc_have_interface( CdIo_t *p_cdio, diff --git a/lib/driver/libcdio.sym b/lib/driver/libcdio.sym index cd4155cd..3fd9762f 100644 --- a/lib/driver/libcdio.sym +++ b/lib/driver/libcdio.sym @@ -168,6 +168,7 @@ mmc_audio_state2str mmc_eject_media mmc_get_blocksize mmc_get_discmode +mmc_get_drive_mmc_cap mmc_get_dvd_struct_physical mmc_get_cmd_len mmc_get_media_changed diff --git a/lib/driver/mmc.c b/lib/driver/mmc.c index 22f8b3cf..10e35656 100644 --- a/lib/driver/mmc.c +++ b/lib/driver/mmc.c @@ -1,6 +1,6 @@ /* Common Multimedia Command (MMC) routines. - $Id: mmc.c,v 1.25 2005/03/23 11:15:25 rocky Exp $ + $Id: mmc.c,v 1.26 2005/04/30 09:42:37 rocky Exp $ Copyright (C) 2004, 2005 Rocky Bernstein @@ -731,6 +731,36 @@ mmc_get_drive_cap (CdIo_t *p_cdio, return; } +/*! + Get the MMC level supported by the device. +*/ +cdio_mmc_level_t +mmc_get_drive_mmc_cap(CdIo_t *p_cdio) +{ + uint8_t buf[256] = { 0, }; + uint8_t len; + int rc = mmc_mode_sense(p_cdio, buf, sizeof(buf), + CDIO_MMC_CAPABILITIES_PAGE); + + if (DRIVER_OP_SUCCESS != rc) { + return CDIO_MMC_LEVEL_NONE; + } + + len = buf[1]; + if (16 > len) { + return CDIO_MMC_LEVEL_WEIRD; + } else if (28 <= len) { + return CDIO_MMC_LEVEL_3; + } else if (24 <= len) { + return CDIO_MMC_LEVEL_2; + printf("MMC 2"); + } else if (20 <= len) { + return CDIO_MMC_LEVEL_1; + } else { + return CDIO_MMC_LEVEL_WEIRD; + } +} + /*! Get the DVD type associated with cd object. */ diff --git a/src/cd-drive.c b/src/cd-drive.c index 4b7eeaeb..8fc9c21c 100644 --- a/src/cd-drive.c +++ b/src/cd-drive.c @@ -1,5 +1,5 @@ /* - $Id: cd-drive.c,v 1.19 2005/04/11 01:37:38 rocky Exp $ + $Id: cd-drive.c,v 1.20 2005/04/30 09:42:37 rocky Exp $ Copyright (C) 2004, 2005 Rocky Bernstein @@ -146,6 +146,34 @@ _log_handler (cdio_log_level_t level, const char message[]) gl_default_cdio_log_handler (level, message); } +/*! Prints out SCSI-MMC drive features */ +static void +print_mmc_drive_level(CdIo_t *p_cdio) +{ + cdio_mmc_level_t mmc_level = mmc_get_drive_mmc_cap(p_cdio); + + printf( "CD-ROM drive supports " ); + + switch(mmc_level) { + case CDIO_MMC_LEVEL_WEIRD: + printf("some nonstandard or degenerate set of MMC\n"); + break; + case CDIO_MMC_LEVEL_1: + printf("MMC 1\n"); + break; + case CDIO_MMC_LEVEL_2: + printf("MMC 2\n"); + break; + case CDIO_MMC_LEVEL_3: + printf("MMC 3\n"); + break; + case CDIO_MMC_LEVEL_NONE: + printf("no MMC\n"); + break; + } + printf("\n"); +} + /* Initialize global variables. */ static void init(void) @@ -228,6 +256,8 @@ main(int argc, const char *argv[]) cdio_hwinfo_t hwinfo; CdIo_t *p_cdio = cdio_open(*ppsz_cd, driver_id); + print_mmc_drive_level(p_cdio); + printf("%28s: %s\n", "Drive", *ppsz_cd); if (p_cdio) {