(*
  this file is a part of audio components suite v 2.3.
  copyright (c) 2002-2005 andrei borovsky. all rights reserved.
  see the license file for more details.
  you can contact me at mail@z0m3ie.de
*)

{
$Log: soundcard.pas,v $
Revision 1.1  2005/12/19 18:36:16  z0m3ie
*** empty log message ***

Revision 1.1  2005/09/14 21:19:37  z0m3ie
*** empty log message ***

Revision 1.1  2005/09/12 22:04:52  z0m3ie
modified structure again, fileformats are now in an sperat folder.
all File In/Out classes are capsulated from TFileIn and TFileOut

Revision 1.1  2005/08/25 20:18:00  z0m3ie
Version 2.4 restructure
TCDPlayer removed (fits not in component structure)
TMP3ToWavConverter removed (fits not in component structure)

Revision 1.2  2005/08/22 20:17:01  z0m3ie
changed Headers to log
changed mail adress

}

unit soundcard;

interface


  // Supported card ID numbers (OBSOLETE. NOT USED ANY MORE)

const

  SNDCARD_ADLIB = 1;
  SNDCARD_SB = 2;
  SNDCARD_PAS = 3;
  SNDCARD_GUS = 4;
  SNDCARD_MPU401 = 5;
  SNDCARD_SB16 = 6;
  SNDCARD_SB16MIDI = 7;
  SNDCARD_UART6850 = 8;
  SNDCARD_GUS16 = 9;
  SNDCARD_MSS = 10;
  SNDCARD_PSS = 11;
  SNDCARD_SSCAPE = 12;
  SNDCARD_PSS_MPU = 13;
  SNDCARD_PSS_MSS = 14;
  SNDCARD_SSCAPE_MSS = 15;
  SNDCARD_TRXPRO = 16;
  SNDCARD_TRXPRO_SB = 17;
  SNDCARD_TRXPRO_MPU = 18;
  SNDCARD_MAD16 = 19;
  SNDCARD_MAD16_MPU = 20;
  SNDCARD_CS4232 = 21;
  SNDCARD_CS4232_MPU = 22;
  SNDCARD_MAUI = 23;
  SNDCARD_PSEUDO_MSS = 24;
  SNDCARD_GUSPNP = 25;
  SNDCARD_UART401 = 26;

  // Sound card numbers 27 to N are reserved. Don't add more numbers here

 //**********************************

 // IOCTL commands for /dev/dsp and /dev/audio

const

  SNDCTL_DSP_RESET = $5000;
  SNDCTL_DSP_SPEED = $c0045002;
  SNDCTL_DSP_STEREO = $c0045003;
  SNDCTL_DSP_GETBLKSIZE = $c0045004;
  SNDCTL_DSP_SAMPLESIZE = $c0045005;
  SNDCTL_DSP_CHANNELS = $c0045006;
  SOUND_PCM_WRITE_CHANNELS = $c0045006;
  SOUND_PCM_WRITE_FILTER = $c0045007;
  SNDCTL_DSP_POST = $5008;
  SNDCTL_DSP_SUBDIVIDE = $c0045009;
  SNDCTL_DSP_SETFRAGMENT = $c004500a;

// Audio data formats (Note! U8=8 and S16_LE=16 for compatibility)*/ }

  SNDCTL_DSP_GETFMTS = $8004500b;
  SNDCTL_DSP_SETFMT = $c0045005;

  AFMT_QUERY = 0;
  AFMT_MU_LAW = 1;
  AFMT_A_LAW  = 2;
  AFMT_IMA_ADPCM = 4;
  AFMT_U8 = 8;
  AFMT_S16_LE = $10;
  AFMT_S16_BE = $20;
  AFMT_S8 = $40;
  AFMT_U16_LE = $80;
  AFMT_U16_BE = $100;
  AFMT_MPEG = $200;

  // 32 bit formats (MSB aligned) formats

  AFMT_S32_LE = $1000;
  AFMT_S32_BE = $2000;

  // AC3 _compressed_ bitstreams (See Programmer's Guide for details).

  AFMT_AC3 = $4000;

  // 24 bit formats (LSB aligned in 32 bit word) formats*/ }
  AFMT_S24_LE = $8000;
  AFMT_S24_BE  = $10000;

