Logo Search packages:      
Sourcecode: cdrkit version File versions  Download package

wodim.h

/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)cdrecord.h 1.165 05/06/11 Copyright 1995-2005 J. Schilling */
/*
 *    Definitions for cdrecord
 *
 *    Copyright (c) 1995-2005 J. Schilling
 */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; see the file COPYING.  If not, write to the Free Software
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

/*
 * Make sure it is there. We need it for off_t.
 */
#ifndef     _INCL_SYS_TYPES_H
#include <sys/types.h>
#define     _INCL_SYS_TYPES_H
#endif

#ifndef     _UTYPES_H
#include <utypes.h>
#endif

/*
 * Defines for command line option flags
 */
#define     F_DUMMY           0x00000001L /* Do dummy (simulation) writes */
#define     F_TOC       0x00000002L /* Get TOC */
#define     F_EJECT           0x00000004L /* Eject disk after doing the work */
#define     F_LOAD            0x00000008L /* Load disk only */
#define     F_MULTI           0x00000010L /* Create linkable TOC/multi-session */
#define     F_MSINFO    0x00000020L /* Get multi-session info */
#define     F_FIX       0x00000040L /* Fixate disk only */
#define     F_NOFIX           0x00000080L /* Do not fixate disk */
#define     F_VERSION   0x00000100L /* Print version info */
#define     F_CHECKDRIVE      0x00000200L /* Check for driver */
#define     F_INQUIRY   0x00000400L /* Do inquiry */
#define     F_PRCAP           0x00000800L /* Print capabilities */
#define     F_SCANBUS   0x00001000L /* Scan SCSI Bus */
#define     F_RESET           0x00002000L /* Reset SCSI Bus */
#define     F_BLANK           0x00004000L /* Blank CD-RW */
#define     F_PRATIP    0x00008000L /* Print ATIP info */
#define     F_PRDINFO   0x00010000L /* Print disk info (XXX not yet used)  */
#define     F_IGNSIZE   0x00020000L /* Ignore disk size */
#define     F_SAO       0x00040000L /* Session at once */
#define     F_RAW       0x00080000L /* Raw mode */
#define     F_WRITE           0x00100000L /* Disk is going to be written */
#define     F_FORCE           0x00200000L /* Force things (e.g. blank on dead disk)  */
#define     F_WAITI           0x00400000L /* Wait until data is available on stdin */
#define     F_OVERBURN  0x00800000L /* Allow oveburning */
#define     F_CLONE           0x01000000L /* Do clone writing */
#define     F_STDIN           0x02000000L /* We are using stdin as CD data */
#define     F_IMMED           0x04000000L /* Try tu use IMMED SCSI flag if possible */
#define     F_DLCK            0x08000000L /* Load disk and lock door */
#define     F_SETDROPTS 0x10000000L /* Set driver opts and exit */
#define     F_FORMAT    0x20000000L /* Format media */
#define     F_ABORT           0x40000000L /* Send abort sequence to drive */

#ifdef      min
#undef      min
#endif
#define     min(a, b)   ((a) < (b) ? (a):(b))

#ifdef      max
#undef      max
#endif
#define     max(a, b)   ((a) < (b) ? (b):(a))

#undef      roundup
#define     roundup(x, y)     ((((x)+((y)-1))/(y))*(y))

/*
 * NOTICE:  You should not make CDR_BUF_SIZE more than
 *          the buffer size of the CD-Recorder.
 *
 * The Philips CDD 521 is the recorder with the smallest buffer.
 * It only has 256kB of buffer RAM.
 *
 * WARNING: Philips CDD 521 dies if CDR_BUF_SIZE is to big.
 *          If you like to support the CDD 521 keep the buffer
 *          at 63kB.
 */
/*#define   CDR_BUF_SIZE      (126*1024)*/
#define     CDR_BUF_SIZE            (63*1024)
#define     CDR_MAX_BUF_SIZE  (256*1024)

/*
 * Never set MIN_GRACE_TIME < 3 seconds. We need to give
 * the volume management a chance to settle before we
 * start writing.
 */
#ifndef     MIN_GRACE_TIME
#define     MIN_GRACE_TIME    0           /* changed to 0, there is no point in forcing it in this application. Fix your volume management if it breaks because it could not read the medium. */
#endif
#ifndef     GRACE_TIME
#define     GRACE_TIME  4
#endif

/*
 * Some sector sizes used for reading/writing ...
 */
#define     DATA_SEC_SIZE     2048        /* 2048 bytes */
#define     MODE2_SEC_SIZE    2336        /* 2336 bytes */
#define     AUDIO_SEC_SIZE    2352        /* 2352 bytes */
#define     RAW16_SEC_SIZE    (2352+16)   /* 2368 bytes */
#define     RAW96_SEC_SIZE    (2352+96)   /* 2448 bytes */

#define     MAX_TRACK   99    /* Red Book track limit */

#define     PAD_SECS    15    /* NOTE: pad must be less than BUF_SIZE */
#define     PAD_SIZE    (PAD_SECS * DATA_SEC_SIZE)

/*
 * FIFO size must be at least 2x CDR_MAX_BUF_SIZE
 */
#define     DEFAULT_FIFOSIZE (4L*1024L*1024L)

#if   !defined(HAVE_LARGEFILES) && SIZEOF_LLONG > SIZEOF_LONG
typedef     Llong tsize_t;
#else
typedef     off_t tsize_t;
#endif

#ifdef      nono
typedef struct tindex {
      int   dummy;            /* Not yet implemented */
} tindex_t;
#endif

typedef struct ofile {
      struct ofile *next;     /* Next open file             */
      int   f;          /* Open file                        */
      char  *filename;  /* File name                        */
      int   refcnt;           /* open reference count             */
} ofile_t;

typedef struct track {
      void  *xfp;       /* Open file for this track from xopen()*/
      char  *filename;  /* File name for this track         */

      tsize_t     itracksize; /* Size of track bytes (-1 == until EOF)*/
                        /* This is in units of isecsize           */
      tsize_t     tracksize;  /* Size of track bytes (-1 == until EOF)*/
                        /* This is in units of secsize            */

      long  trackstart; /* Start sector # of this track           */
      long  tracksecs;  /* Size of this track (sectors)           */
      long  padsecs;    /* Pad size for this track (sectors)      */
      long  pregapsize; /* Pre-gap size for this track (sectors)*/
      long  index0start;      /* Index 0 start within this tr(sectors)*/
      int   isecsize;   /* Read input sector size for this track*/
      int   secsize;    /* Sector size for this track (bytes)     */
      int   secspt;           /* # of sectors to copy for one transfer*/
      int   pktsize;    /* # of blocks per write packet           */
      Uchar dataoff;    /* offset of user data in raw sector      */
      Uchar tracks;           /* Number of tracks on this disk    */
      Uchar track;            /* Track # as offset in track[] array     */
      Uchar trackno;    /* Track # on disk for this track   */
      Uchar tracktype;  /* Track type (toc type)            */
      Uchar dbtype;           /* Data block type for this track   */
      int   sectype;    /* Sector type                      */
      int   flags;            /* Flags (see below)                */
      int   nindex;           /* Number of indices for track            */
      long  *tindex;    /* Track index descriptor           */
      char  *isrc;            /* ISRC code for this track / disk MCN    */
      void  *text;            /* Opaque CD-Text data (txtptr_t *) */
} track_t;

