Blame include/cdio++/mmc.hpp

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2005, 2006, 2008, 2010 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
/** 
Packit dd8086
 * \file mmc.hpp
Packit dd8086
 *  \brief methods relating to  MMC (Multimedia Commands). This file
Packit dd8086
 *  should not be #included directly.
Packit dd8086
 */
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Read Audio Subchannel information
Packit dd8086
  
Packit dd8086
  @param p_cdio the CD object to be acted upon.
Packit dd8086
  @param p_subchannel place for returned subchannel information
Packit dd8086
Packit dd8086
  A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void
Packit dd8086
mmcAudioReadSubchannel (/*out*/ cdio_subchannel_t *p_subchannel) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_audio_read_subchannel (p_cdio, p_subchannel);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Eject using MMC commands. If CD-ROM is "locked" we'll unlock it.
Packit dd8086
  Command is not "immediate" -- we'll wait for the command to complete.
Packit dd8086
  For a more general (and lower-level) routine, @see mmc_start_stop_unit.
Packit dd8086
Packit dd8086
  A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void mmcEjectMedia() 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_eject_media( p_cdio );
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
  
Packit dd8086
/**
Packit dd8086
  Get the lsn of the end of the CD
Packit dd8086
  
Packit dd8086
  @return the lsn. On error return CDIO_INVALID_LSN.
Packit dd8086
*/
Packit dd8086
lsn_t mmcGetDiscLastLsn() 
Packit dd8086
{
Packit dd8086
  return mmc_get_disc_last_lsn( p_cdio );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Return the discmode as reported by the MMC Read (FULL) TOC
Packit dd8086
  command.
Packit dd8086
  
Packit dd8086
  Information was obtained from Section 5.1.13 (Read TOC/PMA/ATIP)
Packit dd8086
  pages 56-62 from the MMC draft specification, revision 10a
Packit dd8086
  at http://www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf See
Packit dd8086
  especially tables 72, 73 and 75.
Packit dd8086
*/
Packit dd8086
discmode_t mmcGetDiscmode() 
Packit dd8086
{
Packit dd8086
  return mmc_get_discmode( p_cdio );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Get drive capabilities for a device.
Packit dd8086
  @return the drive capabilities.
Packit dd8086
*/
Packit dd8086
void mmcGetDriveCap ( /*out*/ cdio_drive_read_cap_t  *p_read_cap,
Packit dd8086
                      /*out*/ cdio_drive_write_cap_t *p_write_cap,
Packit dd8086
                      /*out*/ cdio_drive_misc_cap_t  *p_misc_cap) 
Packit dd8086
{
Packit dd8086
  mmc_get_drive_cap ( p_cdio, p_read_cap, p_write_cap, p_misc_cap);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Get the MMC level supported by the device.
Packit dd8086
*/
Packit dd8086
cdio_mmc_level_t mmcGetDriveMmcCap() 
Packit dd8086
{
Packit dd8086
  return mmc_get_drive_mmc_cap(p_cdio);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Get the DVD type associated with cd object.
Packit dd8086
  
Packit dd8086
  @return the DVD discmode.
Packit dd8086
*/
Packit dd8086
discmode_t mmcGetDvdStructPhysical (cdio_dvd_struct_t *s) 
Packit dd8086
{
Packit dd8086
  return mmc_get_dvd_struct_physical (p_cdio, s);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Get the CD-ROM hardware info via an MMC INQUIRY command.
Packit dd8086
  
Packit dd8086
  @return true if we were able to get hardware info, false if we had
Packit dd8086
  an error.
Packit dd8086
*/
Packit dd8086
bool mmcGetHwinfo ( /* out*/ cdio_hwinfo_t *p_hw_info ) 
Packit dd8086
{
Packit dd8086
  return mmc_get_hwinfo ( p_cdio, p_hw_info );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Find out if media has changed since the last call.
Packit dd8086
  @param p_cdio 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 mmcGetMediaChanged() 
Packit dd8086
{
Packit dd8086
  return mmc_get_media_changed(p_cdio);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Get the media catalog number (MCN) from the CD via MMC.
Packit dd8086
  
Packit dd8086
  @return the media catalog number r NULL if there is none or we
Packit dd8086
  don't have the ability to get it.
Packit dd8086
  
Packit dd8086
  Note: The caller must free the returned string with cdio_free()
Packit dd8086
  when done with it.
Packit dd8086
  
Packit dd8086
*/
Packit dd8086
char * mmcGetMcn () 
Packit dd8086
{
Packit dd8086
  return mmc_get_mcn ( p_cdio );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
   Get the output port volumes and port selections used on AUDIO PLAY
Packit dd8086
    commands via a MMC MODE SENSE command using the CD Audio Control
Packit dd8086
    Page.
Packit dd8086
Packit dd8086
    A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void mmcAudioGetVolume (mmc_audio_volume_t *p_volume) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_audio_get_volume (p_cdio, p_volume);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Report if CD-ROM has a praticular kind of interface (ATAPI, SCSCI, ...)
Packit dd8086
  Is it possible for an interface to have serveral? If not this 
Packit dd8086
  routine could probably return the single mmc_feature_interface_t.
Packit dd8086
  @return true if we have the interface and false if not.
Packit dd8086
*/
Packit dd8086
bool_3way_t mmcHaveInterface( cdio_mmc_feature_interface_t e_interface ) 
Packit dd8086
{
Packit dd8086
  return mmc_have_interface( p_cdio, e_interface );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
   Run a MODE_SENSE command (6- or 10-byte version) 
Packit dd8086
   and put the results in p_buf 
Packit dd8086
   @return DRIVER_OP_SUCCESS if we ran the command ok.
Packit dd8086
*/
Packit dd8086
int mmcModeSense( /*out*/ void *p_buf, int i_size, int page) 
Packit dd8086
{
Packit dd8086
  return mmc_mode_sense( p_cdio, /*out*/ p_buf, i_size, page);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
    Run a MODE_SENSE command (10-byte version) 
Packit dd8086
    and put the results in p_buf 
Packit dd8086
    @return DRIVER_OP_SUCCESS if we ran the command ok.
Packit dd8086
*/
Packit dd8086
int mmcModeSense10( /*out*/ void *p_buf, int i_size, int page) 
Packit dd8086
{
Packit dd8086
  return mmc_mode_sense_10( p_cdio, /*out*/ p_buf, i_size, page);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
    Run a MODE_SENSE command (6-byte version) 
Packit dd8086
    and put the results in p_buf 
Packit dd8086
    @return DRIVER_OP_SUCCESS if we ran the command ok.
Packit dd8086
*/
Packit dd8086
int mmcModeSense6( /*out*/ void *p_buf, int i_size, int page) 
Packit dd8086
{
Packit dd8086
  return mmc_mode_sense_6( p_cdio, /*out*/ p_buf, i_size, page);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
    Issue a MMC READ_CD command.
Packit dd8086
  
Packit dd8086
@param p_cdio  object to read from 
Packit dd8086
Packit dd8086
@param p_buf   Place to store data. The caller should ensure that 
Packit dd8086
               p_buf can hold at least i_blocksize * i_blocks  bytes.
Packit dd8086
Packit dd8086
@param i_lsn   sector to read 
Packit dd8086
  
Packit dd8086
@param expected_sector_type restricts reading to a specific CD
Packit dd8086
  sector type.  Only 3 bits with values 1-5 are used:
Packit dd8086
    0 all sector types
Packit dd8086
    1 CD-DA sectors only 
Packit dd8086
    2 Mode 1 sectors only
Packit dd8086
    3 Mode 2 formless sectors only. Note in contrast to all other
Packit dd8086
      values an MMC CD-ROM is not required to support this mode.
Packit dd8086
    4 Mode 2 Form 1 sectors only
Packit dd8086
    5 Mode 2 Form 2 sectors only
Packit dd8086
Packit dd8086
@param b_digital_audio_play Control error concealment when the
Packit dd8086
  data being read is CD-DA.  If the data being read is not CD-DA,
Packit dd8086
  this parameter is ignored.  If the data being read is CD-DA and
Packit dd8086
  DAP is false zero, then the user data returned should not be
Packit dd8086
  modified by flaw obscuring mechanisms such as audio data mute and
Packit dd8086
  interpolate.  If the data being read is CD-DA and DAP is true,
Packit dd8086
  then the user data returned should be modified by flaw obscuring
Packit dd8086
  mechanisms such as audio data mute and interpolate.  
Packit dd8086
  
Packit dd8086
  b_sync_header return the sync header (which will probably have
Packit dd8086
  the same value as CDIO_SECTOR_SYNC_HEADER of size
Packit dd8086
  CDIO_CD_SYNC_SIZE).
Packit dd8086
  
Packit dd8086
  @param header_codes Header Codes refer to the sector header and
Packit dd8086
  the sub-header that is present in mode 2 formed sectors: 
Packit dd8086
  
Packit dd8086
   0 No header information is returned.  
Packit dd8086
   1 The 4-byte sector header of data sectors is be returned, 
Packit dd8086
   2 The 8-byte sector sub-header of mode 2 formed sectors is
Packit dd8086
     returned.  
Packit dd8086
   3 Both sector header and sub-header (12 bytes) is returned.  
Packit dd8086
   The Header preceeds the rest of the bytes (e.g. user-data bytes) 
Packit dd8086
   that might get returned.
Packit dd8086
   
Packit dd8086
   @param b_user_data  Return user data if true. 
Packit dd8086
   
Packit dd8086
   For CD-DA, the User Data is CDIO_CD_FRAMESIZE_RAW bytes.
Packit dd8086
Packit dd8086
   For Mode 1, The User Data is ISO_BLOCKSIZE bytes beginning at
Packit dd8086
   offset CDIO_CD_HEADER_SIZE+CDIO_CD_SUBHEADER_SIZE.
Packit dd8086
   
Packit dd8086
   For Mode 2 formless, The User Data is M2RAW_SECTOR_SIZE bytes
Packit dd8086
   beginning at offset CDIO_CD_HEADER_SIZE+CDIO_CD_SUBHEADER_SIZE.
Packit dd8086
   
Packit dd8086
   For data Mode 2, form 1, User Data is ISO_BLOCKSIZE bytes beginning at
Packit dd8086
   offset CDIO_CD_XA_SYNC_HEADER.
Packit dd8086
   
Packit dd8086
   For data Mode 2, form 2, User Data is 2 324 bytes beginning at
Packit dd8086
   offset CDIO_CD_XA_SYNC_HEADER.
Packit dd8086
   
Packit dd8086
   @param b_sync 
Packit dd8086
Packit dd8086
   @param b_edc_ecc true if we return EDC/ECC error detection/correction bits.
Packit dd8086
   
Packit dd8086
   The presence and size of EDC redundancy or ECC parity is defined
Packit dd8086
   according to sector type: 
Packit dd8086
   
Packit dd8086
   CD-DA sectors have neither EDC redundancy nor ECC parity.  
Packit dd8086
   
Packit dd8086
   Data Mode 1 sectors have 288 bytes of EDC redundancy, Pad, and
Packit dd8086
   ECC parity beginning at offset 2064.
Packit dd8086
   
Packit dd8086
   Data Mode 2 formless sectors have neither EDC redundancy nor ECC
Packit dd8086
   parity
Packit dd8086
   
Packit dd8086
   Data Mode 2 form 1 sectors have 280 bytes of EDC redundancy and
Packit dd8086
   ECC parity beginning at offset 2072
Packit dd8086
   
Packit dd8086
   Data Mode 2 form 2 sectors optionally have 4 bytes of EDC
Packit dd8086
   redundancy beginning at offset 2348.
Packit dd8086
   
Packit dd8086
   
Packit dd8086
   @param c2_error_information If true associate a bit with each
Packit dd8086
   sector for C2 error The resulting bit field is ordered exactly as
Packit dd8086
   the main channel bytes.  Each 8-bit boundary defines a byte of
Packit dd8086
   flag bits.
Packit dd8086
   
Packit dd8086
   @param subchannel_selection subchannel-selection bits
Packit dd8086
   
Packit dd8086
     0  No Sub-channel data shall be returned.  (0 bytes)
Packit dd8086
     1  RAW P-W Sub-channel data shall be returned.  (96 byte)
Packit dd8086
     2  Formatted Q sub-channel data shall be transferred (16 bytes)
Packit dd8086
     3  Reserved     
Packit dd8086
     4  Corrected and de-interleaved R-W sub-channel (96 bytes)
Packit dd8086
     5-7  Reserved
Packit dd8086
Packit dd8086
   @param i_blocksize size of the a block expected to be returned
Packit dd8086
     
Packit dd8086
   @param i_blocks number of blocks expected to be returned.
Packit dd8086
Packit dd8086
   A DriverOpException is raised on error.     
Packit dd8086
  */
Packit dd8086
void 
Packit dd8086
mmcReadCd ( void *p_buf, lsn_t i_lsn, int expected_sector_type, 
Packit dd8086
            bool b_digital_audio_play, bool b_sync, uint8_t header_codes, 
Packit dd8086
            bool b_user_data, bool b_edc_ecc, uint8_t c2_error_information, 
Packit dd8086
            uint8_t subchannel_selection, uint16_t i_blocksize, 
Packit dd8086
            uint32_t i_blocks ) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = 
Packit dd8086
    mmc_read_cd ( p_cdio, p_buf, i_lsn, expected_sector_type, 
Packit dd8086
                  b_digital_audio_play, b_sync, header_codes, 
Packit dd8086
                  b_user_data, b_edc_ecc, c2_error_information, 
Packit dd8086
                  subchannel_selection, i_blocksize, i_blocks );
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
Packit dd8086
    Read just the user data part of some sort of data sector (via 
Packit dd8086
    mmc_read_cd). 
Packit dd8086
    
Packit dd8086
    @param p_cdio object 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 on
Packit dd8086
                 the kind of sector getting read. If you don't know
Packit dd8086
                 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 each block
Packit dd8086
    @param i_blocks number of blocks to read
Packit dd8086
Packit dd8086
  */
Packit dd8086
void mmcReadDataSectors ( void *p_buf, lsn_t i_lsn, uint16_t i_blocksize,
Packit dd8086
                          uint32_t i_blocks=1) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_read_data_sectors ( p_cdio, p_buf, i_lsn, 
Packit dd8086
                                                     i_blocksize, i_blocks );
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
Packit dd8086
/**
Packit dd8086
    Read MMC read mode2 sectors
Packit dd8086
Packit dd8086
    A DriverOpException is raised on error.
Packit dd8086
 */
Packit dd8086
void mmcReadSectors ( void *p_buf, lsn_t i_lsn,  int read_sector_type, 
Packit dd8086
                      uint32_t i_blocks=1) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_read_sectors ( p_cdio, p_buf, i_lsn, 
Packit dd8086
                                                read_sector_type, i_blocks);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
    Run an MMC command. 
Packit dd8086
    
Packit dd8086
    @param p_cdio	 CD structure set by cdio_open().
Packit dd8086
    @param i_timeout_ms  time in milliseconds we will wait for the command
Packit dd8086
                         to complete. 
Packit dd8086
    @param p_cdb	 CDB bytes. All values that are needed should be set 
Packit dd8086
                         on input. We'll figure out what the right CDB length 
Packit dd8086
                         should be.
Packit dd8086
    @param e_direction   direction the transfer is to go.
Packit dd8086
    @param i_buf	 Size of buffer
Packit dd8086
    @param p_buf	 Buffer for data, both sending and receiving.
Packit dd8086
Packit dd8086
    @return 0 if command completed successfully.
Packit dd8086
  */
Packit dd8086
int mmcRunCmd( unsigned int i_timeout_ms, const mmc_cdb_t *p_cdb,
Packit dd8086
               cdio_mmc_direction_t e_direction, unsigned int i_buf, 
Packit dd8086
               /*in/out*/ void *p_buf )
Packit dd8086
{
Packit dd8086
  return mmc_run_cmd( p_cdio, i_timeout_ms, p_cdb, e_direction, i_buf, p_buf );
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Set the block size for subsequent read requests, via MMC.
Packit dd8086
Packit dd8086
  @param i_blocksize size to set for subsequent requests
Packit dd8086
Packit dd8086
  A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void mmcSetBlocksize ( uint16_t i_blocksize) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_set_blocksize ( p_cdio, i_blocksize);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Set the drive speed via MMC. 
Packit dd8086
Packit dd8086
  @param i_speed speed to set drive to.
Packit dd8086
Packit dd8086
  A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void mmcSetSpeed( int i_speed )
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = mmc_set_speed( p_cdio, i_speed, 0);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086
/**
Packit dd8086
  Load or Unload media using a MMC START STOP command. 
Packit dd8086
  
Packit dd8086
  @param p_cdio  the CD object to be acted upon.
Packit dd8086
  @param b_eject eject if true and close tray if false
Packit dd8086
  @param b_immediate wait or don't wait for operation to complete
Packit dd8086
  @param power_condition Set CD-ROM to idle/standby/sleep. If nonzero
Packit dd8086
  eject/load is ignored, so set to 0 if you want to eject or load.
Packit dd8086
  
Packit dd8086
  @see mmc_eject_media or mmc_close_tray
Packit dd8086
Packit dd8086
  A DriverOpException is raised on error.
Packit dd8086
*/
Packit dd8086
void mmcStartStopMedia(bool b_eject, bool b_immediate, 
Packit dd8086
                       uint8_t power_condition) 
Packit dd8086
{
Packit dd8086
  driver_return_code_t drc = 
Packit dd8086
      mmc_start_stop_unit(p_cdio, b_eject, b_immediate, power_condition, 0);
Packit dd8086
  possible_throw_device_exception(drc);
Packit dd8086
}
Packit dd8086
Packit dd8086

Packit dd8086
/* 
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */