Blame lib/driver/cdio_private.h

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2003-2005, 2008-2009, 2011-2012, 2016-2017
Packit dd8086
  Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* Internal routines for CD I/O drivers. */
Packit dd8086
Packit dd8086

Packit dd8086
#ifndef CDIO_DRIVER_PRIVATE_H_
Packit dd8086
#define CDIO_DRIVER_PRIVATE_H_
Packit dd8086
Packit dd8086
#if defined(HAVE_CONFIG_H) && !defined(LIBCDIO_CONFIG_H)
Packit dd8086
# include "config.h"
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/audio.h>
Packit dd8086
#include <cdio/cdtext.h>
Packit dd8086
#include "mmc/mmc_private.h"
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#ifndef HAVE_STRNDUP
Packit dd8086
#undef  strndup
Packit dd8086
#define strndup libcdio_strndup
Packit dd8086
static inline char *libcdio_strndup(const char *s, size_t n)
Packit dd8086
{
Packit dd8086
    char *result;
Packit dd8086
    size_t len = strlen (s);
Packit dd8086
    if (n < len)
Packit dd8086
        len = n;
Packit dd8086
    result = (char *) malloc (len + 1);
Packit dd8086
    if (!result)
Packit dd8086
        return 0;
Packit dd8086
    result[len] = '\0';
Packit dd8086
    return (char *) strncpy (result, s, len);
Packit dd8086
}
Packit dd8086
#endif /*HAVE_STRNDUP*/
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get directory name from file name.
Packit dd8086
Packit dd8086
    Callers must free return value after use.
Packit dd8086
   */
Packit dd8086
  extern char *cdio_dirname(const char *fname);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Construct an absolute file name from path and file name.
Packit dd8086
Packit dd8086
    Callers must free return value after use.
Packit dd8086
   */
Packit dd8086
  extern char *cdio_abspath(const char *cwd, const char *fname);
Packit dd8086
Packit dd8086
  /* Opaque type */
Packit dd8086
  typedef struct _CdioDataSource CdioDataSource_t;
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#include "generic.h"
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
Packit dd8086
  typedef struct {
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get volume of an audio CD.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_get_volume)
Packit dd8086
         (void *p_env,  /*out*/ cdio_audio_volume_t *p_volume);
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Pause playing CD through analog output
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_pause) (void *p_env);
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Playing CD through analog output
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_play_msf) ( void *p_env,
Packit dd8086
                                             msf_t *p_start_msf,
Packit dd8086
                                             msf_t *p_end_msf );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Playing CD through analog output
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_play_track_index)
Packit dd8086
         ( void *p_env, cdio_track_index_t *p_track_index );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get subchannel information.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_read_subchannel)
Packit dd8086
         ( void *p_env, cdio_subchannel_t *subchannel );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Resume playing an audio CD.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_resume) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Set volume of an audio CD.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_set_volume)
Packit dd8086
         ( void *p_env,  cdio_audio_volume_t *p_volume );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Stop playing an audio CD.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*audio_stop) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Eject media in CD drive. If successful, as a side effect we
Packit dd8086
      also free p_env.
Packit dd8086
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
      If the CD is ejected *p_env is freed and p_env set to NULL.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*eject_media) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Release and free resources associated with cd.
Packit dd8086
    */
Packit dd8086
    void (*free) (void *p_env);
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the value associated with the key "arg".
Packit dd8086
    */
Packit dd8086
    const char * (*get_arg) (void *p_env, const char key[]);
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get the block size for subsequest read requests, via a SCSI MMC
Packit dd8086
      MODE_SENSE 6 command.
Packit dd8086
    */
Packit dd8086
    int (*get_blocksize) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get cdtext information for a CdIo object.
Packit dd8086
Packit dd8086
      @param obj the CD object that may contain CD-TEXT information.
Packit dd8086
      @return the CD-TEXT object or NULL if obj is NULL
Packit dd8086
      or CD-TEXT information does not exist.
Packit dd8086
    */
Packit dd8086
    cdtext_t * (*get_cdtext) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get raw cdtext information as on the disc for a CdIo object
Packit dd8086
Packit dd8086
      @param obj the CD object that may contain CD-TEXT information.
Packit dd8086
      @return pointer to the raw CD-TEXT data or NULL if obj is NULL
Packit dd8086
      or no CD-TEXT information present on the disc.
Packit dd8086
Packit dd8086
      free when done and not NULL.