#define     track_base(tp)    ((tp) - (tp)->track)

/*
 * Defines for tp->flags
 */
#define     TI_AUDIO    0x00001     /* File is an audio track           */
#define     TI_PREEMP   0x00002     /* Audio track recorded w/preemphasis     */
#define     TI_MIX            0x00004     /* This is a mixed mode track       */
#define     TI_RAW            0x00008     /* Write this track in raw mode           */
#define     TI_PAD            0x00010     /* Pad data track             */
#define     TI_SWAB           0x00020     /* Swab audio data                  */
#define     TI_ISOSIZE  0x00040     /* Use iso size for track           */
#define     TI_NOAUHDR  0x00080     /* Don't look for audio header            */
#define     TI_FIRST    0x00100     /* This is the first track          */
#define     TI_LAST           0x00200     /* This is the last track           */
#define     TI_PACKET   0x00400     /* Fixed- or variable-packet track  */
#define     TI_NOCLOSE  0x00800     /* Don't close the track after writing    */
#define     TI_TAO            0x01000     /* This track is written in TAO mode      */
#define     TI_PREGAP   0x02000     /* Prev. track incl. pregap of this tr. */
#define     TI_SCMS           0x04000     /* Force to follow the SCMS rules   */
#define     TI_COPY           0x08000     /* Allow digital copy               */
#define     TI_SHORT_TRACK    0x10000     /* Ignore min 4 second Red Book     std.  */
#define     TI_RAW16    0x20000     /* This track uses 16 bytes subch.  */
#define     TI_RAW96R   0x40000     /* This track uses 96 bytes RAW subch.    */
#define     TI_CLONE    0x80000     /* Special clone treatment needed   */
#define     TI_TEXT           0x100000 /* This track holds CD-Text information */
#define     TI_DVD            0x200000 /* We are writing a DVD track          */
#define     TI_SAO            0x400000 /* This track is written in SAO mode   */
#define     TI_USEINFO  0x800000 /* Use information from *.inf files    */
#define     TI_QUADRO   0x1000000 /* Four Channel Audio Data            */


#define     is_audio(tp)      (((tp)->flags & TI_AUDIO) != 0)
#define     is_preemp(tp)     (((tp)->flags & TI_PREEMP) != 0)
#define     is_pad(tp)  (((tp)->flags & TI_PAD) != 0)
#define     is_swab(tp) (((tp)->flags & TI_SWAB) != 0)
#define     is_first(tp)      (((tp)->flags & TI_FIRST) != 0)
#define     is_last(tp) (((tp)->flags & TI_LAST) != 0)
#define     is_packet(tp)     (((tp)->flags & TI_PACKET) != 0)
#define     is_noclose(tp)    (((tp)->flags & TI_NOCLOSE) != 0)
#define     is_tao(tp)  (((tp)->flags & TI_TAO) != 0)
#define     is_sao(tp)  (((tp)->flags & TI_SAO) != 0)
#define     is_raw(tp)  (((tp)->flags & TI_RAW) != 0)
#define     is_raw16(tp)      (((tp)->flags & TI_RAW16) != 0)
#define     is_raw96(tp)      (((tp)->flags & (TI_RAW|TI_RAW16)) == TI_RAW)
#define     is_raw96p(tp)     (((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == TI_RAW)
#define     is_raw96r(tp)     (((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == (TI_RAW|TI_RAW96R))
#define     is_pregap(tp)     (((tp)->flags & TI_PREGAP) != 0)
#define     is_scms(tp) (((tp)->flags & TI_SCMS) != 0)
#define     is_copy(tp) (((tp)->flags & TI_COPY) != 0)
#define     is_shorttrk(tp)   (((tp)->flags & TI_SHORT_TRACK) != 0)
#define     is_clone(tp)      (((tp)->flags & TI_CLONE) != 0)
#define     is_text(tp) (((tp)->flags & TI_TEXT) != 0)
#define     is_quadro(tp)     (((tp)->flags & TI_QUADRO) != 0)

/*
 * Defines for toc type / track type
 */
#define     TOC_DA            0     /* CD-DA                      */
#define     TOC_ROM           1     /* CD-ROM                     */
#define     TOC_XA1           2     /* CD_ROM XA with first track in mode 1 */
#define     TOC_XA2           3     /* CD_ROM XA with first track in mode 2 */
#define     TOC_CDI           4     /* CDI                              */

#define     TOC_MASK    7     /* Mask needed for toctname[]       */

/*
 * Additional flags in toc type / trackp->tracktype
 * XXX TOCF_DUMMY istr schon in dp->cdr_cmdflags & F_DUMMY
 * XXX TOCF_MULTI istr schon in dp->cdr_cmdflags & F_MULTI
 */
#define     TOCF_DUMMY  0x10  /* Write in dummy (simulation) mode */
#define     TOCF_MULTI  0x20  /* Multisession (Open Next Programarea) */

#define     TOCF_MASK   0xF0  /* All possible flags in tracktype  */

extern      char  *toc2name[];      /* Convert toc type to name         */
extern      int   toc2sess[]; /* Convert toc type to session format     */

/*
 * Defines for sector type
 *
 * Mode is 2 bits
 * Aud  is 1 bit
 *
 * Sector is: aud << 2 | mode
 */
#define     ST_ROM_MODE1      1     /* CD-ROM in mode 1 (vanilla cdrom) */
#define     ST_ROM_MODE2      2     /* CD-ROM in mode 2                 */
#define     ST_AUDIO_NOPRE    4     /* CD-DA stereo without preemphasis */
#define     ST_AUDIO_PRE      5     /* CD-DA stereo with preemphasis    */

#define     ST_PREEMPMASK     0x01  /* Mask for preemphasis bit         */
#define     ST_AUDIOMASK      0x04  /* Mask for audio bit               */
#define     ST_MODEMASK 0x03  /* Mask for mode bits in sector type      */
#define     ST_MASK           0x07  /* Mask needed for sectname[]       */

/*
 * There are 6 different generic basic sector types.
 */
#define     ST_MODE_AUDIO      0x00 /* Generic Audio mode               */
#define     ST_MODE_0    0x10 /* Generic Zero mode                */
#define     ST_MODE_1    0x20 /* Generic CD-ROM mode  (ISO/IEC 10149)   */
#define     ST_MODE_2    0x30 /* Generic Mode 2 (ISO/IEC 10149)   */
#define     ST_MODE_2_FORM_1 0x40   /* Generic Mode 2 form 1            */
#define     ST_MODE_2_FORM_2 0x50   /* Generic Mode 2 form 2            */
#define     ST_MODE_2_MIXED    0x60 /* Generic Mode 2 mixed form (1/2)  */

#define     ST_MODE_MASK       0x70 /* Mask needed to get generic sectype     */

#define     ST_MODE_RAW  0x08 /* Do not touch EDC & subchannels   */
#define     ST_NOSCRAMBLE      0x80 /* Do not srcamble sectors          */

