Blame include/cdio/track.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2005, 2006, 2008, 2012 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
/** \file track.h
Packit dd8086
 *  \brief  The top-level header for track-related libcdio calls.
Packit dd8086
 */
Packit dd8086
#ifndef CDIO_TRACK_H_
Packit dd8086
#define CDIO_TRACK_H_
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
  /*! Printable tags for track_format_t enumeration.  */
Packit dd8086
  extern const char *track_format2str[6];
Packit dd8086
Packit dd8086
  typedef enum  {
Packit dd8086
    TRACK_FORMAT_AUDIO,   /**< Audio track, e.g. CD-DA */
Packit dd8086
    TRACK_FORMAT_CDI,     /**< CD-i. How this is different from DATA below? */
Packit dd8086
    TRACK_FORMAT_XA,      /**< Mode2 of some sort */
Packit dd8086
    TRACK_FORMAT_DATA,    /**< Mode1 of some sort */
Packit dd8086
    TRACK_FORMAT_PSX,     /**< Playstation CD. Like audio but only 2336 bytes
Packit dd8086
                           *   of user data.
Packit dd8086
                           */
Packit dd8086
    TRACK_FORMAT_ERROR    /**< Dunno what is, or some other error. */
Packit dd8086
  } track_format_t;
Packit dd8086
Packit dd8086
  typedef enum {
Packit dd8086
    CDIO_TRACK_FLAG_FALSE,
Packit dd8086
    CDIO_TRACK_FLAG_TRUE,
Packit dd8086
    CDIO_TRACK_FLAG_ERROR,
Packit dd8086
    CDIO_TRACK_FLAG_UNKNOWN
Packit dd8086
  } track_flag_t;
Packit dd8086
Packit dd8086
  /*! \brief Structure containing attributes associated with a track */
Packit dd8086
  typedef struct {
Packit dd8086
    track_flag_t preemphasis; /**< Linear preemphasis on an audio track */
Packit dd8086
    track_flag_t copy_permit; /**< Whether copying is permitted */
Packit dd8086
    int channels;             /**< Number of audio channels, 2, 4. -2 if not
Packit dd8086
                                   implemented or -1 for error.
Packit dd8086
                              */
Packit dd8086
  } track_flags_t;
Packit dd8086
Packit dd8086
  /*! The leadout track is always 0xAA, regardless of # of tracks on
Packit dd8086
    disc, or what value may be used internally. For example although
Packit dd8086
    OS X uses a different value for the lead-out track internally than
Packit dd8086
    given below, programmers should use CDIO_CDROM_LEADOUT_TRACK and
Packit dd8086
    not worry about this.
Packit dd8086
  */
Packit dd8086
Packit dd8086
  /*! An enumeration for some of the CDIO_CDROM_* \#defines below. This
Packit dd8086
    isn't really an enumeration one would really use in a program; it
Packit dd8086
    is to be helpful in debuggers where wants just to refer to the
Packit dd8086
    CDIO_CDROM_* names and get something.
Packit dd8086
  */
Packit dd8086
  extern enum cdio_track_enums {
Packit dd8086
    CDIO_CDROM_LBA           = 0x01, /**< "logical block": first frame is #0 */
Packit dd8086
    CDIO_CDROM_MSF           = 0x02, /**< "minute-second-frame": binary, not
Packit dd8086
                                        BCD here! */
Packit dd8086
    CDIO_CDROM_DATA_TRACK    = 0x04,
Packit dd8086
    CDIO_CDROM_CDI_TRACK     = 0x10,
Packit dd8086
    CDIO_CDROM_XA_TRACK      = 0x20,
Packit dd8086
    CDIO_CD_MAX_TRACKS       =   99, /**< Largest CD track number */
Packit dd8086
    CDIO_CDROM_LEADOUT_TRACK = 0xAA, /**< Lead-out track number */
Packit dd8086
    CDIO_INVALID_TRACK       = 0xFF, /**<  Constant for invalid track number */
Packit dd8086
Packit dd8086
   } cdio_track_enums;
Packit dd8086
Packit dd8086
#define CDIO_CD_MIN_TRACK_NO  1 /**< Smallest CD track number */
Packit dd8086
Packit dd8086
  /*! track modes (Table 350)
Packit dd8086
    reference: MMC-3 draft revsion - 10g
Packit dd8086
  */
Packit dd8086
  typedef enum {
Packit dd8086
    AUDIO,                      /**< 2352 byte block length */
Packit dd8086
    MODE1,                      /**< 2048 byte block length */
Packit dd8086
    MODE1_RAW,                  /**< 2352 byte block length */
Packit dd8086
    MODE2,                      /**< 2336 byte block length */
Packit dd8086
    MODE2_FORM1,                /**< 2048 byte block length */
Packit dd8086
    MODE2_FORM2,                /**< 2324 byte block length */
Packit dd8086
    MODE2_FORM_MIX,             /**< 2336 byte block length */
Packit dd8086
    MODE2_RAW                   /**< 2352 byte block length */
Packit dd8086
  } trackmode_t;
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the number of the first track.
Packit dd8086
Packit dd8086
    @return the track number or CDIO_INVALID_TRACK
