From 2b67971152cf32aea81f1bde05fd2142734ec49d Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 27 Jul 2004 01:36:37 +0000 Subject: [PATCH] Compilation fixes. Added get_discmode. --- lib/_cdio_sunos.c | 141 ++++++++++++++++++++++++++++++++++++-------- test/vcd_demo.right | 1 + 2 files changed, 119 insertions(+), 23 deletions(-) diff --git a/lib/_cdio_sunos.c b/lib/_cdio_sunos.c index 76dbffdf..2c40ba36 100644 --- a/lib/_cdio_sunos.c +++ b/lib/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.62 2004/07/27 01:06:02 rocky Exp $ + $Id: _cdio_sunos.c,v 1.63 2004/07/27 01:36:37 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -38,7 +38,7 @@ #ifdef HAVE_SOLARIS_CDROM -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.62 2004/07/27 01:06:02 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.63 2004/07/27 01:36:37 rocky Exp $"; #ifdef HAVE_GLOB_H #include @@ -103,6 +103,9 @@ typedef struct { struct cdrom_tochdr tochdr; } _img_private_t; +static track_format_t get_track_format_solaris(void *p_user_data, + track_t i_track); + static access_mode_t str_to_access_mode_sunos(const char *psz_access_mode) { @@ -408,12 +411,12 @@ _set_arg_solaris (void *p_user_data, const char key[], const char value[]) Return true if successful or false if an error. */ static bool -_cdio_read_toc (_img_private_t *env) +read_toc_solaris (_img_private_t *p_env) { int i; /* read TOC header */ - if ( ioctl(env->gen.fd, CDROMREADTOCHDR, &env->tochdr) == -1 ) { + if ( ioctl(p_env->gen.fd, CDROMREADTOCHDR, &p_env->tochdr) == -1 ) { cdio_warn("%s: %s\n", "error in ioctl CDROMREADTOCHDR", strerror(errno)); return false; @@ -422,10 +425,10 @@ _cdio_read_toc (_img_private_t *env) p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; /* read individual tracks */ - for (i=env->tochdr.cdth_trk0; i<=env->tochdr.cdth_trk1; i++) { - env->tocent[i-1].cdte_track = i; - env->tocent[i-1].cdte_format = CDIO_CDROM_MSF; - if ( ioctl(env->gen.fd, CDROMREADTOCENTRY, &env->tocent[i-1]) == -1 ) { + for (i=p_env->tochdr.cdth_trk0; i<=p_env->tochdr.cdth_trk1; i++) { + p_env->tocent[i-1].cdte_track = i; + p_env->tocent[i-1].cdte_format = CDIO_CDROM_MSF; + if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1 ) { cdio_warn("%s %d: %s\n", "error in ioctl CDROMREADTOCENTRY for track", i, strerror(errno)); @@ -434,18 +437,18 @@ _cdio_read_toc (_img_private_t *env) } /* read the lead-out track */ - env->tocent[env->tochdr.cdth_trk1].cdte_track = CDIO_CDROM_LEADOUT_TRACK; - env->tocent[env->tochdr.cdth_trk1].cdte_format = CDIO_CDROM_MSF; + p_env->tocent[p_env->tochdr.cdth_trk1].cdte_track = CDIO_CDROM_LEADOUT_TRACK; + p_env->tocent[p_env->tochdr.cdth_trk1].cdte_format = CDIO_CDROM_MSF; - if (ioctl(env->gen.fd, CDROMREADTOCENTRY, - &env->tocent[env->tochdr.cdth_trk1]) == -1 ) { + if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, + &p_env->tocent[p_env->tochdr.cdth_trk1]) == -1 ) { cdio_warn("%s: %s\n", "error in ioctl CDROMREADTOCENTRY for lead-out", strerror(errno)); return false; } - env->gen.toc_init = true; + p_env->gen.toc_init = true; return true; } @@ -455,13 +458,13 @@ set_cdtext_field_solaris(void *p_user_data, track_t i_track, cdtext_field_t e_field, const char *psz_value) { char **pp_field; - _img_private_t *env = p_user_data; + _img_private_t *p_env = p_user_data; if( i_track == 0 ) - pp_field = &(env->cdtext.field[e_field]); + pp_field = &(p_env->cdtext.field[e_field]); else - pp_field = &(env->cdtext_track[i_track-i_first_track].field[e_field]); + pp_field = &(p_env->cdtext_track[i_track-i_first_track].field[e_field]); *pp_field = strdup(psz_value); } @@ -604,6 +607,97 @@ cdio_get_default_device_solaris(void) return strdup(DEFAULT_CDIO_DEVICE); } +/*! + Get disc type associated with cd object. +*/ +static discmode_t +get_discmode_solaris (void *p_user_data) +{ + _img_private_t *p_env = p_user_data; + track_t i_track; + discmode_t discmode=CDIO_DISC_MODE_NO_INFO; + + /* See if this is a DVD. */ + cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */ + + dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; + dvd.physical.layer_num = 0; + if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, + &scsi_mmc_run_cmd_solaris, + &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; + case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; + case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; + case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; + default: return CDIO_DISC_MODE_DVD_OTHER; + } + } + + if (!p_env->gen.toc_init) + read_toc_solaris (p_env); + + if (!p_env->gen.toc_init) + return CDIO_DISC_MODE_NO_INFO; + + for (i_track = p_env->gen.i_first_track; + i_track < p_env->gen.i_first_track + TOTAL_TRACKS ; + i_track ++) { + track_format_t track_fmt=get_track_format_solaris(p_env, i_track); + + switch(track_fmt) { + case TRACK_FORMAT_AUDIO: + switch(discmode) { + case CDIO_DISC_MODE_NO_INFO: + discmode = CDIO_DISC_MODE_CD_DA; + break; + case CDIO_DISC_MODE_CD_DA: + case CDIO_DISC_MODE_CD_MIXED: + case CDIO_DISC_MODE_ERROR: + /* No change*/ + break; + default: + discmode = CDIO_DISC_MODE_CD_MIXED; + } + break; + case TRACK_FORMAT_XA: + switch(discmode) { + case CDIO_DISC_MODE_NO_INFO: + discmode = CDIO_DISC_MODE_CD_XA; + break; + case CDIO_DISC_MODE_CD_XA: + case CDIO_DISC_MODE_CD_MIXED: + case CDIO_DISC_MODE_ERROR: + /* No change*/ + break; + default: + discmode = CDIO_DISC_MODE_CD_MIXED; + } + break; + case TRACK_FORMAT_DATA: + switch(discmode) { + case CDIO_DISC_MODE_NO_INFO: + discmode = CDIO_DISC_MODE_CD_DATA; + break; + case CDIO_DISC_MODE_CD_DATA: + case CDIO_DISC_MODE_CD_MIXED: + case CDIO_DISC_MODE_ERROR: + /* No change*/ + break; + default: + discmode = CDIO_DISC_MODE_CD_MIXED; + } + break; + case TRACK_FORMAT_ERROR: + default: + discmode = CDIO_DISC_MODE_ERROR; + } + } + return discmode; +} + /*! Return the the kind of drive capabilities of device. @@ -697,7 +791,7 @@ _cdio_get_first_track_num(void *p_user_data) { _img_private_t *p_env = p_user_data; - if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; + if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; return p_env->gen.i_first_track; } @@ -718,7 +812,7 @@ _cdio_get_num_tracks(void *p_user_data) Get format of track. */ static track_format_t -_cdio_get_track_format(void *p_user_data, track_t i_track) +get_track_format_solaris(void *p_user_data, track_t i_track) { _img_private_t *p_env = p_user_data; @@ -757,7 +851,7 @@ _cdio_get_track_green(void *p_user_data, track_t i_track) _img_private_t *p_env = p_user_data; if (!p_env->gen.init) init_solaris(p_env); - if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; + if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; if (i_track >= TOTAL_TRACKS+p_env->gen.i_first_track || i_track < p_env->gen.i_first_track) @@ -788,7 +882,7 @@ _cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf) if (NULL == msf) return false; if (!p_env->gen.init) init_solaris(p_env); - if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; + if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS + p_env->gen.i_first_track; @@ -875,13 +969,14 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) .free = cdio_generic_free, .get_arg = _get_arg_solaris, .get_cdtext = _get_cdtext_solaris, - .get_devices = cdio_get_devices_solaris, .get_default_device = cdio_get_default_device_solaris, + .get_devices = cdio_get_devices_solaris, + .get_discmode = get_discmode_solaris, .get_drive_cap = _get_drive_cap_solaris, .get_first_track_num= _cdio_get_first_track_num, .get_mcn = _get_mcn_solaris, .get_num_tracks = _cdio_get_num_tracks, - .get_track_format = _cdio_get_track_format, + .get_track_format = get_track_format_solaris, .get_track_green = _cdio_get_track_green, .get_track_lba = NULL, /* This could be implemented if need be. */ .get_track_msf = _cdio_get_track_msf, @@ -922,7 +1017,7 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) } } - ret = cdio_new (_data, &_funcs); + ret = cdio_new ( (void *) _data, &_funcs ); if (ret == NULL) return NULL; if (init_solaris(_data)) diff --git a/test/vcd_demo.right b/test/vcd_demo.right index 718c7664..c179df3f 100644 --- a/test/vcd_demo.right +++ b/test/vcd_demo.right @@ -23,6 +23,7 @@ Writing.... Can write DVD-R : No Can write DVD-RAM : No __________________________________ + CD-ROM Track List (1 - 3) #: MSF LSN Type Green? 1: 00:02:00 000000 XA true