#define     SECT_AUDIO  (ST_AUDIO_NOPRE  | ST_MODE_AUDIO)
#define     SECT_AUDIO_NOPRE (ST_AUDIO_NOPRE | ST_MODE_AUDIO)
#define     SECT_AUDIO_PRE    (ST_AUDIO_PRE    | ST_MODE_AUDIO)
#define     SECT_MODE_0 (ST_ROM_MODE1    | ST_MODE_0)
#define     SECT_ROM    (ST_ROM_MODE1    | ST_MODE_1)
#define     SECT_MODE_2 (ST_ROM_MODE2    | ST_MODE_2)
#define     SECT_MODE_2_F1    (ST_ROM_MODE2    | ST_MODE_2_FORM_1)
#define     SECT_MODE_2_F2    (ST_ROM_MODE2    | ST_MODE_2_FORM_2)
#define     SECT_MODE_2_MIX   (ST_ROM_MODE2    | ST_MODE_2_MIXED)

extern      char  *st2name[]; /* Convert sector type to name            */
extern      int   st2mode[];  /* Convert sector type to control nibble*/

/*
 * Control nibble bits:
 *
 * 0  with preemphasis (audio) / incremental (data)
 * 1  digital copy permitted
 * 2  data (not audio) track
 * 3  4 channels (not 2)
 */
#define     TM_PREEM    0x1   /* Audio track with preemphasis     */
#define     TM_INCREMENTAL    0x1   /* Incremental data track     */
#define     TM_ALLOW_COPY     0x2   /* Digital copy permitted     */
#define     TM_DATA           0x4   /* This is a data track       */
#define     TM_QUADRO   0x8   /* Four channel audio         */

/*
 * Adr nibble:
 */
#define     ADR_NONE    0     /* Sub-Q mode info not supplied           */
#define     ADR_POS           1     /* Sub-Q encodes position data            */
#define     ADR_MCN           2     /* Sub-Q encodes Media Catalog Number     */
#define     ADR_ISRC    3     /* Sub-Q encodes ISRC               */

/*
 * Defines for write type (from SCSI-3/mmc)
 */
#define     WT_PACKET   0x0   /* Packet writing */
#define     WT_TAO            0x1   /* Track at once  */
#define     WT_SAO            0x2   /* Session at once      */
#define     WT_RAW            0x3   /* Raw                  */
#define     WT_RES_4    0x4   /* Reserved       */
#define     WT_RES_5    0x5   /* Reserved       */
#define     WT_RES_6    0x6   /* Reserved       */
#define     WT_RES_7    0x7   /* Reserved       */
#define     WT_RES_8    0x8   /* Reserved       */
#define     WT_RES_9    0x9   /* Reserved       */
#define     WT_RES_A    0xA   /* Reserved       */
#define     WT_RES_B    0xB   /* Reserved       */
#define     WT_RES_C    0xC   /* Reserved       */
#define     WT_RES_D    0xD   /* Reserved       */
#define     WT_RES_E    0xE   /* Reserved       */
#define     WT_RES_F    0xF   /* Reserved       */

/*
 * Data block layout:
 *
 *    -     Sync pattern 12 Bytes:  0x00 0xFF 0xFF ... 0xFF 0xFF 0x00
 *    -     Block header 4  Bytes:  | minute | second | frame | mode |
 *          Mode byte:
 *                Bits 7, 6, 5      Run-in/Run-out/Link
 *                Bits 4, 3, 2      Reserved
 *                Bits 1, 0   Mode
 *    -     Rest of sector see below.
 *
 * Mode 0 Format:
 *    0     12   Bytes Sync header
 *    12    4    Bytes Block header with Data mode == 0
 *    16    2336 Bytes of zero data
 *
 * Mode 1 Format:
 *    0     12   Bytes Sync header
 *    12    4    Bytes Block header with Data mode == 1
 *    16    2048 Bytes of user data
 *    2064  4    Bytes CRC for Bytes 0-2063
 *    2068  8    Bytes Zero fill
 *    2076  172  Bytes P parity symbols
 *    2248  104  Bytes Q parity symbols
 *
 * Mode 2 Format (formless):
 *    0     12   Bytes Sync header
 *    12    4    Bytes Block header with Data mode == 2
 *    16    2336 Bytes of user data
 *
 * Mode 2 form 1 Format:
 *    0     12   Bytes Sync header
 *    12    4    Bytes Block header with Data mode == 2
 *    16    4    Bytes subheader first copy
 *    20    4    Bytes subheader second copy
 *    24    2048 Bytes of user data
 *    2072  4    Bytes CRC for Bytes 16-2071
 *    2076  172  Bytes P parity symbols
 *    2248  104  Bytes Q parity symbols
 *
 * Mode 2 form 2 Format:
 *    0     12   Bytes Sync header
 *    12    4    Bytes Block header with Data mode == 2
 *    16    4    Bytes subheader first copy
 *    20    4    Bytes subheader second copy
 *    24    2324 Bytes of user data
 *    2348  4    Bytes Optional CRC for Bytes 16-2347
 */

/*
 * Mode Byte definitions (the 4th Byte in the Block header)
 */
#define     SH_MODE_DATA      0x00  /* User Data Block      */
#define     SH_MODE_RI4 0x20  /* Fourth run in Block  */
#define     SH_MODE_RI3 0x40  /* Third run in Block   */
#define     SH_MODE_RI2 0x60  /* Second run in Block  */
#define     SH_MODE_RI1 0x80  /* First run in Block   */
#define     SH_MODE_LINK      0xA0  /* Link Block           */
#define     SH_MODE_RO2 0xC0  /* Second run out Block */
#define     SH_MODE_RO1 0xE0  /* First run out Block  */
#define     SH_MODE_M0  0x00  /* Mode 0 Data          */
#define     SH_MODE_M1  0x01  /* Mode 1 Data          */
#define     SH_MODE_M2  0x02  /* Mode 2 Data          */
#define     SH_MODE_MR  0x03  /* Reserved       */

/*
 * Defines for data block type (from SCSI-3/mmc)
 *
 * Mandatory are only:
 *    DB_ROM_MODE1      (8)   Mode 1     (ISO/IEC 10149)
 *    DB_XA_MODE2 (10)  Mode 2-F1  (CD-ROM XA form 1)
 *    DB_XA_MODE2_MIX   (13)  Mode 2-MIX (CD-ROM XA 1/2+subhdr)
 */
#define     DB_RAW            0     /* 2352 bytes of raw data             */
#define     DB_RAW_PQ   1     /* 2368 bytes (raw data + P/Q Subchannel) */
#define     DB_RAW_PW   2     /* 2448 bytes (raw data + P-W Subchannel) */
#define     DB_RAW_PW_R 3     /* 2448 bytes (raw data + P-W raw Subchannel)*/
#define     DB_RES_4    4     /* -  Reserved                  */
#define     DB_RES_5    5     /* -  Reserved                  */
#define     DB_RES_6    6     /* -  Reserved                  */
#define     DB_VU_7           7     /* -  Vendor specific                 */
#define     DB_ROM_MODE1      8     /* 2048 bytes Mode 1 (ISO/IEC 10149)        */
#define     DB_ROM_MODE2      9     /* 2336 bytes Mode 2 (ISO/IEC 10149)        */
#define     DB_XA_MODE2 10    /* 2048 bytes Mode 2 (CD-ROM XA form 1)   */
#define     DB_XA_MODE2_F1    11    /* 2056 bytes Mode 2 (CD-ROM XA form 1)     */
#define     DB_XA_MODE2_F2    12    /* 2324 bytes Mode 2 (CD-ROM XA form 2)     */
#define     DB_XA_MODE2_MIX   13    /* 2332 bytes Mode 2 (CD-ROM XA 1/2+subhdr) */
#define     DB_RES_14   14    /* -  Reserved                  */
#define     DB_VU_15    15    /* -  Vendor specific                 */