(* S/PDIF raw format. In this format the S/PDIF frames (including all
 control and user bits) are included in the data stream. Each sample
 is stored in a 32 bit frame (see IEC-958 for more info). This format
 is supported by very few devices and it's only usable for purposes
 where full access to the control/user bits is required (real time control).
*)

  AFMT_SPDIF_RAW = $20000;

type
  audio_buf_info = record
    fragments: Integer;  // of available fragments (partially usend ones not counted)
    fragstotal: Integer; // Total # of fragments allocated
    fragsize: Integer;   // Size of a fragment in bytes
    bytes: Integer;      // Available space in bytes (includes partially used fragments)
    // Note! 'bytes' could be more than fragments*fragsize*/
  end;

const

  SNDCTL_DSP_GETOSPACE = $8010500c;
  SNDCTL_DSP_GETISPACE = $8010500d;
  SNDCTL_DSP_NONBLOCK = $500e;
  SNDCTL_DSP_GETCAPS = $8004500f;

  DSP_CAP_REVISION = $ff;  // Bits for revision level (0 to 255)
  DSP_CAP_DUPLEX = $100;   // Full duplex record/playback
  DSP_CAP_REALTIME = $200; // Not in use
  DSP_CAP_BATCH = $400;    (* Device has some kind of
                            internal buffers which may
                            cause some delays and
                            decrease precision of timing *)

  DSP_CAP_COPROC = $800;  // Has a coprocessor
  (* Sometimes it's a DSP
     but usually not *)

  DSP_CAP_TRIGGER = $1000;  // Supports SETTRIGGER
  DSP_CAP_MMAP = $2000;     // Supports mmap()
  DSP_CAP_MULTI = $4000;    // Supports multiple open
  DSP_CAP_BIND = $8000;     // Supports binding to front/rear/center/lfe
  DSP_CAP_INPUT = $10000;   // Supports recording
  DSP_CAP_OUTPUT = $20000;  // Supports playback
  DSP_CAP_VIRTUAL = $40000; // Virtuial device
  // Analog/digital control capabilities
  DSP_CAP_ANALOGOUT = $100000;
  DSP_CAP_ANALOGIN = $200000;
  DSP_CAP_DIGITALOUT = $400000;
  DSP_CAP_DIGITALIN = $800000;
  DSP_CAP_ADMASK = $f00000;
(* NOTE! (capabilities & DSP_CAP_ADMASK)==0 means just that the
 digital/analog interface control features are not supported by the
 device/driver. However the device still supports analog, digital or
 both inputs/outputs (depending on the device). See the OSS Programmer's
 Guide for full details. *)

  SNDCTL_DSP_GETTRIGGER = $80045010;
  SNDCTL_DSP_SETTRIGGER = $40045010;

  PCM_ENABLE_INPUT = 1;
  PCM_ENABLE_OUTPUT = 2;

type
  count_info = record
    bytes: Integer;   // Total # of bytes processed
    blocks : Integer; // # of fragment transitions since last time
    ptr: Integer;     // Current DMA pointer value }
  end;

const
  SNDCTL_DSP_GETIPTR = $800c5011;
  SNDCTL_DSP_GETOPTR = $800c5012;

type
  buffmem_desc = record
    buffer: PWord;
    size: Integer;
  end;

const
  SNDCTL_DSP_MAPINBUF = $80085013;
  SNDCTL_DSP_MAPOUTBUF = $80085014;
  SNDCTL_DSP_SETSYNCRO = $5015;
  SNDCTL_DSP_SETDUPLEX = $5016;

