Add get_discmode to return what kind of CD or DVD we've got. This is

no where near finished. In fact I just started it on GNU/Linux.

CD-TEXT on GNU/Linux: turn "warning" into "info". Reduce the chance of
error (although we still don't get the CD-TEXT.)
This commit is contained in:
rocky
2004-07-21 10:19:20 +00:00
parent 91f78d58f9
commit 02872bfb2f
7 changed files with 194 additions and 109 deletions

View File

@@ -1,5 +1,5 @@
/*
$Id: sample8.c,v 1.4 2004/07/17 02:18:26 rocky Exp $
$Id: sample8.c,v 1.5 2004/07/21 10:19:20 rocky Exp $
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -30,8 +30,7 @@
static void
print_cdtext_track_info(CdIo *cdio, track_t i_track, const char *message) {
const cdtext_t *cdtext = cdio_get_cdtext(cdio, 0);
const cdtext_t *cdtext = cdio_get_cdtext(cdio, 0);
if (NULL != cdtext) {
cdtext_field_t i;
@@ -43,11 +42,31 @@ print_cdtext_track_info(CdIo *cdio, track_t i_track, const char *message) {
}
}
}
}
static void
print_cdtext_info(CdIo *cdio, track_t i_tracks, track_t i_first_track) {
track_t i_last_track = i_first_track+i_tracks;
cd_disctype_t cd_disctype = cdio_get_disctype(cdio);
switch (cd_disctype) {
case CDIO_DISC_TYPE_CD:
printf("Disc is CD-DA or CD-ROM.\n");
break;
case CDIO_DISC_TYPE_CD_I:
printf("Disc is CD-i.\n");
break;
case CDIO_DISC_TYPE_XA:
printf("Disc is CD-XA or DDCD.\n");
break;
case CDIO_DISC_TYPE_UNDEF:
printf("Not a CD - perhaps a DVD.\n");
break;
case CDIO_DISC_TYPE_ERROR:
printf("Error getting CD info or request not supported by drive.\n");
break;
}
print_cdtext_track_info(cdio, 0, "\nCD-TEXT for Disc:");
for ( ; i_first_track < i_last_track; i_first_track++ ) {
@@ -60,20 +79,20 @@ print_cdtext_info(CdIo *cdio, track_t i_tracks, track_t i_first_track) {
int
main(int argc, const char *argv[])
{
track_t i_first_track;
track_t i_tracks;
CdIo *cdio = cdio_open ("../test/cdda.cue", DRIVER_BINCUE);
track_t i_first_track = cdio_get_first_track_num(cdio);
track_t i_tracks = cdio_get_num_tracks(cdio);
if (NULL == cdio) {
printf("Couldn't open ../test/cdda.cue with BIN/CUE driver \n");
return 1;
printf("Couldn't open ../test/cdda.cue with BIN/CUE driver.\n");
} else {
i_first_track = cdio_get_first_track_num(cdio);
i_tracks = cdio_get_num_tracks(cdio);
print_cdtext_info(cdio, i_tracks, i_first_track);
cdio_destroy(cdio);
}
cdio_destroy(cdio);
cdio = cdio_open (NULL, DRIVER_UNKNOWN);
i_first_track = cdio_get_first_track_num(cdio);
i_tracks = cdio_get_num_tracks(cdio);

View File

@@ -1,5 +1,5 @@
/* -*- c -*-
$Id: cdio.h,v 1.58 2004/07/17 22:16:46 rocky Exp $
$Id: cdio.h,v 1.59 2004/07/21 10:19:20 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -118,19 +118,19 @@ extern "C" {
/*!
Eject media in CD drive if there is a routine to do so.
@param obj the CD object to be acted upon.
@param cd_obj the CD object to be acted upon.
@return 0 if success and 1 for failure, and 2 if no routine.
If the CD is ejected *obj is freed and obj set to NULL.
If the CD is ejected *cd_obj is freed and cd_obj set to NULL.
*/
int cdio_eject_media (CdIo **obj);
int cdio_eject_media (CdIo **cd_obj);
/*!
Free any resources associated with obj. Call this when done using obj
Free any resources associated with cd_obj. Call this when done using cd_obj
and using CD reading/control operations.
@param obj the CD object to eliminated.
@param cd_obj the CD object to eliminated.
*/
void cdio_destroy (CdIo *obj);
void cdio_destroy (CdIo *cd_obj);
/*!
Free device list returned by cdio_get_devices or
@@ -147,24 +147,24 @@ extern "C" {
/*!
Get the value associatied with key.
@param obj the CD object queried
@param cd_obj the CD object queried
@param key the key to retrieve
@return the value associatd with "key" or NULL if obj is NULL
@return the value associatd with "key" or NULL if cd_obj is NULL
or "key" does not exist.
*/
const char * cdio_get_arg (const CdIo *obj, const char key[]);
const char * cdio_get_arg (const CdIo *cd_obj, const char key[]);
/*!
Get cdtext information for a CdIo object.
@param obj the CD object that may contain CD-TEXT information.
@param cd_obj the CD object that may contain CD-TEXT information.
@return the CD-TEXT object or NULL if obj is NULL
or CD-TEXT information does not exist.
If i_track is 0 or CDIO_CDROM_LEADOUT_TRACK the track returned
is the information assocated with the CD.
*/
const cdtext_t *cdio_get_cdtext (CdIo *obj, track_t i_track);
const cdtext_t *cdio_get_cdtext (CdIo *cd_obj, track_t i_track);
/*!
Get an array of device names in search_devices that have at
@@ -201,10 +201,10 @@ extern "C" {
/*!
Get the default CD device.
if obj is NULL (we haven't initialized a specific device driver),
if cd_obj is NULL (we haven't initialized a specific device driver),
then find a suitable one and return the default device for that.
@param obj the CD object queried
@param cd_obj the CD object queried
@return a string containing the default CD device or NULL is
if we couldn't get a default device.
@@ -212,19 +212,19 @@ extern "C" {
there is no media in it and it is possible for this routine to return
NULL even though there may be a hardware CD-ROM.
*/
char * cdio_get_default_device (const CdIo *obj);
char * cdio_get_default_device (const CdIo *cd_obj);
/*!
Get the what kind of device we've got.
@param obj the CD object queried
@param cd_obj the CD object queried
@return a list of device capabilities.
In some situations of drivers or OS's we can't find a CD device if
there is no media in it and it is possible for this routine to return
NULL even though there may be a hardware CD-ROM.
*/
void cdio_get_drive_cap (const CdIo *obj,
void cdio_get_drive_cap (const CdIo *cd_obj,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap);
@@ -253,7 +253,7 @@ extern "C" {
string when done with it.
*/
char * cdio_get_mcn (const CdIo *obj);
char * cdio_get_mcn (const CdIo *cd_obj);
/*!
Get a string containing the name of the driver in use.
@@ -261,7 +261,7 @@ extern "C" {
@return a string with driver name or NULL if CdIo is NULL (we
haven't initialized a specific device.
*/
const char * cdio_get_driver_name (const CdIo *obj);
const char * cdio_get_driver_name (const CdIo *cd_obj);
/*!
Get the driver id.
@@ -270,7 +270,7 @@ extern "C" {
@return the driver id..
*/
driver_id_t cdio_get_driver_id (const CdIo *obj);
driver_id_t cdio_get_driver_id (const CdIo *cd_obj);
/*!
Get the number of the first track.
@@ -278,7 +278,14 @@ extern "C" {
@return the track number or CDIO_INVALID_TRACK
on error.
*/
track_t cdio_get_first_track_num(const CdIo *obj);
track_t cdio_get_first_track_num(const CdIo *cd_obj);
/*!
Get disc mode - the kind of CD (CD-DA, CD-ROM mode 1, CD-MIXED, etc.
that we've got. The notion of "CD" is extended a little to include
DVD's.
*/
discmode_t cdio_get_discmode (CdIo *cd_obj);
/*!
Get the number of tracks on the CD.
@@ -286,12 +293,12 @@ extern "C" {
@return the number of tracks, or CDIO_INVALID_TRACK if there is
an error.
*/
track_t cdio_get_num_tracks (const CdIo *obj);
track_t cdio_get_num_tracks (const CdIo *cd_obj);
/*!
Get the format (audio, mode2, mode1) of track.
*/
track_format_t cdio_get_track_format(const CdIo *obj, track_t i_track);
track_format_t cdio_get_track_format(const CdIo *cd_obj, track_t i_track);
/*!
Return true if we have XA data (green, mode2 form1) or
@@ -301,25 +308,25 @@ extern "C" {
FIXME: there's gotta be a better design for this and get_track_format?
*/
bool cdio_get_track_green(const CdIo *obj, track_t i_track);
bool cdio_get_track_green(const CdIo *cd_obj, track_t i_track);
/*!
Get the starting LBA for track number
i_track in obj. Track numbers usually start at something
i_track in cd_obj. Track numbers usually start at something
greater than 0, usually 1.
The "leadout" track is specified either by
using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1.
@param obj object to get information from
@param cd_obj object to get information from
@param i_track the track number we want the LSN for
@return the starting LBA or CDIO_INVALID_LBA on error.
*/
lba_t cdio_get_track_lba(const CdIo *obj, track_t i_track);
lba_t cdio_get_track_lba(const CdIo *cd_obj, track_t i_track);
/*!
Return the starting MSF (minutes/secs/frames) for track number
i_track in obj. Track numbers usually start at something
i_track in cd_obj. Track numbers usually start at something
greater than 0, usually 1.
The "leadout" track is specified either by
@@ -329,11 +336,11 @@ extern "C" {
@param i_track the track number we want the LSN for
@return the starting LSN or CDIO_INVALID_LSN on error.
*/
lsn_t cdio_get_track_lsn(const CdIo *obj, track_t i_track);
lsn_t cdio_get_track_lsn(const CdIo *cd_obj, track_t i_track);
/*!
Return the starting MSF (minutes/secs/frames) for track number
i_track in obj. Track numbers usually start at something
i_track in cd_obj. Track numbers usually start at something
greater than 0, usually 1.
The "leadout" track is specified either by
@@ -341,7 +348,7 @@ extern "C" {
@return true if things worked or false if there is no track entry.
*/
bool cdio_get_track_msf(const CdIo *obj, track_t i_track,
bool cdio_get_track_msf(const CdIo *cd_obj, track_t i_track,
/*out*/ msf_t *msf);
/*!
@@ -352,19 +359,19 @@ extern "C" {
@return the number of sectors or 0 if there is an error.
*/
unsigned int cdio_get_track_sec_count(const CdIo *obj, track_t i_track);
unsigned int cdio_get_track_sec_count(const CdIo *cd_obj, track_t i_track);
/*!
Reposition read offset
Similar to (if not the same as) libc's lseek()
@param obj object to get information from
@param cd_obj object to get information from
@param offset amount to seek
@param whence like corresponding parameter in libc's lseek, e.g.
SEEK_SET or SEEK_END.
@return (off_t) -1 on error.
*/
off_t cdio_lseek(const CdIo *obj, off_t offset, int whence);
off_t cdio_lseek(const CdIo *cd_obj, off_t offset, int whence);
/*!
Reads into buf the next size bytes.
@@ -372,36 +379,36 @@ extern "C" {
@return (ssize_t) -1 on error.
*/
ssize_t cdio_read(const CdIo *obj, void *buf, size_t size);
ssize_t cdio_read(const CdIo *cd_obj, void *buf, size_t size);
/*!
Read an audio sector
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_audio_sector (const CdIo *obj, void *buf, lsn_t lsn);
int cdio_read_audio_sector (const CdIo *cd_obj, void *buf, lsn_t lsn);
/*!
Reads audio sectors
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@param i_sectors number of sectors to read
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_audio_sectors (const CdIo *obj, void *buf, lsn_t lsn,
int cdio_read_audio_sectors (const CdIo *cd_obj, void *buf, lsn_t lsn,
unsigned int i_sectors);
/*!
Reads a mode1 sector
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@param b_form2 true for reading mode1 form2 sectors or false for
@@ -409,13 +416,13 @@ extern "C" {
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_mode1_sector (const CdIo *obj, void *buf, lsn_t lsn,
int cdio_read_mode1_sector (const CdIo *cd_obj, void *buf, lsn_t lsn,
bool b_form2);
/*!
Reads mode1 sectors
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@param b_form2 true for reading mode1 form2 sectors or false for
@@ -424,13 +431,13 @@ extern "C" {
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_mode1_sectors (const CdIo *obj, void *buf, lsn_t lsn,
int cdio_read_mode1_sectors (const CdIo *cd_obj, void *buf, lsn_t lsn,
bool b_form2, unsigned int i_sectors);
/*!
Reads a mode1 sector
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@param b_form2 true for reading mode1 form2 sectors or false for
@@ -438,13 +445,13 @@ extern "C" {
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_mode2_sector (const CdIo *obj, void *buf, lsn_t lsn,
int cdio_read_mode2_sector (const CdIo *cd_obj, void *buf, lsn_t lsn,
bool b_form2);
/*!
Reads mode2 sectors
@param obj object to read from
@param cd_obj object to read from
@param buf place to read data into
@param lsn sector to read
@param b_form2 true for reading mode1 form2 sectors or false for
@@ -453,26 +460,26 @@ extern "C" {
@return 0 if no error, nonzero otherwise.
*/
int cdio_read_mode2_sectors (const CdIo *obj, void *buf, lsn_t lsn,
int cdio_read_mode2_sectors (const CdIo *cd_obj, void *buf, lsn_t lsn,
bool b_form2, unsigned int i_sectors);
/*!
Set the arg "key" with "value" in "obj".
@param obj the CD object to set
@param cd_obj the CD object to set
@param key the key to set
@param value the value to assocaiate with key
@return 0 if no error was found, and nonzero otherwise.
*/
int cdio_set_arg (CdIo *obj, const char key[], const char value[]);
int cdio_set_arg (CdIo *cd_obj, const char key[], const char value[]);
/*!
Get the size of the CD in logical block address (LBA) units.
@param obj the CD object queried
@param cd_obj the CD object queried
@return the size
*/
uint32_t cdio_stat_size (const CdIo *obj);
uint32_t cdio_stat_size (const CdIo *cd_obj);
/*!
Initialize CD Reading and control routines. Should be called first.
@@ -604,7 +611,7 @@ extern "C" {
CdIo * cdio_open_am_cd (const char *psz_device,
const char *psz_access_mode);
/*! CDRWIN BIN/CUE CD disk-image routines. Source is the .cue file
/*! CDRWIN BIN/CUE CD disc-image routines. Source is the .cue file
@return the cdio object for subsequent operations.
NULL on error.

View File

@@ -1,5 +1,5 @@
/*
$Id: scsi_mmc.h,v 1.9 2004/07/19 01:13:31 rocky Exp $
$Id: scsi_mmc.h,v 1.10 2004/07/21 10:19:20 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -26,6 +26,23 @@
#ifndef __SCSI_MMC_H__
#define __SCSI_MMC_H__
/*! The generic packet command opcodes for CD/DVD Logical Units. */
#define CDIO_MMC_GPCMD_MODE_SENSE 0x1a
#define CDIO_MMC_GPCMD_START_STOP 0x1b
#define CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL 0x1e
#define CDIO_MMC_GPCMD_READ_10 0x28
#define CDIO_MMC_GPCMD_READ_SUBCHANNEL 0x42
#define CDIO_MMC_GPCMD_READ_TOC 0x43
#define CDIO_MMC_GPCMD_READ_DISC_INFO 0x51
#define CDIO_MMC_GPCMD_MODE_SELECT 0x55
#define CDIO_MMC_GPCMD_MODE_SELECT_6 0x15
#define CDIO_MMC_GPCMD_MODE_SENSE_10 0x5a
#define CDIO_MMC_GPCMD_READ_12 0xa8
#define CDIO_MMC_GPCMD_READ_CD 0xbe
#define CDIO_MMC_GPCMD_READ_MSF 0xb9
/*! Level values that can go into READ_CD */
#define CDIO_MMC_READ_TYPE_ANY 0 /**< All types */
#define CDIO_MMC_READ_TYPE_CDDA 1 /**< Only CD-DA sectors */
@@ -42,22 +59,6 @@
#define CDIO_MMC_READTOC_FMT_ATIP 4 /**< includes media type */
#define CDIO_MMC_READTOC_FMT_CDTEXT 5 /**< CD-TEXT info */
/*! The generic packet command opcodes for CD/DVD Logical Units. */
#define CDIO_MMC_GPCMD_MODE_SENSE 0x1a
#define CDIO_MMC_GPCMD_START_STOP 0x1b
#define CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL 0x1e
#define CDIO_MMC_GPCMD_READ_10 0x28
#define CDIO_MMC_GPCMD_READ_SUBCHANNEL 0x42
#define CDIO_MMC_GPCMD_READ_TOC 0x43
#define CDIO_MMC_GPCMD_MODE_SELECT 0x55
#define CDIO_MMC_GPCMD_MODE_SELECT_6 0x15
#define CDIO_MMC_GPCMD_MODE_SENSE_10 0x5a
#define CDIO_MMC_GPCMD_READ_12 0xa8
#define CDIO_MMC_GPCMD_READ_CD 0xbe
#define CDIO_MMC_GPCMD_READ_MSF 0xb9
/*! Page codes for MODE SENSE and MODE SET. */
#define CDIO_MMC_R_W_ERROR_PAGE 0x01
#define CDIO_MMC_WRITE_PARMS_PAGE 0x05

View File

@@ -1,5 +1,5 @@
/*
$Id: sector.h,v 1.18 2004/07/17 15:31:00 rocky Exp $
$Id: sector.h,v 1.19 2004/07/21 10:19:21 rocky Exp $
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -81,11 +81,19 @@ typedef enum {
MODE2_RAW /**< 2352 byte block length */
} trackmode_t;
/*! disc modes (5.29.2.8) */
/*! disc modes. The first combined from MMC-3 5.29.2.8 and
GNU/Linux /usr/include/linux/cdrom.h and we've added DVD.
*/
typedef enum {
CDIO_DISC_MODE_CD_DA, /* CD-DA */
CDIO_DISC_MODE_CD_ROM, /* CD-ROM mode 1 */
CDIO_DISC_MODE_CD_ROM_XA /* CD-ROM XA and CD-I */
CDIO_DISC_MODE_CD_DA, /**< CD-DA */
CDIO_DISC_MODE_CD_DATA_1, /**< CD-ROM mode 1 */
CDIO_DISC_MODE_CD_DATA_2, /**< CD-ROM mode 2 */
CDIO_DISC_MODE_CD_XA_2_1, /**< CD-ROM mode 1 */
CDIO_DISC_MODE_CD_XA_2_2, /**< CD-ROM mode 2 */
CDIO_DISC_MODE_CD_MIXED, /**< CD-ROM XA and CD-I */
CDIO_DISC_MODE_DVD, /**< some sort of DVD */
CDIO_DISC_MODE_NO_INFO,
CDIO_DISC_MODE_ERROR
} discmode_t;
/*! Information that can be obtained through a Read Subchannel

View File

@@ -1,5 +1,5 @@
/*
$Id: _cdio_linux.c,v 1.70 2004/07/19 01:13:31 rocky Exp $
$Id: _cdio_linux.c,v 1.71 2004/07/21 10:19:21 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h"
#endif
static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.70 2004/07/19 01:13:31 rocky Exp $";
static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.71 2004/07/21 10:19:21 rocky Exp $";
#include <string.h>
@@ -155,6 +155,40 @@ cdio_is_cdrom(char *drive, char *mnttype)
return(is_cd);
}
/*!
Get disc tyhpe associated with cd_obj.
*/
static discmode_t
_get_discmode_linux (void *user_data)
{
_img_private_t *env = user_data;
int32_t i_discmode;
i_discmode = ioctl (env->gen.fd, CDROM_DISC_STATUS);
if (i_discmode < 0) return CDIO_DISC_MODE_ERROR;
/* FIXME Need to add getting DVD types. */
switch(i_discmode) {
case CDS_AUDIO:
return CDIO_DISC_MODE_CD_DA;
case CDS_DATA_1:
return CDIO_DISC_MODE_CD_DATA_1;
case CDS_DATA_2:
return CDIO_DISC_MODE_CD_DATA_2;
case CDS_MIXED:
return CDIO_DISC_MODE_CD_MIXED;
case CDS_XA_2_1:
return CDIO_DISC_MODE_CD_XA_2_1;
case CDS_XA_2_2:
return CDIO_DISC_MODE_CD_XA_2_2;
case CDS_NO_INFO:
return CDIO_DISC_MODE_NO_INFO;
default:
return CDIO_DISC_MODE_ERROR;
}
}
static char *
cdio_check_mounts(const char *mtab)
{
@@ -708,35 +742,32 @@ static bool
_init_cdtext_linux (_img_private_t *env)
{
struct cdrom_generic_command cdc;
struct request_sense sense;
unsigned char wdata[2000]= {0, }; /* Data read from device starts here */
int status;
struct scsi_cmd {
unsigned int inlen; /* Length of data written to device */
unsigned int outlen; /* Length of data read from device */
unsigned char cdb[10]; /* SCSI command bytes (6 <= x <= 16) */
unsigned char wdata[5000]; /* Data read from device starts here
On error, sense buffer starts here */
} scsi_cmd;
memset( scsi_cmd.cdb, 0, sizeof(scsi_cmd.cdb) );
memset(&cdc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(struct request_sense));
/* Operation code */
CDIO_MMC_SET_COMMAND(scsi_cmd.cdb, CDIO_MMC_GPCMD_READ_TOC);
scsi_cmd.cdb[1] = 0x02; /* MSF mode */
CDIO_MMC_SET_COMMAND(cdc.cmd, CDIO_MMC_GPCMD_READ_TOC);
/* Format */
scsi_cmd.cdb[2] = CDIO_MMC_READTOC_FMT_CDTEXT;
cdc.cmd[2] = CDIO_MMC_READTOC_FMT_CDTEXT;
CDIO_MMC_SET_READ_LENGTH(scsi_cmd.cdb, sizeof(scsi_cmd.wdata));
cdc.buffer = wdata;
cdc.buflen = sizeof(wdata);
cdc.stat = 0;
cdc.sense = &sense;
cdc.data_direction = CGC_DATA_READ;
scsi_cmd.inlen = sizeof(scsi_cmd.cdb);
scsi_cmd.outlen = sizeof(scsi_cmd.wdata);
status = ioctl(env->gen.fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd);
if (status != 0) {
cdio_warn ("CDTEXT reading failed: %s\n", strerror(errno));
status = ioctl(env->gen.fd, CDROM_SEND_PACKET, (void *)&cdc);
if (status < 0) {
cdio_info ("CDTEXT reading failed\n");
return false;
} else {
return cdtext_data_init(env, FIRST_TRACK_NUM, scsi_cmd.wdata,
return cdtext_data_init(env, FIRST_TRACK_NUM, wdata,
set_cdtext_field_linux);
}
}
@@ -1250,6 +1281,7 @@ cdio_open_am_linux (const char *psz_orig_source, const char *access_mode)
.get_cdtext = _get_cdtext_linux,
.get_devices = cdio_get_devices_linux,
.get_default_device = cdio_get_default_device_linux,
.get_discmode = _get_discmode_linux,
.get_drive_cap = _get_drive_cap_linux,
.get_first_track_num= _get_first_track_num_linux,
.get_mcn = _get_mcn_linux,
@@ -1286,9 +1318,7 @@ cdio_open_am_linux (const char *psz_orig_source, const char *access_mode)
_set_arg_linux(_data, "source", psz_orig_source);
else {
/* The below would be okay if all device drivers worked this way. */
#if 0
cdio_info ("source %s is a not a device", psz_orig_source);
#endif
return NULL;
}
}

View File

@@ -1,5 +1,5 @@
/*
$Id: cdio.c,v 1.63 2004/07/18 05:12:03 rocky Exp $
$Id: cdio.c,v 1.64 2004/07/21 10:19:21 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -39,7 +39,7 @@
#include <cdio/logging.h>
#include "cdio_private.h"
static const char _rcsid[] = "$Id: cdio.c,v 1.63 2004/07/18 05:12:03 rocky Exp $";
static const char _rcsid[] = "$Id: cdio.c,v 1.64 2004/07/21 10:19:21 rocky Exp $";
const char *track_format2str[6] =
@@ -511,6 +511,21 @@ cdio_get_first_track_num (const CdIo *cdio)
}
}
/*!
Get medium associated with cd_obj.
*/
discmode_t
cdio_get_discmode (CdIo *cd_obj)
{
if (cd_obj == NULL) return CDIO_DISC_MODE_ERROR;
if (cd_obj->op.get_discmode) {
return cd_obj->op.get_discmode (cd_obj->env);
} else {
return CDIO_DISC_MODE_NO_INFO;
}
}
/*!
Return a string containing the name of the driver in use.
if CdIo is NULL (we haven't initialized a specific device driver),

View File

@@ -1,5 +1,5 @@
/*
$Id: cdio_private.h,v 1.30 2004/07/17 22:16:47 rocky Exp $
$Id: cdio_private.h,v 1.31 2004/07/21 10:19:21 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -82,6 +82,11 @@ extern "C" {
*/
char * (*get_default_device)(void);
/*!
Get disc mode associated with cd_obj.
*/
discmode_t (*get_discmode) (void *env);
/*!
Return the what kind of device we've got.