extern      char  *db2name[]; /* Convert data block type to name    */

/*
 * Defines for multi session type (from SCSI-3/mmc)
 */
#define     MS_NONE           0     /* No B0 pointer. Next session not allowed*/
#define     MS_FINAL    1     /* B0 = FF:FF:FF. Next session not allowed*/
#define     MS_RES            2     /* Reserved                     */
#define     MS_MULTI    3     /* B0 = Next PA.  Next session allowed      */

/*
 * Defines for session format (from SCSI-3/mmc)
 */
#define     SES_DA_ROM  0x00  /* CD-DA or CD-ROM disk               */
#define     SES_CDI           0x10  /* CD-I disk                          */
#define     SES_XA            0x20  /* CD-ROM XA disk               */
#define     SES_UNDEF   0xFF  /* Undefined disk type (read disk info)     */

/*
 * Defines for blanking of CD-RW discs (from SCSI-3/mmc)
 */
#define     BLANK_DISC  0x00  /* Erase the entire disc              */
#define     BLANK_MINIMAL     0x01  /* Erase the PMA, 1st session TOC, pregap */
#define     BLANK_TRACK 0x02  /* Erase an incomplete track          */
#define     BLANK_UNRESERVE   0x03  /* Unreserve a track                  */
#define     BLANK_TAIL  0x04  /* Erase the tail of a track          */
#define     BLANK_UNCLOSE     0x05  /* Unclose the last session           */
#define     BLANK_SESSION     0x06  /* Erase the last session             */

/*
 * Defines for formating DVD (custom values)
 */
#define     FULL_FORMAT       0x00    /* Interactive format  */
#define     BACKGROUND_FORMAT 0x01    /* Background format   */
#define     FORCE_FORMAT      0x02    /* Force reformat      */

/*
 * Defines for formating DVD (custom values)
 */
#define     FULL_FORMAT       0x00    /* Interactive format  */
#define     BACKGROUND_FORMAT 0x01    /* Background format   */
#define     FORCE_FORMAT      0x02    /* Force reformat      */

/*
 * Useful definitions for audio tracks
 */
#define     msample           (44100 * 2)       /* one 16bit audio sample */
#define     ssample           (msample * 2)           /* one stereo sample    */
#define     samples(v)  ((v) / ssample)         /* # of stereo samples  */
#define     hsamples(v) ((v) / (ssample/100))   /* 100* # of stereo samples/s*/
#define     fsamples(v) ((v) / (ssample/75))    /* 75* # of stereo samples/s */

#define     minutes(v)  ((int)(samples(v) / 60))
#define     seconds(v)  ((int)(samples(v) % 60))
#define     hseconds(v) ((int)(hsamples(v) % 100))
#define     frames(v)   ((int)(fsamples(v) % 75))

/*
 * sector based macros
 */
#define     Sminutes(s) ((int)((s) / (60*75)))
#define     Sseconds(s) ((int)((s) / 75))
#define     Shseconds(s)      ((int)(((s) % 75)*100)/75)
#define     Sframes(s)  ((int)((s) % 75))

typedef struct msf {
      char  msf_min;
      char  msf_sec;
      char  msf_frame;
} msf_t;

/*
 * Definitions for read TOC/PMA/ATIP command
 */
#define     FMT_TOC           0
#define     FMT_SINFO   1
#define     FMT_FULLTOC 2
#define     FMT_PMA           3
#define     FMT_ATIP    4
#define     FMT_CDTEXT  5

/*
 * Definitions for read disk information "recording flags"
 * used in UInt16_t "ds_cdrflags".
 */
#define     RF_WRITE    0x0001      /* Disk is going to be written            */
#define     RF_BLANK    0x0002      /* Disk is going to be erased       */
#define     RF_PRATIP   0x0004      /* Print ATIP info                  */
#define     RF_LEADIN   0x0008      /* Lead-in has been "manually" written    */
#define     RF_BURNFREE 0x0010      /* BUFFER underrun free recording   */
#define     RF_VARIREC  0x0020      /* Plextor VariRec                  */
#define     RF_AUDIOMASTER    0x0040      /* Yamaha AudioMaster               */
#define     RF_FORCESPEED     0x0080      /* WriteSpeed forced high           */
#define     RF_DID_STAT 0x0100      /* Already did call cdrstats()            */
#define     RF_DID_CDRSTAT    0x0200      /* Already did call (*dp->cdr_stats)()    */
#define     RF_WR_WAIT  0x0400      /* Wait during writing to free bus  */
#define     RF_SINGLESESS     0x0800      /* Plextor single sess. mode        */
#define     RF_HIDE_CDR 0x1000      /* Plextor hide CDR features        */
#define     RF_SPEEDREAD      0x2000      /* Plextor SpeedReed                */
#define     RF_GIGAREC  0x4000      /* Plextor GigaRec                  */

/*
 * Definitions for read disk information "disk status"
 * used in "ds_diskstat".
 */
#define     DS_EMPTY    0     /* Empty disk                       */
#define     DS_APPENDABLE     1     /* Incomplete disk (appendable)           */
#define     DS_COMPLETE 2     /* Complete disk (closed/no B0 pointer)   */
#define     DS_RESERVED 3     /* Reserved                   */

/*
 * Definitions for read disk information "session status"
 * used in "ds_sessstat".
 */
#define     SS_EMPTY    0     /* Empty session              */
#define     SS_APPENDABLE     1     /* Incomplete session               */
#define     SS_RESERVED 2     /* Reserved                   */
#define     SS_COMPLETE 3     /* Complete session (needs DS_COMPLETE)   */

/*
 * Definitions for disk_status write mode
 * used in "ds_wrmode".
 */
#define     WM_NONE           0     /* No write mode selected           */
#define     WM_BLANK    1     /* Blanking mode              */
#define     WM_FORMAT   2     /* Formatting                       */
#define     WM_PACKET   4     /* Packet writing             */
#define     WM_TAO            8     /* Track at Once              */
#define     WM_SAO            12    /* Session at Once w/ cooked sectors      */
#define     WM_SAO_RAW16      13    /* Session at Once RAW+16 byte sectors    */
#define     WM_SAO_RAW96P     14    /* Session at Once RAW+96P byte sectors   */
#define     WM_SAO_RAW96R     15    /* Session at Once RAW+96R byte sectors   */
#define     WM_RAW            16    /* RAW with cooked sectors is impossible*/
#define     WM_RAW_RAW16      17    /* RAW with RAW+16 byte sectors           */
#define     WM_RAW_RAW96P     18    /* RAW with RAW+96P byte sectors    */
#define     WM_RAW_RAW96R     19    /* RAW with RAW+96R byte sectors    */

#define     wm_base(wm) ((wm)/4*4) /* The basic write mode for this mode */

/*
 * Definitions for disk_status flags
 * used in UInt16_t "ds_flags".
 */