// Application's profile defines the way how playback underrun situations should be handled.

(* APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the
 playback buffer whenever an underrun occurs. This consumes some time
 prevents looping the existing buffer.
 APF_CPUINTENS is intended to be set by CPU intensive applications which
 are likely to run out of time occasionally. In this mode the buffer cleanup is
 disabled which saves CPU time but also let's the previous buffer content to
 be played during the "pause" after the underrun. *)

const
  SNDCTL_DSP_PROFILE = $40045017;

  APF_NORMAL = 0;   // Normal applications
  APF_NETWORK = 1; //  Underruns probably caused by an 'external' delay
  APF_CPUINTENS = 2; // Underruns probably caused by 'overheating' the CPU

  SNDCTL_DSP_GETODELAY = $80045017;


type
  audio_errinfo = record
    play_underruns: Integer;
    rec_overruns: Integer;
    play_ptradjust: Word;
    rec_ptradjust: Word;
    play_errorcount: Integer;
    rec_errorcount: Integer;
    play_lasterror: Integer;
    rec_lasterror: Integer;
    play_errorparm: LongInt;
    rec_errorparm: LongInt;
    filler: array[0..15] of Integer;
  end;


type
  oss_digital_control = record
    caps: LongWord;       // To be defined }
    valid : LongWord;
    cbitin: array[0..23] of Byte;
    ubitin: array[0..23] of Byte;
    cbitout: array[0..23] of Byte;
    ubitout: array[0..23] of Byte;
    outsel: LongWord;
    in_data: Integer;     // Audio/data if autodetectable by the receiver
    in_locked: Integer;	  // Receiver locked
    in_quality: Integer;  // Input signal quality
    in_vbit, out_vbit: Integer;	// V bits
    in_errors: LongWord;  // Various input errro conditions
  end;

const

  DIG_CBITIN_LIMITED = $00000001;
  DIG_CBITIN_DATA = $00000002;
  DIG_CBITIN_BYTE0 = $00000004;
  DIG_CBITIN_FULL = $00000008;
  DIG_CBITIN_MASK = $0000000;
  DIG_CBITOUT_LIMITED = $00000010;
  DIG_CBITOUT_BYTE0 = $00000020;
  DIG_CBITOUT_FULL = $00000040;
  DIG_CBITOUT_DATA = $00000080;
  DIG_CBITOUT_MASK = $000000f0;
  DIG_UBITIN = $00000100;
  DIG_UBITOUT = $00000200;

  VAL_CBITIN = $01;
  VAL_UBITIN = $02;
  VAL_CBITOUT = $04;
  VAL_UBITOUT = $08;
  VAL_ISTATUS = $10;

  OUTSEL_DIGITAL = 1;
  OUTSEL_ANALOG = 2;
  OUTSEL_BOTH = (OUTSEL_DIGITAL or OUTSEL_ANALOG);

  IND_UNKNOWN = 0;
  IND_AUDIO = 1;
  IND_DATA = 2;

  LOCK_NOT_INDICATED = 0;
  LOCK_UNLOCKED = 1;
  LOCK_LOCKED = 2;
  IN_QUAL_NOT_INDICATED = 0;
  IN_QUAL_POOR = 1;
  IN_QUAL_GOOD = 2;

  VBIT_NOT_INDICATED = 0;
  VBIT_OFF = 1;
  VBIT_ON = 2;

  INERR_CRC = $0001;
  INERR_QCODE_CRC = $0002;
  INERR_PARITY = $0004;
  INERR_BIPHASE = $0008;

type
  oss_syncgroup = record
    id: Integer;
    mode: Integer;
  end;

