diff --git a/include/cdio/scsi_mmc.h b/include/cdio/scsi_mmc.h index 773295a8..d30fb28d 100644 --- a/include/cdio/scsi_mmc.h +++ b/include/cdio/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.16 2004/07/26 02:54:37 rocky Exp $ + $Id: scsi_mmc.h,v 1.17 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -28,6 +28,7 @@ #include #include +#include /*! The generic packet command opcodes for CD/DVD Logical Units. */ @@ -208,5 +209,10 @@ int scsi_mmc_read_sectors ( const CdIo *cdio, void *p_buf, lba_t lba, int scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize); +/*! + Get the DVD type associated with cd object. +*/ +discmode_t scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, + cdio_dvd_struct_t *s); #endif /* __SCSI_MMC_H__ */ diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 70c88584..135d49f7 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.37 2004/07/25 22:33:54 rocky Exp $ + $Id: aspi32.c,v 1.38 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,13 +27,12 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.37 2004/07/25 22:33:54 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.38 2004/07/26 03:58:25 rocky Exp $"; #include #include #include #include -#include #include "cdio_assert.h" #include @@ -178,60 +177,6 @@ have_aspi( HMODULE *hASPI, return true; } - -/*! - Get disc type associated with cd object. -*/ -static discmode_t -get_dvd_struct_physical (_img_private_t *p_env, cdio_dvd_struct_t *s) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned char buf[20], *base; - int i_status; - uint8_t layer_num = s->physical.layer_num; - - cdio_dvd_layer_t *layer; - - if (layer_num >= CDIO_DVD_MAX_LAYERS) - return -EINVAL; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_DVD_STRUCTURE); - cdb.field[6] = layer_num; - cdb.field[7] = CDIO_DVD_STRUCT_PHYSICAL; - cdb.field[9] = sizeof(buf) & 0xff; - - i_status = scsi_mmc_run_cmd_aspi(p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, sizeof(buf), - &buf); - if (0 != i_status) - return CDIO_DISC_MODE_ERROR; - - base = &buf[4]; - layer = &s->physical.layer[layer_num]; - - /* - * place the data... really ugly, but at least we won't have to - * worry about endianess in userspace. - */ - memset(layer, 0, sizeof(*layer)); - layer->book_version = base[0] & 0xf; - layer->book_type = base[0] >> 4; - layer->min_rate = base[1] & 0xf; - layer->disc_size = base[1] >> 4; - layer->layer_type = base[2] & 0xf; - layer->track_path = (base[2] >> 4) & 1; - layer->nlayers = (base[2] >> 5) & 3; - layer->track_density = base[3] & 0xf; - layer->linear_density = base[3] >> 4; - layer->start_sector = base[5] << 16 | base[6] << 8 | base[7]; - layer->end_sector = base[9] << 16 | base[10] << 8 | base[11]; - layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15]; - layer->bca = base[16] >> 7; - - return 0; -} - /*! Get disc type associated with cd object. */ @@ -246,7 +191,9 @@ get_discmode_aspi (_img_private_t *p_env) dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; dvd.physical.layer_num = 0; - if (0 == get_dvd_struct_physical (p_env, &dvd)) { + if (0 == get_dvd_struct_physical_mmc (p_env, + &scsi_mmc_run_cmd_aspi, + &dvd)) { switch(dvd.physical.layer[0].book_type) { case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; diff --git a/lib/MSWindows/win32_ioctl.c b/lib/MSWindows/win32_ioctl.c index 632e6abb..574f34e3 100644 --- a/lib/MSWindows/win32_ioctl.c +++ b/lib/MSWindows/win32_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: win32_ioctl.c,v 1.23 2004/07/25 22:33:54 rocky Exp $ + $Id: win32_ioctl.c,v 1.24 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,11 +26,10 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.23 2004/07/25 22:33:54 rocky Exp $"; +static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.24 2004/07/26 03:58:25 rocky Exp $"; #include #include -#include #include "cdio_assert.h" #ifdef HAVE_WIN32_CDROM @@ -191,59 +190,6 @@ scsi_mmc_run_cmd_win32ioctl( const void *p_user_data, int i_timeout, return 0; } -/*! - Get disc type associated with cd object. -*/ -static discmode_t -get_dvd_struct_physical (_img_private_t *p_env, cdio_dvd_struct_t *s) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned char buf[20], *base; - int i_status; - uint8_t layer_num = s->physical.layer_num; - - cdio_dvd_layer_t *layer; - - if (layer_num >= CDIO_DVD_MAX_LAYERS) - return -EINVAL; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_DVD_STRUCTURE); - cdb.field[6] = layer_num; - cdb.field[7] = CDIO_DVD_STRUCT_PHYSICAL; - cdb.field[9] = sizeof(buf) & 0xff; - - i_status = scsi_mmc_run_cmd_win32ioctl(p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - if (0 != i_status) - return CDIO_DISC_MODE_ERROR; - - base = &buf[4]; - layer = &s->physical.layer[layer_num]; - - /* - * place the data... really ugly, but at least we won't have to - * worry about endianess in userspace. - */ - memset(layer, 0, sizeof(*layer)); - layer->book_version = base[0] & 0xf; - layer->book_type = base[0] >> 4; - layer->min_rate = base[1] & 0xf; - layer->disc_size = base[1] >> 4; - layer->layer_type = base[2] & 0xf; - layer->track_path = (base[2] >> 4) & 1; - layer->nlayers = (base[2] >> 5) & 3; - layer->track_density = base[3] & 0xf; - layer->linear_density = base[3] >> 4; - layer->start_sector = base[5] << 16 | base[6] << 8 | base[7]; - layer->end_sector = base[9] << 16 | base[10] << 8 | base[11]; - layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15]; - layer->bca = base[16] >> 7; - - return 0; -} - /*! Get disc type associated with cd object. */ @@ -258,7 +204,9 @@ get_discmode_win32ioctl (_img_private_t *p_env) dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; dvd.physical.layer_num = 0; - if (0 == get_dvd_struct_physical (p_env, &dvd)) { + if (0 == get_dvd_struct_physical_mmc (p_env, + &scsi_mmc_run_cmd_win32ioctl, + &dvd)) { switch(dvd.physical.layer[0].book_type) { case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 3e363c98..716073d0 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.81 2004/07/26 02:54:37 rocky Exp $ + $Id: _cdio_linux.c,v 1.82 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.81 2004/07/26 02:54:37 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.82 2004/07/26 03:58:25 rocky Exp $"; #include @@ -36,7 +36,6 @@ static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.81 2004/07/26 02:54:37 rock #include #include #include -#include #include "cdtext_private.h" #include "cdio_assert.h" #include "cdio_private.h" diff --git a/lib/scsi_mmc.c b/lib/scsi_mmc.c index f8ad39a4..e19a68c8 100644 --- a/lib/scsi_mmc.c +++ b/lib/scsi_mmc.c @@ -1,6 +1,6 @@ /* Common SCSI Multimedia Command (MMC) routines. - $Id: scsi_mmc.c,v 1.9 2004/07/26 03:39:55 rocky Exp $ + $Id: scsi_mmc.c,v 1.10 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -31,6 +31,10 @@ #include #endif +#ifdef HAVE_ERRNO_H +#include +#endif + /*! On input a MODE_SENSE command was issued and we have the results in p. We interpret this and return a bit mask set according to the @@ -227,3 +231,75 @@ scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize) if ( ! cdio ) return -2; return set_bsize_mmc (cdio->env, (&cdio->op.run_scsi_mmc_cmd), bsize); } + +/*! + Get the DVD type associated with cd object. +*/ +discmode_t +get_dvd_struct_physical_mmc ( void *p_env, + const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd, + cdio_dvd_struct_t *s) +{ + scsi_mmc_cdb_t cdb = {{0, }}; + unsigned char buf[20], *base; + int i_status; + uint8_t layer_num = s->physical.layer_num; + + cdio_dvd_layer_t *layer; + + if ( ! p_env || ! run_scsi_mmc_cmd ) + return -2; + + if (layer_num >= CDIO_DVD_MAX_LAYERS) + return -EINVAL; + + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_DVD_STRUCTURE); + cdb.field[6] = layer_num; + cdb.field[7] = CDIO_DVD_STRUCT_PHYSICAL; + cdb.field[9] = sizeof(buf) & 0xff; + + i_status = (*run_scsi_mmc_cmd)(p_env, DEFAULT_TIMEOUT_MS, + scsi_mmc_get_cmd_len(cdb.field[0]), + &cdb, SCSI_MMC_DATA_READ, + sizeof(buf), &buf); + if (0 != i_status) + return CDIO_DISC_MODE_ERROR; + + base = &buf[4]; + layer = &s->physical.layer[layer_num]; + + /* + * place the data... really ugly, but at least we won't have to + * worry about endianess in userspace. + */ + memset(layer, 0, sizeof(*layer)); + layer->book_version = base[0] & 0xf; + layer->book_type = base[0] >> 4; + layer->min_rate = base[1] & 0xf; + layer->disc_size = base[1] >> 4; + layer->layer_type = base[2] & 0xf; + layer->track_path = (base[2] >> 4) & 1; + layer->nlayers = (base[2] >> 5) & 3; + layer->track_density = base[3] & 0xf; + layer->linear_density = base[3] >> 4; + layer->start_sector = base[5] << 16 | base[6] << 8 | base[7]; + layer->end_sector = base[9] << 16 | base[10] << 8 | base[11]; + layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15]; + layer->bca = base[16] >> 7; + + return 0; +} + + +/*! + Get the DVD type associated with cd object. +*/ +discmode_t +scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s) +{ + if ( ! p_cdio ) return -2; + return get_dvd_struct_physical_mmc (p_cdio->env, + (&p_cdio->op.run_scsi_mmc_cmd), + s); +} + diff --git a/lib/scsi_mmc_private.h b/lib/scsi_mmc_private.h index dcf2ec6d..9ad63fc7 100644 --- a/lib/scsi_mmc_private.h +++ b/lib/scsi_mmc_private.h @@ -1,6 +1,6 @@ /* private MMC helper routines. - $Id: scsi_mmc_private.h,v 1.2 2004/07/26 03:39:55 rocky Exp $ + $Id: scsi_mmc_private.h,v 1.3 2004/07/26 03:58:25 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -30,4 +30,14 @@ int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, int i_timeout, int set_bsize_mmc ( const void *p_env, const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd, - unsigned int bsize); + unsigned int bsize ); + +/*! + Get the DVD type associated with cd object. +*/ +discmode_t +get_dvd_struct_physical_mmc ( void *p_env, + const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd, + cdio_dvd_struct_t *s ); + +