#define     DSF_DID_V   0x0001      /* Disk id valid              */
#define     DSF_DBC_V   0x0002      /* Disk bar code valid              */
#define     DSF_URU           0x0004      /* Disk is for unrestricted use           */
#define     DSF_ERA           0x0008      /* Disk is erasable                 */
#define     DSF_HIGHSP_ERA    0x0010      /* Disk is high speed erasable            */
#define     DSF_ULTRASP_ERA   0x0020      /* Disk is ultra speed erasable           */
#define     DSF_ULTRASPP_ERA 0x0040 /* Disk is ultra speed+ erasable    */


#define     DSF_DVD           0x0100      /* Disk is a DVD              */
#define     DSF_DVD_PLUS_R    0x0200      /* Disk is a DVD+R                  */
#define     DSF_DVD_PLUS_RW   0x0400      /* Disk is a DVD+RW                 */
#define     DSF_NEED_FORMAT   0x0800      /* Disk needs to be formatted       */

/*
 * Definitions for disktype flags
 */
#define DT_CD           0x001  /*is a CD                                */
#define DT_DVD          0x002  /*is a DVD                               */

/*
 * Definitions for disktype flags
 */
#define DT_CD           0x001  /*is a CD                                */
#define DT_DVD          0x002  /*is a DVD                               */

/*
 * Definitions for disk_status disk type
 * used in "ds_type".
 */
/* None defined yet */

typedef     struct disk_status      dstat_t;

struct disk_status {
      UInt32_t ds_diskid;           /* Disk identification        */
      UInt16_t ds_cdrflags;         /* Recording flags from cdrecord*/
      UInt16_t ds_flags;            /* Disk_status flags          */
      Uchar  ds_wrmode;       /* Selected write mode        */
      Uchar  ds_type;         /* Abstract disk type         */

      Uchar  ds_disktype;           /* Disk type (from TOC/PMA)   */
      Uchar  ds_diskstat;           /* Disk status (MMC)          */
      Uchar  ds_sessstat;           /* Status of last sesion (MMC)      */
      Uchar  ds_trfirst;            /* first track #        */
      Uchar  ds_trlast;       /* last track #               */
      Uchar  ds_trfirst_ls;         /* first track # in last session*/
      Uchar  ds_barcode[8];         /* Disk bar code        */

      Int32_t      ds_first_leadin; /* Start of first lead in (ATIP)*/
      Int32_t      ds_last_leadout; /* Start of last lead out (ATIP)*/
      Int32_t      ds_curr_leadin;  /* Start of next lead in      */
      Int32_t      ds_curr_leadout; /* Start of next lead out     */

      Int32_t      ds_maxblocks;          /* # of official blocks on disk     */
      Int32_t      ds_maxrblocks;         /* # real blocks on disk      */
      Int32_t      ds_fwa;          /* first writable addr        */

      Int32_t      ds_startsec;           /* Actual start sector        */
      Int32_t      ds_endsec;       /* Actual end sector          */
      Int32_t      ds_buflow;       /* # of times drive buffer empty*/

      UInt16_t ds_minbuf;           /* Minimum drive bufer fill rt.     */

      UInt16_t ds_at_min_speed;     /* The minimal ATIP write speed     */
      UInt16_t ds_at_max_speed;     /* The maximal ATIP write speed     */
      UInt16_t ds_dr_cur_rspeed;    /* The drive's cur read speed */
      UInt16_t ds_dr_max_rspeed;    /* The drive's max read speed */
      UInt16_t ds_dr_cur_wspeed;    /* The drive's cur write speed      */
      UInt16_t ds_dr_max_wspeed;    /* The drive's max write speed      */
      UInt16_t ds_wspeed;           /* The selected/drive wr. speed */
};

/*
 * First approach of a CDR device abstraction layer.
 * This interface will change as long as I did not find the
 * optimum that fits for all devices.
 *
 * Called with pointer to whole track array:
 *    cdr_send_cue()
 *    cdr_write_leadin()
 *    cdr_open_session()
 *    cdr_fixate()
 *
 * Called with (track_t *) 0 or pointer to current track:
 *    cdr_next_wr_address()
 *
 * Called with pointer to current track:
 *    cdr_open_track()
 *    cdr_close_track()
 *
 * Calling sequence:
 *    cdr_identify()                            May modify driver
 *    Here, the cdr_t will be allocated and
 *    copied to a new writable area.
 *    cdr_attach()                              Get drive properties
 *    cdr_buffer_cap()
 *    cdr_getdisktype()                   GET ATIP
 *    cdr_init()                          set TAO for -msinfo
 *    cdr_check_session                   XXX ????
 *    cdr_opt1()                          set early options
 *    cdr_set_speed_dummy(usalp, dp, &speed)
 *    <---  Grace time processing goes here
 *    { do_opc(); cdr_blank() }
 *    cdr_opt2()                          set late options
 *    cdr_open_session()                        set up params (no wrt.)
 *    do_opc()
 *    cdr_write_leadin()                        start writing
 *    LOOP {
 *          cdr_open_track()
 *          cdr_next_wr_address()               only TAO / Packet
 *          write_track_data()
 *          cdr_close_track()
 *    }
 *    write_leadout()                     XXX should go -> driver!
 *    cdr_fixate()
 *    cdr_stats()
 */
/*--------------------------------------------------------------------------*/
typedef     struct cdr_cmd    cdr_t;

#ifdef      _SCG_SCSITRANSP_H
struct cdr_cmd {
      int   cdr_dev;                                  /* Numerical device type */
      UInt32_t cdr_cmdflags;              /* Command line options */
      UInt32_t cdr_flags;                       /* Drive related flags  */
      UInt8_t      cdr_cdrw_support;      /* CD-RW write media types */
      UInt16_t cdr_speeddef;              /* Default write speed  */
      UInt16_t cdr_speedmax;              /* Max. write speed     */