const

  SNDCTL_DSP_GETCHANNELMASK = $c0045040;
  SNDCTL_DSP_BIND_CHANNEL = $c0045041;

  DSP_BIND_QUERY = 0;
  DSP_BIND_FRONT = 1;
  DSP_BIND_SURR = 2;
  DSP_BIND_CENTER_LFE = 4;
  DSP_BIND_HANDSET = 8;
  DSP_BIND_MIC = $10;
  DSP_BIND_MODEM1 = $20;
  DSP_BIND_MODEM2 = $40;
  DSP_BIND_I2S = $80;
  DSP_BIND_SPDIF = $100;

//  Mixer devices

(* There can be up to 20 different analog mixer channels. The }
   SOUND_MIXER_NRDEVICES gives the currently supported maximum.
   The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells
  the devices supported by the particular mixer.
*)

const

  SOUND_MIXER_NRDEVICES = 28;
  SOUND_MIXER_VOLUME = 0;
  SOUND_MIXER_BASS = 1;
  SOUND_MIXER_TREBLE = 2;
  SOUND_MIXER_SYNTH = 3;
  SOUND_MIXER_PCM = 4;
  SOUND_MIXER_SPEAKER = 5;
  SOUND_MIXER_LINE = 6;
  SOUND_MIXER_MIC = 7;
  SOUND_MIXER_CD = 8;
  SOUND_MIXER_IMIX = 9;     // Recording monitor
  SOUND_MIXER_ALTPCM = 10;
  SOUND_MIXER_RECLEV = 11;  // Recording level
  SOUND_MIXER_IGAIN = 12;   // Input gain
  SOUND_MIXER_OGAIN = 13;   // Output gain

(* The AD1848 codec and compatibles have three line level inputs
 (line, aux1 and aux2). Since each card manufacturer have assigned
 different meanings to these inputs, it's inpractical to assign
 specific meanings (line, cd, synth etc.) to them. *)

  SOUND_MIXER_LINE1 = 14;     // Input source 1 (aux1)
  SOUND_MIXER_LINE2 = 15;     // Input source 2 (aux2)
  SOUND_MIXER_LINE3 = 16;     // Input source 3 (line)
  SOUND_MIXER_DIGITAL1 = 17;  // Digital (input)
  SOUND_MIXER_DIGITAL2 = 18;  // Digital (input) 2
  SOUND_MIXER_DIGITAL3 = 19;  // Digital (input) 3
  SOUND_MIXER_PHONEIN = 20;   // Phone input
  SOUND_MIXER_PHONEOUT = 21;  // Phone output
  SOUND_MIXER_VIDEO = 22;     // Video/TV (audio) in
  SOUND_MIXER_RADIO = 23;     // Radio in
  SOUND_MIXER_MONITOR = 24;   // Monitor (usually mic) volume
  SOUND_MIXER_DEPTH = 25;     // 3D 'depth'/'space' parameter
  SOUND_MIXER_CENTER = 26;    // 3D 'center' parameter
  SOUND_MIXER_MIDI = 27;      // Alternative for 'synth'

(* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX)
 Not counted to SOUND_MIXER_NRDEVICES, but use the same number space *)

  SOUND_ONOFF_MIN = 28;
  SOUND_ONOFF_MAX = 30;

// Note! Number 31 cannot be used since the sign bit is reserved

  SOUND_MIXER_NONE = 31;

