(*
  application interface library for the alsa driver
  free pascal / kylix import unit
  converted from file <alsa/asoundlib.h>

  ALSA library is copyrighted by its authors:
    Jaroslav Kysela <perex@suse.cz>
    Abramo Bagnara <abramo@alsa-project.org>
    Takashi Iwai <tiwai@suse.de>

  Pascal translation:
    Copyright (C) 2002, Pedro Lopez-Cabanillas <plcl@bigfoot.com>

  Modified by Andrei Borovsky, 01-06-2003
  Note by A.B.: currently only <alsa/pcm.h> translation is included in this file.

  This library is free software; you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of
  the License, or (at your option) any later version.

  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 Lesser General Public License for more details.

*)

(* attention! in this unit asoundlib is linked dynamically.
   In order to decrease loading time, only the symbols needed by ACS
   are actually resolved. *)

{
$Log: alsa.pas,v $
Revision 1.6  2006/08/30 18:59:51  z0m3ie
*** empty log message ***

Revision 1.5  2006/07/04 17:12:45  z0m3ie
ACS 2.4 alt wiederhergestellt (unterschiedliche Sampleformate ...)

Revision 1.3  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 alsa;

interface

uses
  Libc,ACS_Procs;

const
  asoundlib_path = 'libasound.so*';

var
  AsoundlibLoaded : Boolean = False;

type
  Pint16_t = ^int16_t;

  {  PCM generic info container  }
     Psnd_pcm_info_t = pointer;
  {  PCM hardware configuration space container  }
     Psnd_pcm_hw_params_t = pointer;
  {  PCM software configuration container  }
     Psnd_pcm_sw_params_t = pointer;
  {  PCM status container  }
     Psnd_pcm_status_t = pointer;
  {  PCM access types mask  }
     Psnd_pcm_access_mask_t = pointer;
  {  PCM formats mask  }
     Psnd_pcm_format_mask_t = pointer;
  {  PCM subformats mask  }
     Psnd_pcm_subformat_mask_t = pointer;

  Psnd_config_t = pointer;

  Psnd_async_handler_t = pointer;

  Psnd_output_t = Pointer;

  {  PCM class  }
     _snd_pcm_class =  Longint;
     snd_pcm_class_t = _snd_pcm_class;
const
     SND_PCM_CLASS_GENERIC = 0;   { standard device  }
     SND_PCM_CLASS_MULTI = 1;     { multichannel device  }
     SND_PCM_CLASS_MODEM = 2;     { software modem device  }
     SND_PCM_CLASS_DIGITIZER = 3; { digitizer device  }
     SND_PCM_CLASS_LAST = SND_PCM_CLASS_DIGITIZER;

type
  {  PCM subclass  }
     _snd_pcm_subclass =  Longint;
     snd_pcm_subclass_t = _snd_pcm_subclass;
const
     SND_PCM_SUBCLASS_GENERIC_MIX = 0; { subdevices are mixed together  }
     SND_PCM_SUBCLASS_MULTI_MIX = 1;   { multichannel subdevices are mixed together  }
     SND_PCM_SUBCLASS_LAST = SND_PCM_SUBCLASS_MULTI_MIX;

type
  {  PCM stream (direction)  }
     _snd_pcm_stream =  Longint;
     snd_pcm_stream_t = _snd_pcm_stream;
const
     SND_PCM_STREAM_PLAYBACK = 0;    { Playback stream  }
     SND_PCM_STREAM_CAPTURE = 1;     { Capture stream  }
     SND_PCM_STREAM_LAST = SND_PCM_STREAM_CAPTURE;

type
  {  PCM access type  }
     _snd_pcm_access =  Longint;
     snd_pcm_access_t = _snd_pcm_access;
const
     SND_PCM_ACCESS_MMAP_INTERLEAVED = 0;     { mmap access with simple interleaved channels }
     SND_PCM_ACCESS_MMAP_NONINTERLEAVED = 1;  { mmap access with simple non interleaved channels }
     SND_PCM_ACCESS_MMAP_COMPLEX = 2;         { mmap access with complex placement }
     SND_PCM_ACCESS_RW_INTERLEAVED = 3;       { snd_pcm_readi/snd_pcm_writei access }
     SND_PCM_ACCESS_RW_NONINTERLEAVED = 4;    { snd_pcm_readn/snd_pcm_writen access }
     SND_PCM_ACCESS_LAST = SND_PCM_ACCESS_RW_NONINTERLEAVED;

type
   { PCM sample format }
     _snd_pcm_format =  Longint;
     snd_pcm_format_t = _snd_pcm_format;
const
	{ Unknown }
	SND_PCM_FORMAT_UNKNOWN = -1;
	{ Signed 8 bit }
	SND_PCM_FORMAT_S8 = 0;
	{ Unsigned 8 bit }
	SND_PCM_FORMAT_U8 = 1;
	{ Signed 16 bit Little Endian }
	SND_PCM_FORMAT_S16_LE = 2;
	{ Signed 16 bit Big Endian }
	SND_PCM_FORMAT_S16_BE = 3;
	{ Unsigned 16 bit Little Endian }
	SND_PCM_FORMAT_U16_LE = 4;
	{ Unsigned 16 bit Big Endian }
	SND_PCM_FORMAT_U16_BE = 5;
	{ Signed 24 bit Little Endian }
	SND_PCM_FORMAT_S24_LE = 6;
	{ Signed 24 bit Big Endian }
	SND_PCM_FORMAT_S24_BE = 7;
	{ Unsigned 24 bit Little Endian }
	SND_PCM_FORMAT_U24_LE = 8;
	{ Unsigned 24 bit Big Endian }
	SND_PCM_FORMAT_U24_BE = 9;
	{ Signed 32 bit Little Endian }
	SND_PCM_FORMAT_S32_LE = 10;
	{ Signed 32 bit Big Endian }
	SND_PCM_FORMAT_S32_BE = 11;
	{ Unsigned 32 bit Little Endian }
	SND_PCM_FORMAT_U32_LE = 12;
	{ Unsigned 32 bit Big Endian }
	SND_PCM_FORMAT_U32_BE = 13;
	{ Float 32 bit Little Endian, Range -1.0 to 1.0 }
	SND_PCM_FORMAT_FLOAT_LE = 14;
	{ Float 32 bit Big Endian, Range -1.0 to 1.0 }
	SND_PCM_FORMAT_FLOAT_BE = 15;
	{ Float 64 bit Little Endian, Range -1.0 to 1.0 }
	SND_PCM_FORMAT_FLOAT64_LE = 16;
	{ Float 64 bit Big Endian, Range -1.0 to 1.0 }
	SND_PCM_FORMAT_FLOAT64_BE = 17;
	{ IEC-958 Little Endian }
	SND_PCM_FORMAT_IEC958_SUBFRAME_LE = 18;
	{ IEC-958 Big Endian }
	SND_PCM_FORMAT_IEC958_SUBFRAME_BE = 19;
	{ Mu-Law }
	SND_PCM_FORMAT_MU_LAW = 20;
	{ A-Law }
	SND_PCM_FORMAT_A_LAW = 21;
	{ Ima-ADPCM }
	SND_PCM_FORMAT_IMA_ADPCM = 22;
	{ MPEG }
	SND_PCM_FORMAT_MPEG = 23;
	{ GSM }
	SND_PCM_FORMAT_GSM = 24;
	{ Special }
	SND_PCM_FORMAT_SPECIAL = 31;
	{ Signed 24bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_S24_3LE = 32;
	{ Signed 24bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_S24_3BE = 33;
	{ Unsigned 24bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_U24_3LE = 34;
	{ Unsigned 24bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_U24_3BE = 35;
	{ Signed 20bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_S20_3LE = 36;
	{ Signed 20bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_S20_3BE = 37;
	{ Unsigned 20bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_U20_3LE = 38;
	{ Unsigned 20bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_U20_3BE = 39;
	{ Signed 18bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_S18_3LE = 40;
	{ Signed 18bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_S18_3BE = 41;
	{ Unsigned 18bit Little Endian in 3bytes format }
	SND_PCM_FORMAT_U18_3LE = 42;
	{ Unsigned 18bit Big Endian in 3bytes format }
	SND_PCM_FORMAT_U18_3BE = 43;
	SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_U18_3BE;

{$IFDEF ENDIAN_LITTLE}
	{ Signed 16 bit CPU endian }
	SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_LE;
	{ Unsigned 16 bit CPU endian }
	SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_LE;
	{ Signed 24 bit CPU endian }
	SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_LE;
	{ Unsigned 24 bit CPU endian }
	SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_LE;
	{ Signed 32 bit CPU endian }
	SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_LE;
	{ Unsigned 32 bit CPU endian }
	SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_LE;
	{ Float 32 bit CPU endian }
	SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_LE;
	{ Float 64 bit CPU endian }
	SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_LE;
	{ IEC-958 CPU Endian }
	SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_LE;
{$ENDIF}

{$IFDEF ENDIAN_BIG}
	{ Signed 16 bit CPU endian }
	SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_BE;
	{ Unsigned 16 bit CPU endian }
	SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_BE;
	{ Signed 24 bit CPU endian }
	SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_BE;
	{ Unsigned 24 bit CPU endian }
	SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_BE;
	{ Signed 32 bit CPU endian }
	SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_BE;
	{ Unsigned 32 bit CPU endian }
	SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_BE;
	{ Float 32 bit CPU endian }
	SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_BE;
	{ Float 64 bit CPU endian }
	SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_BE;
	{ IEC-958 CPU Endian }
	SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_BE;
{$ENDIF}

type
  {  PCM sample subformat  }
     _snd_pcm_subformat =  Longint;
     snd_pcm_subformat_t = _snd_pcm_subformat;

const
     SND_PCM_SUBFORMAT_STD = 0; {  Standard  }
     SND_PCM_SUBFORMAT_LAST = SND_PCM_SUBFORMAT_STD;

type
  {  PCM state  }
     _snd_pcm_state =  Longint;
     snd_pcm_state_t = _snd_pcm_state;
const
     SND_PCM_STATE_OPEN = 0;                     { Open  }
     SND_PCM_STATE_SETUP = 1;                    { Setup installed  }
     SND_PCM_STATE_PREPARED = 2;                 { Ready to start  }
     SND_PCM_STATE_RUNNING = 3;                  { Running  }
     SND_PCM_STATE_XRUN = 4;                     { Stopped: underrun (playback) or overrun (capture) detected  }
     SND_PCM_STATE_DRAINING = 5;                 { Draining: running (playback) or stopped (capture)  }
     SND_PCM_STATE_PAUSED = 6;                   { Paused  }
     SND_PCM_STATE_SUSPENDED = 7;                { Hardware is suspended  }
     SND_PCM_STATE_LAST = SND_PCM_STATE_SUSPENDED;

type
  {  PCM start mode  }
     _snd_pcm_start =  Longint;
     snd_pcm_start_t = _snd_pcm_start;
const
     SND_PCM_START_DATA = 0;                     { Automatic start on data read/write  }
     SND_PCM_START_EXPLICIT = 1;                 { Explicit start  }
     SND_PCM_START_LAST = SND_PCM_START_EXPLICIT;

type
  {  PCM xrun mode  }
     _snd_pcm_xrun =  Longint;
     snd_pcm_xrun_t = _snd_pcm_xrun;
const
     SND_PCM_XRUN_NONE = 0;                      { Xrun detection disabled  }
     SND_PCM_XRUN_STOP = 1;                      { Stop on xrun detection  }
     SND_PCM_XRUN_LAST = SND_PCM_XRUN_STOP;

type
  {  PCM timestamp mode  }
     _snd_pcm_tstamp =  Longint;
     snd_pcm_tstamp_t = _snd_pcm_tstamp;
const
     SND_PCM_TSTAMP_NONE = 0;                    { No timestamp  }
     SND_PCM_TSTAMP_MMAP = 1;                    { Update mmap'ed timestamp  }
     SND_PCM_TSTAMP_LAST = SND_PCM_TSTAMP_MMAP;

type
  {  Unsigned frames quantity  }
     snd_pcm_uframes_t = LongWord;
     Psnd_pcm_uframes_t = ^snd_pcm_uframes_t;
  {  Signed frames quantity  }
     snd_pcm_sframes_t = longint;
     Psnd_pcm_sframes_t = ^snd_pcm_sframes_t;
  {  Timestamp  }
     snd_timestamp_t = timeval;
     Psnd_timestamp_t = ^snd_timestamp_t;

const
  {  Non blocking mode (flag for open mode) \hideinitializer  }
     SND_PCM_NONBLOCK = $0001;
  {  Async notification (flag for open mode) \hideinitializer  }
     SND_PCM_ASYNC = $0002;

type
  {  PCM handle  }
     Psnd_pcm_t = pointer;

  {  PCM type  }
     _snd_pcm_type =  Longint;
     snd_pcm_type_t = _snd_pcm_type;
const
  {  PCM type  }
       SND_PCM_TYPE_HW = 0;                      {  Kernel level PCM  }
       SND_PCM_TYPE_HOOKS = 1;                   {  Hooked PCM  }
       SND_PCM_TYPE_MULTI = 2;                   {  One ore more linked PCM with exclusive access to selected  channels  }
       SND_PCM_TYPE_FILE = 3;                    {  File writing plugin  }
       SND_PCM_TYPE_NULL = 4;                    {  Null endpoint PCM  }
       SND_PCM_TYPE_SHM = 5;                     {  Shared memory client PCM  }
       SND_PCM_TYPE_INET = 6;                    {  INET client PCM (not yet implemented)  }
       SND_PCM_TYPE_COPY = 7;                    {  Copying plugin  }
       SND_PCM_TYPE_LINEAR = 8;                  {  Linear format conversion PCM  }
       SND_PCM_TYPE_ALAW = 9;                    {  A-Law format conversion PCM  }
       SND_PCM_TYPE_MULAW = 10;                  {  Mu-Law format conversion PCM  }
       SND_PCM_TYPE_ADPCM = 11;                  {  IMA-ADPCM format conversion PCM  }
       SND_PCM_TYPE_RATE = 12;                   {  Rate conversion PCM  }
       SND_PCM_TYPE_ROUTE = 13;                  {  Attenuated static route PCM  }
       SND_PCM_TYPE_PLUG = 14;                   {  Format adjusted PCM  }
       SND_PCM_TYPE_SHARE = 15;                  {  Sharing PCM  }
       SND_PCM_TYPE_METER = 16;                  {  Meter plugin  }
       SND_PCM_TYPE_MIX = 17;                    {  Mixing PCM  }
       SND_PCM_TYPE_DROUTE = 18;                 {  Attenuated dynamic route PCM (not yet implemented)  }
       SND_PCM_TYPE_LBSERVER = 19;               {  Loopback server plugin (not yet implemented)  }
       SND_PCM_TYPE_LINEAR_FLOAT = 20;           {  Linear Integer <-> Linear Float format conversion PCM  }
       SND_PCM_TYPE_LADSPA = 21;                 {  LADSPA integration plugin  }


  type

  {  PCM area specification  }
     _snd_pcm_channel_area = record
          addr : pointer;                        {  base address of channel samples  }
          first : LongWord;                      {  offset to first sample in bits  }
          step : LongWord;                       {  samples distance in bits  }
       end;
     snd_pcm_channel_area_t = _snd_pcm_channel_area;
     Psnd_pcm_channel_area_t = ^snd_pcm_channel_area_t;

  {  PCM synchronization ID  }
     _snd_pcm_sync_id = record
         case longint of
            0 : ( id : array[0..15] of byte );   {  8-bit ID  }
            1 : ( id16 : array[0..7] of word );  {  16-bit ID  }
            2 : ( id32 : array[0..3] of LongWord );  {  32-bit ID  }
         end;
     snd_pcm_sync_id_t = _snd_pcm_sync_id;

  {  #SND_PCM_TYPE_METER scope handle  }
     Psnd_pcm_scope_t = pointer;

type
  snd_pcm_open_t = function(var pcm:Psnd_pcm_t; name:Pchar; stream:snd_pcm_stream_t; mode:longint):longint;cdecl;
  snd_pcm_open_lconf_t = function(var pcm:Psnd_pcm_t; name:Pchar; stream:snd_pcm_stream_t; mode:longint; lconf:Psnd_config_t):longint;cdecl;
  snd_pcm_close_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_name_t = function(pcm:Psnd_pcm_t):Pchar;cdecl;
  snd_pcm_type_t_t = function(pcm:Psnd_pcm_t):snd_pcm_type_t;cdecl;
  snd_pcm_stream_t_t = function(pcm:Psnd_pcm_t):snd_pcm_stream_t;cdecl;
  snd_pcm_poll_descriptors_count_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_poll_descriptors_t = function(pcm:Psnd_pcm_t; var pfds:pollfd; space:LongWord):longint;cdecl;
  snd_pcm_poll_descriptors_revents_t = function(pcm:Psnd_pcm_t; var pfds:pollfd; nfds:LongWord; revents:Pword):longint;cdecl;
  snd_pcm_set_nonblock_t = function(pcm:Psnd_pcm_t; nonblock:longint):longint;cdecl;
//  snd_async_add_pcm_handler_t = function(var handler:Psnd_async_handler_t; pcm:Psnd_pcm_t; callback:snd_async_callback_t; private_data:pointer):longint;cdecl;
  snd_async_handler_get_pcm_t = function(handler:Psnd_async_handler_t):Psnd_pcm_t;cdecl;
  snd_pcm_info_t = function(pcm:Psnd_pcm_t; info:Psnd_pcm_info_t):longint;cdecl;
  snd_pcm_hw_params_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_current_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_free_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_sw_params_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t):longint;cdecl;
  snd_pcm_sw_params_current_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t):longint;cdecl;
  snd_pcm_prepare_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_reset_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_status_t = function(pcm:Psnd_pcm_t; status:Psnd_pcm_status_t):longint;cdecl;
  snd_pcm_start_t_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_drop_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_drain_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_pause_t = function(pcm:Psnd_pcm_t; enable:longint):longint;cdecl;
  snd_pcm_state_t_t = function(pcm:Psnd_pcm_t):snd_pcm_state_t;cdecl;
  snd_pcm_hwsync_t = function(pcm: Psnd_pcm_t):longint;cdecl;
  snd_pcm_delay_t = function(pcm:Psnd_pcm_t; delayp:Psnd_pcm_sframes_t):longint;cdecl;
  snd_pcm_resume_t = function(pcm:Psnd_pcm_t):longint;cdecl;
  snd_pcm_avail_update_t = function(pcm:Psnd_pcm_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_rewind_t = function(pcm:Psnd_pcm_t; frames:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_writei_t = function(pcm:Psnd_pcm_t; buffer:pointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_readi_t = function(pcm:Psnd_pcm_t; buffer:pointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_writen_t = function(pcm:Psnd_pcm_t; bufs:Ppointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_readn_t = function(pcm:Psnd_pcm_t; bufs:Ppointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_wait_t = function(pcm:Psnd_pcm_t; timeout:longint):longint;cdecl;
  snd_pcm_link_t = function(pcm1:Psnd_pcm_t; pcm2:Psnd_pcm_t):longint;cdecl;
  snd_pcm_unlink_t = function(pcm:Psnd_pcm_t):longint;cdecl;

  snd_pcm_info_sizeof_t = function:size_t;cdecl;
  snd_pcm_info_malloc_t = function(var obj:Psnd_pcm_info_t):LongInt;cdecl;
  snd_pcm_info_free_t = procedure(obj:Psnd_pcm_info_t);cdecl;
  snd_pcm_info_copy_t = procedure(dst:Psnd_pcm_info_t; src:Psnd_pcm_info_t);cdecl;
  snd_pcm_info_get_device_t = function(obj:Psnd_pcm_info_t):LongWord;cdecl;
  snd_pcm_info_get_subdevice_t = function(obj:Psnd_pcm_info_t):LongWord;cdecl;
  snd_pcm_info_get_stream_t = function(obj:Psnd_pcm_info_t):snd_pcm_stream_t;cdecl;
  snd_pcm_info_get_card_t = function(obj:Psnd_pcm_info_t):longint;cdecl;
  snd_pcm_info_get_id_t = function(obj:Psnd_pcm_info_t):Pchar;cdecl;
  snd_pcm_info_get_name_t = function(obj:Psnd_pcm_info_t):Pchar;cdecl;
  snd_pcm_info_get_subdevice_name_t = function(obj:Psnd_pcm_info_t):Pchar;cdecl;
  snd_pcm_info_get_class_t = function(obj:Psnd_pcm_info_t):snd_pcm_class_t;cdecl;
  snd_pcm_info_get_subclass_t = function(obj:Psnd_pcm_info_t):snd_pcm_subclass_t;cdecl;
  snd_pcm_info_get_subdevices_count_t = function(obj:Psnd_pcm_info_t):LongWord;cdecl;
  snd_pcm_info_get_subdevices_avail_t = function(obj:Psnd_pcm_info_t):LongWord;cdecl;
  snd_pcm_info_get_sync_t = function(obj:Psnd_pcm_info_t):snd_pcm_sync_id_t;cdecl;
  snd_pcm_info_set_device_t = procedure(obj:Psnd_pcm_info_t; val:LongWord);cdecl;
  snd_pcm_info_set_subdevice_t = procedure(obj:Psnd_pcm_info_t; val:LongWord);cdecl;
  snd_pcm_info_set_stream_t = procedure(obj:Psnd_pcm_info_t; val:snd_pcm_stream_t);cdecl;
    {
       Hardware Parameters
       See the \ref pcm page for more details.
    }
  snd_pcm_hw_params_any_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_can_mmap_sample_resolution_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_is_double_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_is_batch_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_is_block_transfer_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_can_overrange_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_can_pause_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_can_resume_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_is_half_duplex_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_is_joint_duplex_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_can_sync_start_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_get_rate_numden_t = function(params:Psnd_pcm_hw_params_t; rate_num:PLongWord; rate_den:PLongWord):longint;cdecl;
  snd_pcm_hw_params_get_sbits_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_get_fifo_size_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;

  snd_pcm_hw_params_sizeof_t = function:size_t;cdecl;
  snd_pcm_hw_params_malloc_t = function(var obj:Psnd_pcm_hw_params_t):LongInt;cdecl;
  snd_pcm_hw_params_free_t = procedure(obj:Psnd_pcm_hw_params_t);cdecl;
  snd_pcm_hw_params_copy_t = procedure(dst:Psnd_pcm_hw_params_t; src:Psnd_pcm_hw_params_t);cdecl;
  snd_pcm_hw_params_get_access_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_test_access_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_access_t):longint;cdecl;
  snd_pcm_hw_params_set_access_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_access_t):longint;cdecl;
  snd_pcm_hw_params_set_access_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_access_t;cdecl;
  snd_pcm_hw_params_set_access_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_access_t;cdecl;
  snd_pcm_hw_params_set_access_mask_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_access_mask_t):longint;cdecl;
  snd_pcm_hw_params_get_access_mask_t = procedure(params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_access_mask_t);cdecl;
  snd_pcm_hw_params_get_format_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_test_format_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_format_t):longint;cdecl;
  snd_pcm_hw_params_set_format_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_format_t):longint;cdecl;
  snd_pcm_hw_params_set_format_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_format_t;cdecl;
  snd_pcm_hw_params_set_format_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_format_t;cdecl;
  snd_pcm_hw_params_set_format_mask_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_format_mask_t):longint;cdecl;
  snd_pcm_hw_params_get_format_mask_t = procedure(params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_format_mask_t);cdecl;
  snd_pcm_hw_params_test_subformat_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_subformat_t):longint;cdecl;
  snd_pcm_hw_params_get_subformat_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_set_subformat_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_subformat_t):longint;cdecl;
  snd_pcm_hw_params_set_subformat_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_subformat_t;cdecl;
  snd_pcm_hw_params_set_subformat_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_subformat_t;cdecl;
  snd_pcm_hw_params_set_subformat_mask_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_subformat_mask_t):longint;cdecl;
  snd_pcm_hw_params_get_subformat_mask_t = procedure(params:Psnd_pcm_hw_params_t; mask:Psnd_pcm_subformat_mask_t);cdecl;
  snd_pcm_hw_params_get_channels_t = function(params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_get_channels_min_t = function(params:Psnd_pcm_hw_params_t):LongWord;cdecl;
  snd_pcm_hw_params_get_channels_max_t = function(params:Psnd_pcm_hw_params_t):LongWord;cdecl;
  snd_pcm_hw_params_test_channels_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord):longint;cdecl;
  snd_pcm_hw_params_set_channels_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord):longint;cdecl;
  snd_pcm_hw_params_set_channels_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord):longint;cdecl;
  snd_pcm_hw_params_set_channels_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord):longint;cdecl;
  snd_pcm_hw_params_set_channels_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; max:PLongWord):longint;cdecl;
  snd_pcm_hw_params_set_channels_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord):LongWord;cdecl;
  snd_pcm_hw_params_set_channels_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):LongWord;cdecl;
  snd_pcm_hw_params_set_channels_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):LongWord;cdecl;
  snd_pcm_hw_params_get_rate_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_get_rate_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_rate_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_test_rate_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_rate_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_rate_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_rate_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_rate_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; mindir:Plongint; max:PLongWord;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_rate_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_rate_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_rate_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_period_time_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_get_period_time_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_period_time_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_test_period_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_period_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_period_time_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_time_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_time_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; mindir:Plongint; max:PLongWord;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_time_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_period_time_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_period_time_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_period_size_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):snd_pcm_sframes_t;cdecl;
  snd_pcm_hw_params_get_period_size_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_get_period_size_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_test_period_size_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_period_size_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_period_size_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:Psnd_pcm_uframes_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_size_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:Psnd_pcm_uframes_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_size_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:Psnd_pcm_uframes_t; mindir:Plongint; max:Psnd_pcm_uframes_t;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_period_size_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t; dir:Plongint):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_set_period_size_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_set_period_size_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_set_period_size_integer_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_get_periods_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_get_periods_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_periods_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_test_periods_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_periods_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_periods_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_periods_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_periods_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; mindir:Plongint; max:PLongWord;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_periods_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_periods_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_periods_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_periods_integer_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):longint;cdecl;
  snd_pcm_hw_params_get_buffer_time_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_get_buffer_time_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_buffer_time_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_test_buffer_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_buffer_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_buffer_time_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_buffer_time_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_buffer_time_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; mindir:Plongint; max:PLongWord;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_buffer_time_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_buffer_time_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_buffer_time_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_buffer_size_t = function(params:Psnd_pcm_hw_params_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_hw_params_get_buffer_size_min_t = function(params:Psnd_pcm_hw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_get_buffer_size_max_t = function(params:Psnd_pcm_hw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_test_buffer_size_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_hw_params_set_buffer_size_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_hw_params_set_buffer_size_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:Psnd_pcm_uframes_t):longint;cdecl;
  snd_pcm_hw_params_set_buffer_size_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:Psnd_pcm_uframes_t):longint;cdecl;
  snd_pcm_hw_params_set_buffer_size_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:Psnd_pcm_uframes_t; max:Psnd_pcm_uframes_t):longint;cdecl;
  snd_pcm_hw_params_set_buffer_size_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:snd_pcm_uframes_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_set_buffer_size_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_set_buffer_size_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_hw_params_get_tick_time_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_get_tick_time_min_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_get_tick_time_max_t = function(params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_test_tick_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_tick_time_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:longint):longint;cdecl;
  snd_pcm_hw_params_set_tick_time_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_tick_time_max_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:PLongWord; dir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_tick_time_minmax_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; min:PLongWord; mindir:Plongint; max:PLongWord;
               maxdir:Plongint):longint;cdecl;
  snd_pcm_hw_params_set_tick_time_near_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; val:LongWord; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_tick_time_first_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
  snd_pcm_hw_params_set_tick_time_last_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_hw_params_t; dir:Plongint):LongWord;cdecl;
    { New function added in alsa-lib-0.9.0-rc5 }
  snd_pcm_hw_params_get_min_align_t = function(params: Psnd_pcm_hw_params_t; var val: snd_pcm_uframes_t):longint;cdecl;

    {
       Software Parameters
    }
    // function snd_pcm_sw_params_current(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t):longint;cdecl;external asoundlib_name;
  snd_pcm_sw_params_sizeof_t = function:size_t;cdecl;
  snd_pcm_sw_params_malloc_t = function(var obj:Psnd_pcm_sw_params_t):LongInt;cdecl;
  snd_pcm_sw_params_free_t = procedure(obj:Psnd_pcm_sw_params_t);cdecl;
  snd_pcm_sw_params_copy_t = procedure(dst:Psnd_pcm_sw_params_t; src:Psnd_pcm_sw_params_t);cdecl;
  snd_pcm_sw_params_set_tstamp_mode_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_tstamp_t):longint;cdecl;
  snd_pcm_sw_params_get_tstamp_mode_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_tstamp_t;cdecl;

  snd_pcm_sw_params_set_sleep_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:LongWord):longint;cdecl;
  snd_pcm_sw_params_get_sleep_min_t = function(params:Psnd_pcm_sw_params_t):LongWord;cdecl;
  snd_pcm_sw_params_set_avail_min_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_avail_min_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_sw_params_set_xfer_align_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_xfer_align_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_sw_params_set_start_threshold_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_start_threshold_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_sw_params_set_stop_threshold_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_stop_threshold_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;

  snd_pcm_sw_params_set_silence_threshold_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_silence_threshold_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_sw_params_set_silence_size_t = function(pcm:Psnd_pcm_t; params:Psnd_pcm_sw_params_t; val:snd_pcm_uframes_t):longint;cdecl;
  snd_pcm_sw_params_get_silence_size_t = function(params:Psnd_pcm_sw_params_t):snd_pcm_uframes_t;cdecl;

    {
       Access Mask Functions
    }
  snd_pcm_access_mask_sizeof_t = function:size_t;cdecl;
  snd_pcm_access_mask_malloc_t = function(var obj:Psnd_pcm_access_mask_t):LongInt;cdecl;
  snd_pcm_access_mask_free_t = procedure(obj:Psnd_pcm_access_mask_t);cdecl;
  snd_pcm_access_mask_copy_t = procedure(dst:Psnd_pcm_access_mask_t; src:Psnd_pcm_access_mask_t);cdecl;
  snd_pcm_access_mask_none_t = procedure(mask:Psnd_pcm_access_mask_t);cdecl;
  snd_pcm_access_mask_any_t = procedure(mask:Psnd_pcm_access_mask_t);cdecl;
  snd_pcm_access_mask_test_t = function(mask:Psnd_pcm_access_mask_t; val:snd_pcm_access_t):longint;cdecl;
  snd_pcm_access_mask_empty_t = function(mask:Psnd_pcm_access_mask_t):longint;cdecl;
  snd_pcm_access_mask_set_t = procedure(mask:Psnd_pcm_access_mask_t; val:snd_pcm_access_t);cdecl;
  snd_pcm_access_mask_reset_t = procedure(mask:Psnd_pcm_access_mask_t; val:snd_pcm_access_t);cdecl;
    {
       Format Mask Functions
    }
  snd_pcm_format_mask_sizeof_t = function:size_t;cdecl;
  snd_pcm_format_mask_malloc_t = function(var obj:Psnd_pcm_format_mask_t):LongInt;cdecl;
  snd_pcm_format_mask_free_t = procedure(obj:Psnd_pcm_format_mask_t);cdecl;
  snd_pcm_format_mask_copy_t = procedure(dst:Psnd_pcm_format_mask_t; src:Psnd_pcm_format_mask_t);cdecl;
  snd_pcm_format_mask_none_t = procedure(mask:Psnd_pcm_format_mask_t);cdecl;
  snd_pcm_format_mask_any_t = procedure(mask:Psnd_pcm_format_mask_t);cdecl;
  snd_pcm_format_mask_test_t = function(mask:Psnd_pcm_format_mask_t; val:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_mask_empty_t = function(mask:Psnd_pcm_format_mask_t):longint;cdecl;
  snd_pcm_format_mask_set_t = procedure(mask:Psnd_pcm_format_mask_t; val:snd_pcm_format_t);cdecl;
  snd_pcm_format_mask_reset_t = procedure(mask:Psnd_pcm_format_mask_t; val:snd_pcm_format_t);cdecl;
    {
       Subformat Mask Functions
    }
  snd_pcm_subformat_mask_sizeof_t = function:size_t;cdecl;
  snd_pcm_subformat_mask_malloc_t = function(var obj:Psnd_pcm_subformat_mask_t):LongInt;cdecl;
  snd_pcm_subformat_mask_free_t = procedure(obj:Psnd_pcm_subformat_mask_t);cdecl;
  snd_pcm_subformat_mask_copy_t = procedure(dst:Psnd_pcm_subformat_mask_t; src:Psnd_pcm_subformat_mask_t);cdecl;
  snd_pcm_subformat_mask_none_t = procedure(mask:Psnd_pcm_subformat_mask_t);cdecl;
  snd_pcm_subformat_mask_any_t = procedure(mask:Psnd_pcm_subformat_mask_t);cdecl;
  snd_pcm_subformat_mask_test_t = function(mask:Psnd_pcm_subformat_mask_t; val:snd_pcm_subformat_t):longint;cdecl;
  snd_pcm_subformat_mask_empty_t = function(mask:Psnd_pcm_subformat_mask_t):longint;cdecl;
  snd_pcm_subformat_mask_set_t = procedure(mask:Psnd_pcm_subformat_mask_t; val:snd_pcm_subformat_t);cdecl;
  snd_pcm_subformat_mask_reset_t = procedure(mask:Psnd_pcm_subformat_mask_t; val:snd_pcm_subformat_t);cdecl;
    {
       Status Functions
    }
  snd_pcm_status_sizeof_t = function:size_t;cdecl;
  snd_pcm_status_malloc_t = function(var obj:Psnd_pcm_status_t):LongInt;cdecl;
  snd_pcm_status_free_t = procedure(obj:Psnd_pcm_status_t);cdecl;
  snd_pcm_status_copy_t = procedure(dst:Psnd_pcm_status_t; src:Psnd_pcm_status_t);cdecl;
  snd_pcm_status_get_state_t = function(obj:Psnd_pcm_status_t):snd_pcm_state_t;cdecl;
  snd_pcm_status_get_trigger_tstamp_t = procedure(obj:Psnd_pcm_status_t; ptr:Psnd_timestamp_t);cdecl;
  snd_pcm_status_get_tstamp_t = procedure(obj:Psnd_pcm_status_t; ptr:Psnd_timestamp_t);cdecl;
  snd_pcm_status_get_delay_t = function(obj:Psnd_pcm_status_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_status_get_avail_t = function(obj:Psnd_pcm_status_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_status_get_avail_max_t = function(obj:Psnd_pcm_status_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_status_get_overrange_t = function(obj:Psnd_pcm_status_t):snd_pcm_uframes_t;cdecl;
    {
       Description Functions
    }
  snd_pcm_stream_name_t = function(stream:snd_pcm_stream_t):Pchar;cdecl;
  snd_pcm_access_name_t = function(_access:snd_pcm_access_t):Pchar;cdecl;
  snd_pcm_format_name_t = function(format:snd_pcm_format_t):Pchar;cdecl;
  snd_pcm_format_description_t = function(format:snd_pcm_format_t):Pchar;cdecl;
  snd_pcm_subformat_name_t = function(subformat:snd_pcm_subformat_t):Pchar;cdecl;
  snd_pcm_subformat_description_t = function(subformat:snd_pcm_subformat_t):Pchar;cdecl;
  snd_pcm_format_value_t = function(name:Pchar):snd_pcm_format_t;cdecl;
  snd_pcm_tstamp_mode_name_t = function(mode:snd_pcm_tstamp_t):Pchar;cdecl;
  snd_pcm_state_name_t = function(state:snd_pcm_state_t):Pchar;cdecl;
    {
       Debug Functions
    }
  snd_pcm_dump_t = function(pcm:Psnd_pcm_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_dump_hw_setup_t = function(pcm:Psnd_pcm_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_dump_sw_setup_t = function(pcm:Psnd_pcm_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_dump_setup_t = function(pcm:Psnd_pcm_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_hw_params_dump_t = function(params:Psnd_pcm_hw_params_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_sw_params_dump_t = function(params:Psnd_pcm_sw_params_t; mout:Psnd_output_t):longint;cdecl;
  snd_pcm_status_dump_t = function(status:Psnd_pcm_status_t; mout:Psnd_output_t):longint;cdecl;
    {
       Direct Access (MMAP) Functions
    }
  snd_pcm_mmap_begin_t = function(pcm:Psnd_pcm_t; var areas:Psnd_pcm_channel_area_t; offset:Psnd_pcm_uframes_t; frames:Psnd_pcm_uframes_t):longint;cdecl;
  snd_pcm_mmap_commit_t = function(pcm:Psnd_pcm_t; offset:snd_pcm_uframes_t; frames:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_mmap_writei_t = function(pcm:Psnd_pcm_t; buffer:pointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_mmap_readi_t = function(pcm:Psnd_pcm_t; buffer:pointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_mmap_writen_t = function(pcm:Psnd_pcm_t; bufs:Ppointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_mmap_readn_t = function(pcm:Psnd_pcm_t; bufs:Ppointer; size:snd_pcm_uframes_t):snd_pcm_sframes_t;cdecl;
    {
       Helper Functions
    }
  snd_pcm_format_signed_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_unsigned_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_linear_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_is_float_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_little_endian_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_big_endian_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_cpu_endian_t = function(format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_format_width_t = function(format:snd_pcm_format_t):longint;cdecl;
    { in bits  }
  snd_pcm_format_physical_width_t = function(format:snd_pcm_format_t):longint;cdecl;
    { in bits  }
  snd_pcm_build_linear_format_t = function(width:longint; pwidth:longint; unsignd:longint; big_endian:longint):snd_pcm_format_t;cdecl;
  snd_pcm_format_size_t = function(format:snd_pcm_format_t; samples:size_t):ssize_t;cdecl;
  snd_pcm_format_silence_t = function(format:snd_pcm_format_t):u_int8_t;cdecl;
  snd_pcm_format_silence_16_t = function(format:snd_pcm_format_t):u_int16_t;cdecl;
  snd_pcm_format_silence_32_t = function(format:snd_pcm_format_t):u_int32_t;cdecl;
//  snd_pcm_format_silence_64_t = function(format:snd_pcm_format_t):u_int64_t;cdecl;
  snd_pcm_format_set_silence_t = function(format:snd_pcm_format_t; buf:pointer; samples:LongWord):longint;cdecl;
  snd_pcm_bytes_to_frames_t = function(pcm:Psnd_pcm_t; bytes:ssize_t):snd_pcm_sframes_t;cdecl;
  snd_pcm_frames_to_bytes_t = function(pcm:Psnd_pcm_t; frames:snd_pcm_sframes_t):ssize_t;cdecl;
  snd_pcm_bytes_to_samples_t = function(pcm:Psnd_pcm_t; bytes:ssize_t):longint;cdecl;
  snd_pcm_samples_to_bytes_t = function(pcm:Psnd_pcm_t; samples:longint):ssize_t;cdecl;
  snd_pcm_area_silence_t = function(dst_channel:Psnd_pcm_channel_area_t; dst_offset:snd_pcm_uframes_t; samples:LongWord; format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_areas_silence_t = function(dst_channels:Psnd_pcm_channel_area_t; dst_offset:snd_pcm_uframes_t; channels:LongWord; frames:snd_pcm_uframes_t; format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_area_copy_t = function(dst_channel:Psnd_pcm_channel_area_t; dst_offset:snd_pcm_uframes_t; src_channel:Psnd_pcm_channel_area_t; src_offset:snd_pcm_uframes_t; samples:LongWord;
               format:snd_pcm_format_t):longint;cdecl;
  snd_pcm_areas_copy_t = function(dst_channels:Psnd_pcm_channel_area_t; dst_offset:snd_pcm_uframes_t; src_channels:Psnd_pcm_channel_area_t; src_offset:snd_pcm_uframes_t; channels:LongWord;
               frames:snd_pcm_uframes_t; format:snd_pcm_format_t):longint;cdecl;
    {
       Hook Extension
    }
type
    {  type of pcm hook  }
       _snd_pcm_hook_type =  Longint;
       snd_pcm_hook_type_t = _snd_pcm_hook_type;
const
         SND_PCM_HOOK_TYPE_HW_PARAMS = 0;
         SND_PCM_HOOK_TYPE_HW_FREE = 1;
         SND_PCM_HOOK_TYPE_CLOSE = 2;
         SND_PCM_HOOK_TYPE_LAST = SND_PCM_HOOK_TYPE_CLOSE;

type
    {  PCM hook container  }
       Psnd_pcm_hook_t = pointer;
    {  PCM hook callback function  }
       snd_pcm_hook_func_t = function (hook:Psnd_pcm_hook_t):longint;cdecl;
type

  snd_pcm_hook_get_pcm_t = function(hook:Psnd_pcm_hook_t):Psnd_pcm_t;cdecl;
  snd_pcm_hook_get_private_t = function(hook:Psnd_pcm_hook_t):pointer;cdecl;
  snd_pcm_hook_set_private_t = procedure(hook:Psnd_pcm_hook_t; private_data:pointer);cdecl;
  snd_pcm_hook_add_t = function(var hookp:Psnd_pcm_hook_t; pcm:Psnd_pcm_t; _type:snd_pcm_hook_type_t; func:snd_pcm_hook_func_t; private_data:pointer):longint;cdecl;
  snd_pcm_hook_remove_t = function(hook:Psnd_pcm_hook_t):longint;cdecl;
    {
       Scope Plugin Extension
    }
type
    {  #SND_PCM_TYPE_METER scope functions  }
       _snd_pcm_scope_ops = record
            enable : function (scope:Psnd_pcm_scope_t):longint;cdecl; {  Enable and prepare it using current params  }
            disable : procedure (scope:Psnd_pcm_scope_t);             {  Disable  }
            start : procedure (scope:Psnd_pcm_scope_t);               {  PCM has been started  }
            stop : procedure (scope:Psnd_pcm_scope_t);                {  PCM has been stopped  }
            update : procedure (scope:Psnd_pcm_scope_t);              {  New frames are present  }
            reset : procedure (scope:Psnd_pcm_scope_t);               {  Reset status  }
            close : procedure (scope:Psnd_pcm_scope_t);               {  PCM is closing  }
         end;
       snd_pcm_scope_ops_t = _snd_pcm_scope_ops;
       Psnd_pcm_scope_ops_t = ^snd_pcm_scope_ops_t;

  snd_pcm_meter_get_bufsize_t = function(pcm:Psnd_pcm_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_meter_get_channels_t = function(pcm:Psnd_pcm_t):LongWord;cdecl;
  snd_pcm_meter_get_rate_t = function(pcm:Psnd_pcm_t):LongWord;cdecl;
  snd_pcm_meter_get_now_t = function(pcm:Psnd_pcm_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_meter_get_boundary_t = function(pcm:Psnd_pcm_t):snd_pcm_uframes_t;cdecl;
  snd_pcm_meter_add_scope_t = function(pcm:Psnd_pcm_t; scope:Psnd_pcm_scope_t):longint;cdecl;
  snd_pcm_meter_search_scope_t = function(pcm:Psnd_pcm_t; name:Pchar):Psnd_pcm_scope_t;cdecl;
  snd_pcm_scope_malloc_t = function(var ptr:Psnd_pcm_scope_t):longint;cdecl;
  snd_pcm_scope_set_ops_t = procedure(scope:Psnd_pcm_scope_t; val:Psnd_pcm_scope_ops_t);cdecl;
  snd_pcm_scope_set_name_t = procedure(scope:Psnd_pcm_scope_t; val:Pchar);cdecl;
  snd_pcm_scope_get_name_t = function(scope:Psnd_pcm_scope_t):Pchar;cdecl;
  snd_pcm_scope_get_callback_private_t = function(scope:Psnd_pcm_scope_t):pointer;cdecl;
  snd_pcm_scope_set_callback_private_t = procedure(scope:Psnd_pcm_scope_t; val:pointer);cdecl;
  snd_pcm_scope_s16_open_t = function(pcm:Psnd_pcm_t; name:Pchar; var scopep:Psnd_pcm_scope_t):longint;cdecl;
  snd_pcm_scope_s16_get_channel_buffer_t = function(scope:Psnd_pcm_scope_t; channel:LongWord):Pint16_t;cdecl;

var

  snd_pcm_close : snd_pcm_close_t;
  snd_pcm_drop : snd_pcm_drop_t;
  snd_pcm_drain : snd_pcm_drain_t;
  snd_pcm_hw_params_malloc : snd_pcm_hw_params_malloc_t;
  snd_pcm_hw_params_any : snd_pcm_hw_params_any_t;
  snd_pcm_hw_params_get_periods : snd_pcm_hw_params_get_periods_t;
  snd_pcm_hw_params_get_period_size : snd_pcm_hw_params_get_period_size_t;
  snd_pcm_hw_params_get_rate : snd_pcm_hw_params_get_rate_t;
  snd_pcm_hw_params_set_access : snd_pcm_hw_params_set_access_t;
  snd_pcm_hw_params_set_buffer_size : snd_pcm_hw_params_set_buffer_size_t;
  snd_pcm_hw_params_set_buffer_size_near : snd_pcm_hw_params_set_buffer_size_near_t;
  snd_pcm_hw_params_set_channels : snd_pcm_hw_params_set_channels_t;
  snd_pcm_hw_params_set_format : snd_pcm_hw_params_set_format_t;
  snd_pcm_hw_params_set_period_size_near : snd_pcm_hw_params_set_period_size_near_t;
  snd_pcm_hw_params_set_periods_near : snd_pcm_hw_params_set_periods_near_t;
  snd_pcm_hw_params_set_rate_near : snd_pcm_hw_params_set_rate_near_t;
  snd_pcm_hw_params : snd_pcm_hw_params_t;
  snd_pcm_hw_params_free : snd_pcm_hw_params_free_t;
  snd_pcm_info_get_device : snd_pcm_info_get_device_t;
  snd_pcm_info_get_name : snd_pcm_info_get_name_t;
  snd_pcm_info_set_device : snd_pcm_info_set_device_t;
  snd_pcm_mmap_readi : snd_pcm_mmap_readi_t;
  snd_pcm_mmap_writei : snd_pcm_mmap_writei_t;
  snd_pcm_open : snd_pcm_open_t;
  snd_pcm_pause : snd_pcm_pause_t;
  snd_pcm_prepare : snd_pcm_prepare_t;
  snd_pcm_readi : snd_pcm_readi_t;
  snd_pcm_reset : snd_pcm_reset_t;
  snd_pcm_resume : snd_pcm_resume_t;
  snd_pcm_state : snd_pcm_state_t_t;
  snd_pcm_stream : snd_pcm_stream_t_t;
  snd_pcm_writei : snd_pcm_writei_t;

// Mixer types

type

  psnd_ctl_card_info_t = Pointer;
  ppsnd_ctl_card_info_t = ^psnd_ctl_card_info_t;
  psnd_ctl_t = Pointer;
  ppsnd_ctl_t = ^psnd_ctl_t;


type

  snd_ctl_card_info_sizeof_t = function : Integer; cdecl;
  snd_ctl_card_info_malloc_t = function(ptr : ppsnd_ctl_card_info_t) : Integer; cdecl;
  snd_ctl_card_info_free_t = procedure(obj : psnd_ctl_card_info_t); cdecl;
  snd_ctl_card_info_clear_t = procedure(obj : psnd_ctl_card_info_t); cdecl;
  snd_ctl_card_info_copy_t = procedure(dst, src : psnd_ctl_card_info_t); cdecl;
  snd_ctl_card_info_get_card_t = function(obj : psnd_ctl_card_info_t) : Integer; cdecl;
  snd_ctl_card_info_get_id_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;
  snd_ctl_card_info_get_driver_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;
  snd_ctl_card_info_get_name_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;
  snd_ctl_card_info_get_longname_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;
  snd_ctl_card_info_get_mixername_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;
  snd_ctl_card_info_get_components_t = function(obj : psnd_ctl_card_info_t) : PChar; cdecl;



implementation

var
  Path : string;
  Libhandle : Pointer;

initialization

  Path := FindLibs(asoundlib_path);
  if Path <> '' then Libhandle := dlopen(@Path[1], RTLD_NOW or RTLD_GLOBAL);
  if Libhandle <> nil then
  begin
    AsoundlibLoaded := True;
    snd_pcm_close := dlsym(Libhandle, 'snd_pcm_close');
    snd_pcm_drop := dlsym(Libhandle, 'snd_pcm_drop');
    snd_pcm_drain := dlsym(Libhandle, 'snd_pcm_drain');
    snd_pcm_hw_params_malloc := dlsym(Libhandle, 'snd_pcm_hw_params_malloc');
    snd_pcm_hw_params_any := dlsym(Libhandle, 'snd_pcm_hw_params_any');
    snd_pcm_hw_params_get_periods := dlsym(Libhandle, 'snd_pcm_hw_params_get_periods');
    snd_pcm_hw_params_get_period_size := dlsym(Libhandle, 'snd_pcm_hw_params_get_period_size');
    snd_pcm_hw_params_get_rate := dlsym(Libhandle, 'snd_pcm_hw_params_get_rate');
    snd_pcm_hw_params_set_access := dlsym(Libhandle, 'snd_pcm_hw_params_set_access');
    snd_pcm_hw_params_set_buffer_size := dlsym(Libhandle, 'snd_pcm_hw_params_set_buffer_size');
    snd_pcm_hw_params_set_buffer_size_near := dlsym(Libhandle, 'snd_pcm_hw_params_set_buffer_size_near');
    snd_pcm_hw_params_set_channels := dlsym(Libhandle, 'snd_pcm_hw_params_set_channels');
    snd_pcm_hw_params_set_format := dlsym(Libhandle, 'snd_pcm_hw_params_set_format');
    snd_pcm_hw_params_set_period_size_near := dlsym(Libhandle, 'snd_pcm_hw_params_set_period_size_near');
    snd_pcm_hw_params_set_periods_near := dlsym(Libhandle, 'snd_pcm_hw_params_set_periods_near');
    snd_pcm_hw_params_set_rate_near := dlsym(Libhandle, 'snd_pcm_hw_params_set_rate_near');
    snd_pcm_hw_params := dlsym(Libhandle, 'snd_pcm_hw_params');
    snd_pcm_hw_params_free := dlsym(Libhandle, 'snd_pcm_hw_params_free');
    snd_pcm_info_get_device := dlsym(Libhandle, 'snd_pcm_info_get_device');
    snd_pcm_info_get_name := dlsym(Libhandle, 'snd_pcm_info_get_name');
    snd_pcm_info_set_device := dlsym(Libhandle, 'snd_pcm_info_set_device');
    snd_pcm_mmap_readi := dlsym(Libhandle, 'snd_pcm_mmap_readi');
    snd_pcm_mmap_writei := dlsym(Libhandle, 'snd_pcm_mmap_writei');
    snd_pcm_open := dlsym(Libhandle, 'snd_pcm_open');
    snd_pcm_pause := dlsym(Libhandle, 'snd_pcm_pause');
    snd_pcm_prepare := dlsym(Libhandle, 'snd_pcm_prepare');
    snd_pcm_readi := dlsym(Libhandle, 'snd_pcm_readi');
    snd_pcm_reset := dlsym(Libhandle, 'snd_pcm_reset');
    snd_pcm_resume := dlsym(Libhandle, 'snd_pcm_resume');
    snd_pcm_state := dlsym(Libhandle, 'snd_pcm_state');
    snd_pcm_stream := dlsym(Libhandle, 'snd_pcm_stream');
    snd_pcm_writei := dlsym(Libhandle, 'snd_pcm_writei');
  end;

finalization

  if Libhandle <> nil then dlclose(Libhandle);


end.