      char  *cdr_drname;                        /* Driver ID string     */
      char  *cdr_drtext;                        /* Driver ID text */
      struct cd_mode_page_2A *cdr_cdcap;
      dstat_t     *cdr_dstat;
#ifdef      _SCG_SCSIREG_H
      /* identify drive */
      cdr_t *(*cdr_identify)(SCSI *usalp, cdr_t *, struct scsi_inquiry *);    
#else
      /* identify drive */
      cdr_t *(*cdr_identify)(SCSI *usalp, cdr_t *, void *);       
#endif
      /* init error decoding etc*/
      int   (*cdr_attach)(SCSI *usalp, cdr_t *);
      /* init drive to useful deflts */
      int   (*cdr_init)(SCSI *usalp, cdr_t *);
      /* get disk type */
      int   (*cdr_getdisktype)(SCSI *usalp, cdr_t *);
      /* load disk */
      int   (*cdr_load)(SCSI *usalp, cdr_t *);
      /* unload disk */
      int   (*cdr_unload)(SCSI *usalp, cdr_t *);      
      /* read buffer capacity */
      int   (*cdr_buffer_cap)(SCSI *usalp, long *sizep, long *freep);
      /* check if recover is needed */
      int   (*cdr_check_recovery)(SCSI *usalp, cdr_t *);
      /* do recover */
      int   (*cdr_recover)(SCSI *usalp, cdr_t *, int track);
      /* set recording speed & dummy write */
      int   (*cdr_set_speed_dummy)(SCSI *usalp, cdr_t *, int *speedp);
      /* set sector size */
      int   (*cdr_set_secsize)(SCSI *usalp, int secsize);
      /* get next writable addr. */
      int   (*cdr_next_wr_address)(SCSI *usalp, track_t *trackp, long *ap);
      /* reserve track for future use */
      int   (*cdr_reserve_track)(SCSI *usalp, Ulong len);
      int   (*cdr_write_trackdata)(SCSI *usalp, caddr_t buf, long daddr, long bytecnt, 
                                                              int seccnt, BOOL islast);
      /* generate cue sheet */
      int   (*cdr_gen_cue)(track_t *trackp, void *cuep, BOOL needgap);
      /* send cue sheet */
      int   (*cdr_send_cue)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* write leadin */
      int   (*cdr_write_leadin)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* open new track */
      int   (*cdr_open_track)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* close written track */
      int   (*cdr_close_track)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* open new session */
      int   (*cdr_open_session)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* really needed ??? */
      int   (*cdr_close_session)(SCSI *usalp, cdr_t *);
      /* abort current write */
      int   (*cdr_abort_session)(SCSI *usalp, cdr_t *);
      /* read session offset*/
      int   (*cdr_session_offset)(SCSI *usalp, long *soff);
      /* write toc on disk */
      int   (*cdr_fixate)(SCSI *usalp, cdr_t *, track_t *trackp);
      /* final statistics printing*/
      int   (*cdr_stats)(SCSI *usalp, cdr_t *);
      /* blank something */
      int   (*cdr_blank)(SCSI *usalp, cdr_t *, long addr, int blanktype);
      /* format media */
      int   (*cdr_format)(SCSI *usalp, cdr_t *, int fmtflags);
      /* Do OPC */
      int   (*cdr_opc)(SCSI *usalp, caddr_t bp, int cnt, int doopc);
      /* do early option processing*/
      int   (*cdr_opt1)(SCSI *usalp, cdr_t *);
      /* do late option processing */
      int   (*cdr_opt2)(SCSI *usalp, cdr_t *);
      /* calculate optimale split */
      int   (*cdr_layer_split)(SCSI *usalp, cdr_t *, long tsize);
      int   profile;
      BOOL  is_dvd;
};
#endif

/*
 * Definitions for cdr_flags
 */
#define     CDR_TAO           0x01        /* Drive supports Track at once     */
#define     CDR_SAO           0x02        /* Drive supports Sess at once      */
#define     CDR_PACKET  0x04        /* Drive supports packet writing*/
#define     CDR_RAW           0x08        /* Drive supports raw writing */
#define     CDR_RAW16   0x10        /* Drive supports RAW raw16   */
#define     CDR_RAW96P  0x20        /* Drive supports RAW raw96 pak     */
#define     CDR_RAW96R  0x40        /* Drive supports RAW raw96 raw     */
#ifdef      __needed__
#define     CDR_SRAW16  0x100       /* Drive supports SAO raw16   */
#endif
#define     CDR_SRAW96P 0x200       /* Drive supports SAO raw96 pak     */
#define     CDR_SRAW96R 0x400       /* Drive supports SAO raw96 raw */
#define     CDR_SWABAUDIO     0x1000            /* Drive swabs audio data     */
#define     CDR_ISREADER      0x2000            /* Drive is s CD-ROM reader   */
#define     CDR_TRAYLOAD      0x4000            /* Drive loads CD with tray   */
#define     CDR_CADDYLOAD     0x8000            /* Drive loads CD with caddy  */
#define     CDR_NO_LOLIMIT    0x10000           /* Drive ignores lead-out limit     */
#define     CDR_DVD           0x20000           /* Drive is a DVD drive       */
#define     CDR_SIMUL   0x40000           /* Drive is simulated         */
#define     CDR_BURNFREE      0x80000           /* Drive sup. BUFund. free rec.     */
#define     CDR_VARIREC 0x100000    /* Drive sup. VariRec    Plex.      */
#define     CDR_AUDIOMASTER   0x200000    /* Drive sup. AudioMaster Yamah.*/
#define     CDR_FORCESPEED    0x400000    /* Drive sup. WriteSpeed ctl. */
#define     CDR_DISKTATTOO    0x800000    /* Drive sup. Yamaha DiskT@2  */
#define     CDR_SINGLESESS    0x1000000   /* Drive sup. single sess. mode */
#define     CDR_HIDE_CDR      0x2000000   /* Drive sup. hide CDR features     */
#define     CDR_SPEEDREAD     0x4000000   /* Drive sup. SpeedReed       */
#define     CDR_GIGAREC 0x8000000   /* Drive sup. GigaRec    Plex.      */
#define     CDR_MMC           0x10000000  /* Drive is MMC compliant     */
#define     CDR_MMC2    0x20000000  /* Drive is MMC-2 compliant   */
#define     CDR_MMC3    0x40000000  /* Drive is MMC-3 compliant   */
#ifdef      PROTOTYPES
#define     CDR_ALLOC   0x80000000UL      /* structure is allocated     */
#else
#define     CDR_ALLOC   0x80000000  /* structure is allocated     */
#endif

/*
 * Definitions for cdr_cdrw_support
 */
#define     CDR_CDRW_NONE     0x00        /* CD-RW writing not supported */
#define     CDR_CDRW_MULTI    0x01        /* CD-RW multi speed supported */
#define     CDR_CDRW_HIGH     0x02        /* CD-RW high speed supported */
#define     CDR_CDRW_ULTRA    0x04        /* CD-RW ultra high speed supported */
#define     CDR_CDRW_ULTRAP   0x08        /* CD-RW ultra high speed+ supported */
#define     CDR_CDRW_ALL      0xFF        /* All bits set: unknown - support all */

/*
 * cdrecord.c
 */
extern      int   read_buf(int f, char *bp, int size);
extern      int   fill_buf(int f, track_t *trackp, long secno, char *bp, int size);
extern      int   get_buf(int f, track_t *trackp, long secno, char **bpp, int size);
#ifdef      _SCG_SCSITRANSP_H
extern      int   write_secs(SCSI *usalp, cdr_t *dp, char *bp, long startsec, 
                                                  int bytespt, int secspt, BOOL islast);
extern      int   pad_track(SCSI *usalp, cdr_t *dp, track_t *trackp,
                                                 long startsec, Llong amt,
                                                 BOOL dolast, Llong *bytesp);
extern      void  load_media(SCSI *usalp, cdr_t *, BOOL);
extern      void  unload_media(SCSI *usalp, cdr_t *, int);
extern      void  reload_media(SCSI *usalp, cdr_t *);
#endif
extern      void  raisepri(int);
extern      int   getnum(char *arg, long *valp);

/*
 * cd_misc.c
 */
extern      int   from_bcd(int b);
extern      int   to_bcd(int i);
extern      long  msf_to_lba(int m, int s, int f, BOOL force_positive);
extern      BOOL  lba_to_msf(long lba, msf_t *mp);
extern      void  sec_to_msf(long sec, msf_t *mp);
extern      void  print_min_atip(long li, long lo);

/*
 * fifo.c
 */
extern      void  init_fifo(long);
extern      BOOL  init_faio(track_t *track, int);
extern      BOOL  await_faio(void);
extern      void  kill_faio(void);
extern      int   wait_faio(void);
extern      int   faio_read_buf(int f, char *bp, int size);
extern      int   faio_get_buf(int f, char **bpp, int size);
extern      void  fifo_stats(void);
extern      int   fifo_percent(BOOL addone);