Packit dd8086
    on error.
Packit dd8086
  */
Packit dd8086
  track_t cdio_get_first_track_num(const CdIo_t *p_cdio);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the last track number.
Packit dd8086
    CDIO_INVALID_TRACK is returned on error.
Packit dd8086
  */
Packit dd8086
  track_t cdio_get_last_track_num (const CdIo_t *p_cdio);
Packit dd8086
Packit dd8086
Packit dd8086
  /*! Find the track which contains lsn.
Packit dd8086
    CDIO_INVALID_TRACK is returned if the lsn outside of the CD or
Packit dd8086
    if there was some error.
Packit dd8086
Packit dd8086
    If the lsn is before the pregap of the first track 0 is returned.
Packit dd8086
    Otherwise we return the track that spans the lsn.
Packit dd8086
  */
Packit dd8086
  track_t cdio_get_track(const CdIo_t *p_cdio, lsn_t lsn);
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 cdio_get_track_channels(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*! Return copy protection status on a track. Is this meaningful
Packit dd8086
      if not an audio track?
Packit dd8086
   */
Packit dd8086
  track_flag_t cdio_get_track_copy_permit(const CdIo_t *p_cdio,
Packit dd8086
                                          track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the format (audio, mode2, mode1) of track.
Packit dd8086
  */
Packit dd8086
  track_format_t cdio_get_track_format(const CdIo_t *p_cdio, 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 cdio_get_track_green(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the ending LSN for track number
Packit dd8086
    i_track in cdio.  CDIO_INVALID_LSN is returned on error.
Packit dd8086
  */
Packit dd8086
  lsn_t cdio_get_track_last_lsn(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the starting LBA for track number
Packit dd8086
    i_track in p_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    The "leadout" track is specified either by
Packit dd8086
    using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1.
Packit dd8086
Packit dd8086
    @param p_cdio object to get information from
Packit dd8086
    @param i_track  the track number we want the LSN for
Packit dd8086
    @return the starting LBA or CDIO_INVALID_LBA on error.
Packit dd8086
  */
Packit dd8086
  lba_t cdio_get_track_lba(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the starting LSN for track number
Packit dd8086
    i_track in p_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    The "leadout" track is specified either by
Packit dd8086
    using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1.
Packit dd8086
Packit dd8086
    @param p_cdio object to get information from
Packit dd8086
    @param i_track  the track number we want the LSN for
Packit dd8086
    @return the starting LSN or CDIO_INVALID_LSN on error.
Packit dd8086
  */
Packit dd8086
  lsn_t cdio_get_track_lsn(const CdIo_t *p_cdio, 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_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    @param p_cdio object to get information from
Packit dd8086
    @param i_track  the track number we want the LBA for
Packit dd8086
    @return the starting LBA or CDIO_INVALID_LBA on error.
Packit dd8086
  */
Packit dd8086
  lba_t cdio_get_track_pregap_lba(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the starting LSN for the pregap for track number
Packit dd8086
    i_track in p_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    @param p_cdio object to get information from
Packit dd8086
    @param i_track  the track number we want the LSN for
Packit dd8086
    @return the starting LSN or CDIO_INVALID_LSN on error.
Packit dd8086
  */
Packit dd8086
  lsn_t cdio_get_track_pregap_lsn(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the International Standard Recording Code (ISRC) for track number
Packit dd8086
    i_track in p_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    @return the International Standard Recording Code (ISRC) or NULL
Packit dd8086
    if there is none or we 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 * cdio_get_track_isrc (const CdIo_t *p_cdio, 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_cdio.  Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    The "leadout" track is specified either by
Packit dd8086
    using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1.
Packit dd8086
Packit dd8086
    @return true if things worked or false if there is no track entry.
Packit dd8086
  */
Packit dd8086
  bool cdio_get_track_msf(const CdIo_t *p_cdio, track_t i_track,
Packit dd8086
                          /*out*/ msf_t *msf);
Packit dd8086
Packit dd8086
  /*! Get linear preemphasis status on an audio track
Packit dd8086
      This is not meaningful if not an audio track?
Packit dd8086
   */
Packit dd8086
  track_flag_t cdio_get_track_preemphasis(const CdIo_t *p_cdio,
Packit dd8086
                                          track_t i_track);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the number of sectors between this track an the next.  This
Packit dd8086
    includes any pregap sectors before the start of the next track.
Packit dd8086
    Track numbers usually start at something
Packit dd8086
    greater than 0, usually 1.
Packit dd8086
Packit dd8086
    @return the number of sectors or 0 if there is an error.
Packit dd8086
  */
Packit dd8086
  unsigned int cdio_get_track_sec_count(const CdIo_t *p_cdio, track_t i_track);
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#endif /* CDIO_TRACK_H_ */