Packit dd8086
    */
Packit dd8086
    uint8_t * (*get_cdtext_raw) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return an array of device names. if CdIo is NULL (we haven't
Packit dd8086
      initialized a specific device driver), then find a suitable device
Packit dd8086
      driver.
Packit dd8086
Packit dd8086
      NULL is returned if we couldn't return a list of devices.
Packit dd8086
    */
Packit dd8086
    char ** (*get_devices) ( void );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get the default CD device.
Packit dd8086
Packit dd8086
      @return a string containing the default CD device or NULL is
Packit dd8086
      if we couldn't get a default device.
Packit dd8086
Packit dd8086
      In some situations of drivers or OS's we can't find a CD device if
Packit dd8086
      there is no media in it and it is possible for this routine to return
Packit dd8086
      NULL even though there may be a hardware CD-ROM.
Packit dd8086
    */
Packit dd8086
    char * (*get_default_device) ( void );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the size of the CD in logical block address (LBA) units.
Packit dd8086
      @return the lsn. On error 0 or CDIO_INVALD_LSN.
Packit dd8086
    */
Packit dd8086
    lsn_t (*get_disc_last_lsn) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get disc mode associated with cd_obj.
Packit dd8086
    */
Packit dd8086
    discmode_t (*get_discmode) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the what kind of device we've got.
Packit dd8086
Packit dd8086
      See cd_types.h for a list of bitmasks for the drive type;
Packit dd8086
    */
Packit dd8086
    void (*get_drive_cap) (const void *p_env,
Packit dd8086
                           cdio_drive_read_cap_t  *p_read_cap,
Packit dd8086
                           cdio_drive_write_cap_t *p_write_cap,
Packit dd8086
                           cdio_drive_misc_cap_t  *p_misc_cap);
Packit dd8086
    /*!
Packit dd8086
      Return the number of of the first track.
Packit dd8086
      CDIO_INVALID_TRACK is returned on error.
Packit dd8086
    */
Packit dd8086
    track_t (*get_first_track_num) ( void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get the CD-ROM hardware info via a SCSI MMC INQUIRY command.
Packit dd8086
      False is returned if we had an error getting the information.
Packit dd8086
    */
Packit dd8086
    bool (*get_hwinfo)
Packit dd8086
         ( const CdIo_t *p_cdio, /* out*/ cdio_hwinfo_t *p_hw_info );
Packit dd8086
Packit dd8086
    /*! Get the LSN of the first track of the last session of
Packit dd8086
      on the CD.
Packit dd8086
Packit dd8086
       @param p_cdio the CD object to be acted upon.
Packit dd8086
       @param i_last_session pointer to the session number to be returned.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*get_last_session)
Packit dd8086
         ( void *p_env, /*out*/ lsn_t *i_last_session );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Find out if media has changed since the last call.
Packit dd8086
      @param p_env the CD object to be acted upon.
Packit dd8086
      @return 1 if media has changed since last call, 0 if not. Error
Packit dd8086
      return codes are the same as driver_return_code_t
Packit dd8086
    */