/*
 * wm_session.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      int   write_session_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif

/*
 * wm_track.c
 */
#ifdef      _SCG_SCSITRANSP_H
/*extern    int   write_track_data __PR((SCSI *usalp, cdr_t *dp, track_t *trackp));*/
#endif

/*
 * wm_packet.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      int   write_packet_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif

/*
 * modes.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      BOOL  get_mode_params(SCSI *usalp, int page, char *pagename,
                                                             Uchar *modep, Uchar *cmodep,
                                                             Uchar *dmodep, Uchar *smodep,
                                                             int *lenp);
extern      BOOL  set_mode_params(SCSI *usalp, char *pagename, Uchar *modep,
                                                             int len, int save, int secsize);
#endif

/*
 * misc.c
 */
#ifdef      timerclear
extern      void  timevaldiff(struct timeval *start, struct timeval *stop);
extern      void  prtimediff(const char *fmt, struct timeval *start,
                                                  struct timeval *stop);
#endif

/*
 * getnum.c
 */
extern      int   getnum(char *arg, long *valp);
extern      int   getllnum(char *arg, Llong *lvalp);

/*
 * scsi_cdr.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      BOOL  unit_ready(SCSI *usalp);
extern      BOOL  wait_unit_ready(SCSI *usalp, int secs);
extern      BOOL  scsi_in_progress(SCSI *usalp);
extern      BOOL  cdr_underrun(SCSI *usalp);
extern      int   test_unit_ready(SCSI *usalp);
extern      int   rezero_unit(SCSI *usalp);
extern      int   request_sense(SCSI *usalp);
extern      int   request_sense_b(SCSI *usalp, caddr_t bp, int cnt);
extern      int   inquiry(SCSI *usalp, caddr_t, int);
extern      int   read_capacity(SCSI *usalp);
#ifdef      EOF   /* stdio.h has been included */
extern      void  print_capacity(SCSI *usalp, FILE *f);
#endif
extern      int   scsi_load_unload(SCSI *usalp, int);
extern      int   scsi_prevent_removal(SCSI *usalp, int);
extern      int   scsi_start_stop_unit(SCSI *usalp, int, int, BOOL immed);

#define     ROTCTL_CLV  0     /* CLV or PCAV    */
#define     ROTCTL_CAV  1     /* True CAV */

extern      int   scsi_set_speed(SCSI *usalp, int readspeed, int writespeed, 
                                                            int rotctl);
extern      int   scsi_get_speed(SCSI *usalp, int *readspeedp, int *writespeedp);
extern      int   qic02(SCSI *usalp, int);
extern      int   write_xscsi(SCSI *usalp, caddr_t, long, long, int);
extern      int   write_xg0(SCSI *usalp, caddr_t, long, long, int);
extern      int   write_xg1(SCSI *usalp, caddr_t, long, long, int);
extern      int   write_xg5(SCSI *usalp, caddr_t, long, long, int);
extern      int   seek_scsi(SCSI *usalp, long addr);
extern      int   seek_g0(SCSI *usalp, long addr);
extern      int   seek_g1(SCSI *usalp, long addr);
extern      int   scsi_flush_cache(SCSI *usalp, BOOL immed);
extern      int   read_buffer(SCSI *usalp, caddr_t bp, int cnt, int mode);
extern      int   write_buffer(SCSI *usalp, char *buffer, long length, int mode, 
                                                       int bufferid, long offset);
extern      int   read_subchannel(SCSI *usalp, caddr_t bp, int track, int cnt, 
                                                             int msf, int subq, int fmt);
extern      int   read_toc(SCSI *usalp, caddr_t, int, int, int, int);
extern      int   read_toc_philips(SCSI *usalp, caddr_t, int, int, int, int);
extern      int   read_header(SCSI *usalp, caddr_t, long, int, int);
extern      int   read_disk_info(SCSI *usalp, caddr_t, int);

#define     TI_TYPE_LBA 0     /* Address is LBA */
#define     TI_TYPE_TRACK     1     /* Address: 0 -> TOC, xx -> Track xx, 0xFF -> Inv Track */
#define     TI_TYPE_SESS      2     /* Address is session # */
extern      int   read_track_info(SCSI *usalp, caddr_t, int type, int addr, int cnt);
extern      int   read_rzone_info(SCSI *usalp, caddr_t bp, int cnt);
extern      int   reserve_tr_rzone(SCSI *usalp, long size);
extern      int   read_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int addr, 
                                                                   int layer, int fmt);
extern      int   send_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int layer, 
                                                                   int fmt);
extern      int   send_opc(SCSI *usalp, caddr_t, int cnt, int doopc);

#define     CL_TYPE_STOP_DEICE      0     /* Stop De-icing a DVD+RW Media */
#define     CL_TYPE_TRACK           1     /* Close Track # */
#define     CL_TYPE_SESSION         2     /* Close Session/Border / Stop backgrnd. format */
#define     CL_TYPE_INTER_BORDER    3     /* Close intermediate Border */
#define     CL_TYPE_OPEN_SESSION    4     /* Close the Open Session and Record an Extended lead-out */
#define     CL_TYPE_FINALISE_MINRAD 5     /* Finalize the Disc with a Minimum Recorded Radius */
#define     CL_TYPE_FINALISE  6     /* Finalize the disc */
extern      int   scsi_close_tr_session(SCSI *usalp, int type, int track, 
                                                                         BOOL immed);