(* The following unsupported macros are no longer functional.
 Use SOUND_MIXER_PRIVATE# macros in future. *)

  SOUND_MIXER_ENHANCE = SOUND_MIXER_NONE;
  SOUND_MIXER_MUTE = SOUND_MIXER_NONE;
  SOUND_MIXER_LOUD = SOUND_MIXER_NONE;



  SOUND_DEVICE_LABELS : array[0..27] of PChar = ('Vol ', 'Bass ', 'Trebl', 'Synth', 'Pcm ', 'Spkr ', 'Line ',
                          	 'Mic  ', 'CD   ', 'Mix  ', 'Pcm2 ', 'Rec  ', 'IGain', 'OGain',
                                 'Line1', 'Line2', 'Line3', 'Digital1', 'Digital2', 'Digital3',
				 'PhoneIn', 'PhoneOut', 'Video', 'Radio', 'Monitor',
				 'Depth', 'Center', 'MIDI');


  SOUND_DEVICE_NAMES : array[0..27] of PChar = ('vol', 'bass', 'treble', 'synth', 'pcm', 'speaker', 'line',
				 'mic', 'cd', 'mix', 'pcm2', 'rec', 'igain', 'ogain',
				 'line1', 'line2', 'line3', 'dig1', 'dig2', 'dig3',
				 'phin', 'phout', 'video', 'radio', 'monitor',
				 'depth', 'center', 'midi');

// Device bitmask identifiers

  SOUND_MIXER_RECSRC = $ff;   // Arg contains a bit for each recording source
  SOUND_MIXER_DEVMASK = $fe;  // Arg contains a bit for each supported device
  SOUND_MIXER_RECMASK = $fd;  // Arg contains a bit for each supported recording source
  SOUND_MIXER_CAPS = $fc;
  SOUND_CAP_EXCL_INPUT = $1;   // Only one recording source at a time

  SOUND_MIXER_STEREODEVS = $fb;  // Mixer channels supporting stereo

// OSS/Free ONLY
  SOUND_MIXER_OUTSRC = $fa;   // Arg contains a bit for each input source to output
  SOUND_MIXER_OUTMASK = $f9;  // Arg contains a bit for each supported input source to output
// OSS/Free ONLY

// Device mask bits

  SOUND_MASK_VOLUME = 1 shl SOUND_MIXER_VOLUME;
  SOUND_MASK_BASS = 1 shl SOUND_MIXER_BASS;
  SOUND_MASK_TREBLE = 1 shl SOUND_MIXER_TREBLE;
  SOUND_MASK_SYNTH =  1 shl SOUND_MIXER_SYNTH;
  SOUND_MASK_PCM = 1 shl SOUND_MIXER_PCM;
  SOUND_MASK_SPEAKER = 1 shl SOUND_MIXER_SPEAKER;
  SOUND_MASK_LINE = 1 shl SOUND_MIXER_LINE;
  SOUND_MASK_MIC = 1 shl SOUND_MIXER_MIC;
  SOUND_MASK_CD = 1 shl SOUND_MIXER_CD;
  SOUND_MASK_IMIX = 1 shl SOUND_MIXER_IMIX;
  SOUND_MASK_ALTPCM = 1 shl SOUND_MIXER_ALTPCM;
  SOUND_MASK_RECLEV = 1 shl SOUND_MIXER_RECLEV;
  SOUND_MASK_IGAIN = 1 shl SOUND_MIXER_IGAIN;
  SOUND_MASK_OGAIN = 1 shl SOUND_MIXER_OGAIN;
  SOUND_MASK_LINE1 = 1 shl SOUND_MIXER_LINE1;
  SOUND_MASK_LINE2 = 1 shl SOUND_MIXER_LINE2;
  SOUND_MASK_LINE3 = 1 shl SOUND_MIXER_LINE3;
  SOUND_MASK_DIGITAL1 = 1 shl SOUND_MIXER_DIGITAL1;
  SOUND_MASK_DIGITAL2 = 1 shl SOUND_MIXER_DIGITAL2;
  SOUND_MASK_DIGITAL3 = 1 shl SOUND_MIXER_DIGITAL3;
  SOUND_MASK_PHONEIN = 1 shl SOUND_MIXER_PHONEIN;
  SOUND_MASK_PHONEOUT = 1 shl SOUND_MIXER_PHONEOUT;
  SOUND_MASK_RADIO = 1 shl SOUND_MIXER_RADIO;
  SOUND_MASK_VIDEO = 1 shl SOUND_MIXER_VIDEO;
  SOUND_MASK_MONITOR = 1 shl SOUND_MIXER_MONITOR;
  SOUND_MASK_DEPTH = 1 shl SOUND_MIXER_DEPTH;
  SOUND_MASK_CENTER = 1 shl SOUND_MIXER_CENTER;
  SOUND_MASK_MIDI = 1 shl SOUND_MIXER_MIDI;

  SOUND_MIXER_READ_VOLUME = $80044d00;
  SOUND_MIXER_READ_BASS = $80044d01;
  SOUND_MIXER_READ_TREBLE = $80044d02;
  SOUND_MIXER_READ_SYNTH = $80044d03;
  SOUND_MIXER_READ_PCM = $80044d04;
  SOUND_MIXER_READ_SPEAKER = $80044d05;
  SOUND_MIXER_READ_LINE = $80044d06;
  SOUND_MIXER_READ_MIC = $80044d07;
  SOUND_MIXER_READ_CD = $80044d08;
  SOUND_MIXER_READ_IMIX = $80044d09;
  SOUND_MIXER_READ_ALTPCM = $80044d0a;
  SOUND_MIXER_READ_RECLEV = $80044d0b;
  SOUND_MIXER_READ_IGAIN = $80044d0c;
  SOUND_MIXER_READ_OGAIN = $80044d0d;
  SOUND_MIXER_READ_LINE1 = $80044d0e;
  SOUND_MIXER_READ_LINE2 = $80044d0f;
  SOUND_MIXER_READ_LINE3 = $80044d10;
  SOUND_MIXER_READ_RECSRC = $80044dff;
  SOUND_MIXER_READ_RECMASK = $80044dfd;
  SOUND_MIXER_READ_DEVMASK = $80044dfe;
  SOUND_MIXER_READ_STEREODEVS = $80044dfb;
  SOUND_MIXER_READ_CAPS = $80044dfc;

  SOUND_MIXER_WRITE_VOLUME = $c0044d00;
  SOUND_MIXER_WRITE_BASS = $c0044d01;
  SOUND_MIXER_WRITE_TREBLE = $c0044d02;
  SOUND_MIXER_WRITE_SYNTH = $c0044d03;
  SOUND_MIXER_WRITE_PCM = $c0044d04;
  SOUND_MIXER_WRITE_SPEAKER = $c0044d05;
  SOUND_MIXER_WRITE_LINE = $c0044d06;
  SOUND_MIXER_WRITE_MIC = $c0044d07;
  SOUND_MIXER_WRITE_CD = $c0044d08;
  SOUND_MIXER_WRITE_IMIX = $c0044d09;
  SOUND_MIXER_WRITE_ALTPCM = $c0044d0a;
  SOUND_MIXER_WRITE_RECLEV = $c0044d0b;
  SOUND_MIXER_WRITE_IGAIN = $c0044d0c;
  SOUND_MIXER_WRITE_OGAIN = $c0044d0d;
  SOUND_MIXER_WRITE_LINE1 = $c0044d0e;
  SOUND_MIXER_WRITE_LINE2 = $c0044d0f;
  SOUND_MIXER_WRITE_LINE3 = $c0044d10;
  SOUND_MIXER_WRITE_RECSRC = $c0044dff;
  SOUND_MIXER_INFO = $805c4d65;

type
  mixer_info = record
    id: array[0..15] of Char;
    name: array[0..31] of Char;
    modify_counter: Integer;
    fillers: array[0..9] of Integer;
  end;

const
  SOUND_MIXER_ACCESS = $c0804d66;
  SOUND_MIXER_GETLEVELS = $c0a44d74;
  SOUND_MIXER_SETLEVELS = $c0a44d75;

(* SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used
 for querying current mixer settings from the driver and for loading
 default volume settings _prior_ activating the mixer (loading
 doesn't affect current state of the mixer hardware). These calls
 are for internal use only. *)

type
  mixer_vol_table = record
    num: Integer; // Index to volume table
    name: array[0..31] of Char;
    levels: array[0..31] of Integer;
  end;

implementation
end.