Packit dd8086
    int (*get_media_changed) ( const void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the media catalog number MCN from the CD or NULL if
Packit dd8086
      there is none or we don't have the ability to get it.
Packit dd8086
    */
Packit dd8086
    char * (*get_mcn) ( const void *p_env );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the number of tracks in the current medium.
Packit dd8086
      CDIO_INVALID_TRACK is returned on error.
Packit dd8086
    */
Packit dd8086
    track_t (*get_num_tracks) ( void *p_env );
Packit dd8086
Packit dd8086
    /*! Return number of channels in track: 2 or 4; -2 if not
Packit dd8086
      implemented or -1 for error.
Packit dd8086
      Not meaningful if track is not an audio track.
Packit dd8086
    */
Packit dd8086
    int (*get_track_channels) ( const void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*! Return 0 if track is copy protected, 1 if not, or -1 for error
Packit dd8086
      or -2 if not implimented (yet). Is this meaningful if not an
Packit dd8086
      audio track?
Packit dd8086
    */
Packit dd8086
    track_flag_t (*get_track_copy_permit) ( void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the starting LBA for track number
Packit dd8086
      i_track in p_env.  Tracks numbers start at 1.
Packit dd8086
      The "leadout" track is specified either by
Packit dd8086
      using track_num LEADOUT_TRACK or the total tracks+1.
Packit dd8086
      CDIO_INVALID_LBA is returned on error.
Packit dd8086
    */
Packit dd8086
    lba_t (*get_track_lba) ( void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the starting LBA for the pregap for track number
Packit dd8086
      i_track in p_env.  Tracks numbers start at 1.
Packit dd8086
      CDIO_INVALID_LBA is returned on error.
Packit dd8086
    */
Packit dd8086
    lba_t (*get_track_pregap_lba) ( const void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the International Standard Recording Code (ISRC) for track number
Packit dd8086
      i_track in p_cdio.  Track numbers start at 1.
Packit dd8086
Packit dd8086
      Note: string is malloc'd so caller has to free() the returned
Packit dd8086
      string when done with it.
Packit dd8086
    */
Packit dd8086
    char * (*get_track_isrc) ( const void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Get format of track.
Packit dd8086
    */
Packit dd8086
    track_format_t (*get_track_format) ( void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return true if we have XA data (green, mode2 form1) or
Packit dd8086
      XA data (green, mode2 form2). That is track begins:
Packit dd8086
      sync - header - subheader
Packit dd8086
      12     4      -  8
Packit dd8086
Packit dd8086
      FIXME: there's gotta be a better design for this and get_track_format?
Packit dd8086
    */
Packit dd8086
    bool (*get_track_green) ( void *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Return the starting MSF (minutes/secs/frames) for track number
Packit dd8086
      i_track in p_env.  Tracks numbers start at 1.
Packit dd8086
      The "leadout" track is specified either by
Packit dd8086
      using i_track LEADOUT_TRACK or the total tracks+1.
Packit dd8086
      False is returned on error.
Packit dd8086
    */
Packit dd8086
    bool (*get_track_msf) ( void *p_env, track_t i_track, msf_t *p_msf );
Packit dd8086
Packit dd8086
    /*! Return 1 if track has pre-emphasis, 0 if not, or -1 for error
Packit dd8086
      or -2 if not implimented (yet). Is this meaningful if not an
Packit dd8086
      audio track?
Packit dd8086
    */
Packit dd8086
    track_flag_t (*get_track_preemphasis)
Packit dd8086
         ( const void  *p_env, track_t i_track );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      lseek - reposition read/write file offset
Packit dd8086
      Returns (off_t) -1 on error.
Packit dd8086
      Similar to libc's lseek()
Packit dd8086
    */
Packit dd8086
    off_t (*lseek) ( void *p_env, off_t offset, int whence );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads into buf the next size bytes.
Packit dd8086
      Returns -1 on error.
Packit dd8086
      Similar to libc's read()
Packit dd8086
    */
Packit dd8086
    ssize_t (*read) ( void *p_env, void *p_buf, size_t i_size );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads a single mode2 sector from cd device into buf starting
Packit dd8086
      from lsn. Returns 0 if no error.
Packit dd8086
    */
Packit dd8086
    int (*read_audio_sectors) ( void *p_env, void *p_buf, lsn_t i_lsn,
Packit dd8086
                                unsigned int i_blocks );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Read a data sector
Packit dd8086
Packit dd8086
      @param p_env environment to read from
Packit dd8086
Packit dd8086
      @param p_buf place to read data into.  The caller should make sure
Packit dd8086
      this location can store at least CDIO_CD_FRAMESIZE,
Packit dd8086
      M2RAW_SECTOR_SIZE, or M2F2_SECTOR_SIZE depending
Packit dd8086
      on the kind of sector getting read. If you don't
Packit dd8086
      know whether you have a Mode 1/2, Form 1/ Form 2/Formless
Packit dd8086
      sector best to reserve space for the maximum,
Packit dd8086
      M2RAW_SECTOR_SIZE.
Packit dd8086
Packit dd8086
      @param i_lsn sector to read
Packit dd8086
      @param i_blocksize size of block. Should be either CDIO_CD_FRAMESIZE,
Packit dd8086
      M2RAW_SECTOR_SIZE, or M2F2_SECTOR_SIZE. See comment above under p_buf.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*read_data_sectors)
Packit dd8086
         ( void *p_env, void *p_buf, lsn_t i_lsn, uint16_t i_blocksize,
Packit dd8086
           uint32_t i_blocks );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads a single mode2 sector from cd device into buf starting
Packit dd8086
      from lsn. Returns 0 if no error.
Packit dd8086
    */
Packit dd8086
    int (*read_mode2_sector)
Packit dd8086
         ( void *p_env, void *p_buf, lsn_t i_lsn, bool b_mode2_form2 );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads i_blocks of mode2 sectors from cd device into data starting
Packit dd8086
      from lsn.
Packit dd8086
      Returns 0 if no error.
Packit dd8086
    */
Packit dd8086
    int (*read_mode2_sectors)
Packit dd8086
         ( void *p_env, void *p_buf, lsn_t i_lsn, bool b_mode2_form2,
Packit dd8086
           unsigned int i_blocks );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads a single mode1 sector from cd device into buf starting
Packit dd8086
      from lsn. Returns 0 if no error.
Packit dd8086
    */
Packit dd8086
    int (*read_mode1_sector)
Packit dd8086
         ( void *p_env, void *p_buf, lsn_t i_lsn, bool mode1_form2 );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Reads i_blocks of mode1 sectors from cd device into data starting
Packit dd8086
      from lsn.
Packit dd8086
      Returns 0 if no error.
Packit dd8086
    */
Packit dd8086
    int (*read_mode1_sectors)
Packit dd8086
         ( void *p_env, void *p_buf, lsn_t i_lsn, bool mode1_form2,
Packit dd8086
           unsigned int i_blocks );
Packit dd8086
Packit dd8086
    bool (*read_toc) ( void *p_env ) ;
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Run a SCSI MMC command.
Packit dd8086
Packit dd8086
      cdio              CD structure set by cdio_open().
Packit dd8086
      i_timeout_ms      time in milliseconds we will wait for the command
Packit dd8086
                        to complete.
Packit dd8086
      cdb_len           number of bytes in cdb (6, 10, or 12).
Packit dd8086
      cdb               CDB bytes. All values that are needed should be set on
Packit dd8086
                        input.
Packit dd8086
      b_return_data     TRUE if the command expects data to be returned in
Packit dd8086
                        the buffer
Packit dd8086
      len               Size of buffer
Packit dd8086
      buf               Buffer for data, both sending and receiving
Packit dd8086
Packit dd8086
      Returns 0 if command completed successfully.
Packit dd8086
    */
Packit dd8086
    mmc_run_cmd_fn_t run_mmc_cmd;
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Set the arg "key" with "value" in the source device.
Packit dd8086
    */
Packit dd8086
    int (*set_arg) ( void *p_env, const char key[], const char value[] );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Set the blocksize for subsequent reads.
Packit dd8086
    */
Packit dd8086
    driver_return_code_t (*set_blocksize) ( void *p_env,
Packit dd8086
                                            uint16_t i_blocksize );
Packit dd8086
Packit dd8086
    /*!
Packit dd8086
      Set the drive speed.
Packit dd8086
Packit dd8086
      @return 0 if everything went okay, -1 if we had an error. is -2
Packit dd8086
      returned if this is not implemented for the current driver.
Packit dd8086
    */
Packit dd8086
    int (*set_speed) ( void *p_env, int i_speed );
Packit dd8086
Packit dd8086
  } cdio_funcs_t;
Packit dd8086
Packit dd8086
Packit dd8086
  /*! Implementation of CdIo type */
Packit dd8086
  struct _CdIo {
Packit dd8086
    driver_id_t driver_id; /**< Particular driver opened. */
Packit dd8086
    cdio_funcs_t op;       /**< driver-specific routines handling
Packit dd8086
                                implementation*/
Packit dd8086
    void *env;             /**< environment. Passed to routine above. */
Packit dd8086
  };
Packit dd8086
Packit dd8086
  /* This is used in drivers that must keep their own internal
Packit dd8086
     position pointer for doing seeks. Stream-based drivers (like bincue,
Packit dd8086
     nrg, toc, network) would use this.
Packit dd8086
   */
Packit dd8086
  typedef struct
Packit dd8086
  {
Packit dd8086
    off_t   buff_offset;      /* buffer offset in disk-image seeks. */
Packit dd8086
    track_t index;            /* Current track index in tocent. */
Packit dd8086
    lba_t   lba;              /* Current LBA */
Packit dd8086
  } internal_position_t;
Packit dd8086
Packit dd8086
  CdIo_t * cdio_new (generic_img_private_t *p_env, cdio_funcs_t *p_funcs);
Packit dd8086
Packit dd8086
  /* The below structure describes a specific CD Input driver  */
Packit dd8086
  typedef struct
Packit dd8086
  {
Packit dd8086
    driver_id_t  id;
Packit dd8086
    unsigned int flags;
Packit dd8086
    const char  *name;
Packit dd8086
    const char  *describe;
Packit dd8086
    bool (*have_driver) (void);
Packit dd8086
    CdIo_t *(*driver_open) (const char *psz_source_name);
Packit dd8086
    CdIo_t *(*driver_open_am) (const char *psz_source_name,
Packit dd8086
                             const char *psz_access_mode);
Packit dd8086
    char *(*get_default_device) (void);
Packit dd8086
    bool (*is_device) (const char *psz_source_name);
Packit dd8086
    char **(*get_devices) (void);
Packit dd8086
    driver_return_code_t (*close_tray) (const char *psz_device);
Packit dd8086
  } CdIo_driver_t;
Packit dd8086
Packit dd8086
  /* The below array gives of the drivers that are currently available for
Packit dd8086
     on a particular host. */
Packit dd8086
  extern CdIo_driver_t CdIo_driver[];
Packit dd8086
Packit dd8086
  /* The last valid entry of Cdio_driver. -1 means uninitialzed. -2
Packit dd8086
     means some sort of error.
Packit dd8086
   */
Packit dd8086
  extern int CdIo_last_driver;
Packit dd8086
Packit dd8086
  /* The below array gives all drivers that can possibly appear.
Packit dd8086
     on a particular host. */
Packit dd8086
  extern CdIo_driver_t CdIo_all_drivers[];
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Add/allocate a drive to the end of drives.
Packit dd8086
    Use cdio_free_device_list() to free this device_list.
Packit dd8086
  */
Packit dd8086
  void cdio_add_device_list(char **device_list[], const char *psz_drive,
Packit dd8086
                            unsigned int *i_drives);
Packit dd8086
Packit dd8086
  driver_return_code_t close_tray_bsdi    (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_freebsd (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_linux   (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_netbsd  (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_osx     (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_solaris (const char *psz_drive);
Packit dd8086
  driver_return_code_t close_tray_win32   (const char *psz_drive);
Packit dd8086
Packit dd8086
  bool cdio_have_netbsd(void);
Packit dd8086
  CdIo_t * cdio_open_netbsd (const char *psz_source);
Packit dd8086
  char * cdio_get_default_device_netbsd(void);
Packit dd8086
  char **cdio_get_devices_netbsd(void);
Packit dd8086
  /*! Set up CD-ROM for reading using the NetBSD driver. The device_name is
Packit dd8086
      the some sort of device name.
Packit dd8086
Packit dd8086
     NULL is returned on error or there is no FreeBSD driver.
Packit dd8086
Packit dd8086
     @see cdio_open_cd, cdio_open
Packit dd8086
   */
Packit dd8086
  CdIo_t * cdio_open_am_netbsd (const char *psz_source,
Packit dd8086
                                const char *psz_access_mode);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if AIX driver is available. */
Packit dd8086
  bool cdio_have_aix    (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if BSDI driver is available. */
Packit dd8086
  bool cdio_have_bsdi    (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if FreeBSD driver is available. */
Packit dd8086
  bool cdio_have_freebsd (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if GNU/Linux driver is available. */
Packit dd8086
  bool cdio_have_linux   (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if Sun Solaris driver is available. */
Packit dd8086
  bool cdio_have_solaris (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if IBM OS2 driver is available. */
Packit dd8086
  bool cdio_have_os2     (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if Apple OSX driver is available. */
Packit dd8086
  bool cdio_have_osx     (void);
Packit dd8086
Packit dd8086
  /*! DEPRICATED: use cdio_have_driver().
Packit dd8086
    True if Microsoft Windows driver is available. */
Packit dd8086
  bool cdio_have_win32   (void);
Packit dd8086
Packit dd8086
  /*! True if Nero driver is available. */
Packit dd8086
  bool cdio_have_nrg     (void);
Packit dd8086
Packit dd8086
  /*! True if BIN/CUE driver is available. */
Packit dd8086
  bool cdio_have_bincue  (void);
Packit dd8086
Packit dd8086
  /*! True if cdrdao CDRDAO driver is available. */
Packit dd8086
  bool cdio_have_cdrdao  (void);
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#endif /* CDIO_DRIVER_PRIVATE_H_ */