extern      int   read_master_cue(SCSI *usalp, caddr_t bp, int sheet, int cnt);
extern      int   send_cue_sheet(SCSI *usalp, caddr_t bp, long size);
extern      int   read_buff_cap(SCSI *usalp, long *, long *);
extern      int   scsi_blank(SCSI *usalp, long addr, int blanktype, BOOL immed);
extern      BOOL  allow_atapi(SCSI *usalp, BOOL new);
extern      int   mode_select(SCSI *usalp, Uchar *, int, int, int);
extern      int   mode_sense(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern      int   mode_select_sg0(SCSI *usalp, Uchar *, int, int, int);
extern      int   mode_sense_sg0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern      int   mode_select_g0(SCSI *usalp, Uchar *, int, int, int);
extern      int   mode_select_g1(SCSI *usalp, Uchar *, int, int, int);
extern      int   mode_sense_g0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern      int   mode_sense_g1(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern      int   read_tochdr(SCSI *usalp, cdr_t *, int *, int *);
extern      int   read_cdtext(SCSI *usalp);
extern      int   read_trackinfo(SCSI *usalp, int, long *, struct msf *, int *, 
                                                            int *, int *);
extern      int   read_B0(SCSI *usalp, BOOL isbcd, long *b0p, long *lop);
extern      int   read_session_offset(SCSI *usalp, long *);
extern      int   read_session_offset_philips(SCSI *usalp, long *);
extern      int   sense_secsize(SCSI *usalp, int current);
extern      int   select_secsize(SCSI *usalp, int);
extern      BOOL  is_cddrive(SCSI *usalp);
extern      BOOL  is_unknown_dev(SCSI *usalp);
extern      int   read_scsi(SCSI *usalp, caddr_t, long, int);
extern      int   read_g0(SCSI *usalp, caddr_t, long, int);
extern      int   read_g1(SCSI *usalp, caddr_t, long, int);
extern      BOOL  getdev(SCSI *usalp, BOOL);
#ifdef      EOF   /* stdio.h has been included */
extern      void  printinq(SCSI *usalp, FILE *f);
#endif
extern      void  printdev(SCSI *usalp);
extern      BOOL  do_inquiry(SCSI *usalp, BOOL);
extern      BOOL  recovery_needed(SCSI *usalp, cdr_t *);
extern      int   scsi_load(SCSI *usalp, cdr_t *);
extern      int   scsi_unload(SCSI *usalp, cdr_t *);
extern      int   scsi_cdr_write(SCSI *usalp, caddr_t bp, long sectaddr, 
                                                            long size, int blocks, BOOL islast);
extern      struct cd_mode_page_2A *mmc_cap(SCSI *usalp, Uchar *modep);
extern      void  mmc_getval(struct cd_mode_page_2A *mp, BOOL *cdrrp, BOOL *cdwrp,
                                                  BOOL *cdrrwp, BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
extern      BOOL  is_mmc(SCSI *usalp, BOOL *cdwp, BOOL *dvdwp);
extern      BOOL  mmc_check(SCSI *usalp, BOOL *cdrrp, BOOL *cdwrp, BOOL *cdrrwp, 
                                                 BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
extern      void  print_capabilities(SCSI *usalp);
#endif

/*
 * scsi_cdr.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      void  print_capabilities_mmc4(SCSI *usalp);
#endif

/*
 * scsi_mmc.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      int   get_configuration(SCSI *usalp, caddr_t bp, int cnt, 
                                                                  int st_feature, int rt);
extern      int   get_curprofile(SCSI *usalp);
extern      int   print_profiles(SCSI *usalp);
extern      int   get_proflist(SCSI *usalp, BOOL *wp, BOOL *cdp, BOOL *dvdp,
                                                       BOOL *dvdplusp, BOOL *ddcdp);
extern      int   get_wproflist(SCSI *usalp, BOOL *cdp, BOOL *dvdp,
                                                        BOOL *dvdplusp, BOOL *ddcdp);
extern char *mmc_obtain_profile_name(int profile_number);
#endif

/*
 * scsi_mmc.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      int   get_supported_cdrw_media_types(SCSI *usalp);
#endif

/*
 * mmc_misc.c
 */
#ifdef      _SCG_SCSITRANSP_H
extern      int   check_writemodes_mmc(SCSI *usalp, cdr_t *dp);
#endif      /* _SCG_SCSITRANSP_H */

/*
 * cdr_drv.c
 */
#ifdef      _SCG_SCSITRANSP_H
#ifdef      _SCG_SCSIREG_H
extern      cdr_t *drive_identify(SCSI *usalp, cdr_t *, struct scsi_inquiry *ip);
#else
extern      cdr_t *drive_identify(SCSI *usalp, cdr_t *, void *ip);
#endif
extern      int   drive_attach(SCSI *usalp, cdr_t *);
#endif
extern      int   attach_unknown(void);
#ifdef      _SCG_SCSITRANSP_H
extern      int   blank_dummy(SCSI *usalp, cdr_t *, long addr, int blanktype);
int   format_dummy(SCSI *usalp, cdr_t *, int fmtflags);
extern      int   drive_getdisktype(SCSI *usalp, cdr_t *dp);
extern      int   cmd_ill(SCSI *usalp);
extern      int   cmd_dummy(SCSI *usalp, cdr_t *);
extern      int   no_sendcue(SCSI *usalp, cdr_t *, track_t *trackp);
extern      int   buf_dummy(SCSI *usalp, long *sp, long *fp);
#endif
extern      BOOL  set_cdrcmds(char *name, cdr_t **dpp);
#ifdef      _SCG_SCSITRANSP_H
extern      cdr_t *get_cdrcmds(SCSI *usalp);
#endif


/*
 * drv_mmc.c
 */
extern      void  mmc_opthelp(cdr_t *dp, int excode);
extern      char  *hasdrvopt(char *optstr, char *optname);
#ifdef      _SCG_SCSITRANSP_H
extern struct ricoh_mode_page_30 *get_justlink_ricoh(SCSI *usalp, Uchar *mode);
#endif

/*
 * isosize.c
 */
extern      Llong isosize(int f);

/*
 * audiosize.c
 */
extern      BOOL  is_auname(const char *name);
extern      off_t ausize(int f);
extern      BOOL  is_wavname(const char *name);
extern      off_t wavsize(int f);

/*
 * auinfo.c
 */
extern      BOOL  auinfosize(char *name, track_t *trackp);
extern      void  auinfo(char *name, int track, track_t *trackp);
#ifdef CDTEXT_H
extern      textptr_t *gettextptr(int track, track_t *trackp);
#endif
extern      void  setmcn(char *mcn, track_t *trackp);
extern      void  setisrc(char *isrc, track_t *trackp);
extern      void  setindex(char *tindex, track_t *trackp);

/*
 * diskid.c
 */
extern      void  pr_manufacturer(msf_t *mp, BOOL rw, BOOL audio);
extern      int   manufacturer_id(msf_t *mp);
extern      long  disk_rcap(msf_t *mp, long maxblock, BOOL rw, BOOL audio);

/*--------------------------------------------------------------------------*/
/* Test only                                                    */
/*--------------------------------------------------------------------------*/
#ifdef _SCSIMMC_H
/*extern    int   do_cue            __PR((track_t *trackp, struct mmc_cue **cuep));*/
#else
/*extern    int   do_cue            __PR((track_t *trackp, void *cuep));*/
#endif

/*
 * subchan.c
 */
extern      int   do_leadin(track_t *trackp);
#ifdef      _SCG_SCSITRANSP_H
extern      int   write_leadin(SCSI *usalp, cdr_t *dp, track_t *trackp, 
                                                       int leadinstart);
extern      int   write_leadout(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif
extern      void  fillsubch(track_t *trackp, Uchar *sp, int secno, int nsecs);
extern      void  filltpoint(Uchar *sub, int ctrl_adr, int point, msf_t *mp);
extern      void  fillttime(Uchar *sub, msf_t *mp);
extern      void  qpto96(Uchar *sub, Uchar *subq, int dop);
extern      void  addrw(Uchar *sub, Uchar *subrwptr);
extern      void  qwto16(Uchar *subq, Uchar *subptr);
extern      void  subrecodesecs(track_t *trackp, Uchar *bp, int address, int nsecs);

/*
 * sector.c
 */
extern      int   encspeed(BOOL be_verbose);
extern      void  encsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
extern      void  scrsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
extern      void  encodesector(Uchar *sp, int sectype, int address);
extern      void  fillsector(Uchar *sp, int sectype, int address);

/*
 * clone.c
 */
extern      void  clone_toc(track_t *trackp);
extern      void  clone_tracktype(track_t *trackp);

/*
 * cdtext.c
 */
extern      BOOL  checktextfile(char *fname);
extern      void  packtext(int tracks, track_t *trackp);
#ifdef      _SCG_SCSITRANSP_H
extern      int   write_cdtext(SCSI *usalp, cdr_t *dp, long startsec);
#endif

/*
 * cue.c
 */
extern      int   parsecue(char *cuefname, track_t trackp[]);
#ifdef      EOF   /* stdio.h has been included */
extern      void  fparsecue(FILE *f, track_t trackp[]);
#endif

Generated by  Doxygen 1.6.0   Back to index