const

(* format base = $10000 *)
  AL_FORMAT_IMA_ADPCM_MONO16_EXT            = $10000;
  AL_FORMAT_IMA_ADPCM_STEREO16_EXT          = $10001;
  AL_FORMAT_WAVE_EXT                        = $10002;
  AL_FORMAT_VORBIS_EXT                      = $10003;

(* four point formats *)
  AL_FORMAT_QUAD8_LOKI                      = $10004;
  AL_FORMAT_QUAD16_LOKI                     = $10005;

(**
 * token extensions, base = $20000
 *)

(* deprecated, use AL_GAIN *)
  AL_GAIN_LINEAR_LOKI                      = $20000;

(*
 * types for special loaders.  This should be deprecated in favor
 * of the special format tags.
 *)
type
  PWaveFMT                          = ^WaveFMT;
  WaveFMT                           = packed record
    encoding        : ALushort;
    channels        : ALushort;      (* 1 = mono, 2 = stereo *)
    frequency       : ALuint;        (* One of 11025, 22050, or 44100 Hz *)
    byterate        : ALuint;        (* Average bytes per second *)
    blockalign      : ALushort;      (* Bytes per sample block *)
    bitspersample   : ALushort;
  end;

  PalWaveFMT_LOKI                   = ^alWaveFMT_LOKI;
  alWaveFMT_LOKI                    = WaveFMT;

  P_MS_ADPCM_decodestate            = ^_MS_ADPCM_decodestate;
  _MS_ADPCM_decodestate             = packed record
    hPredictor      : ALubyte;
    iDelta          : ALushort;
    iSamp1          : ALshort;
    iSamp2          : ALshort;
  end;

  PalMSADPCM_decodestate_LOKI       = ^alMSADPCM_decodestate_LOKI;
  alMSADPCM_decodestate_LOKI        = _MS_ADPCM_decodestate;

  PMS_ADPCM_decoder                 = ^MS_ADPCM_decoder;
  MS_ADPCM_decoder                  = packed record
    wavefmt         : alWaveFMT_LOKI;
    wSamplesPerBlock: ALushort;
    wNumCoef        : ALushort;
    aCoeff          : array[0..6] of array[0..1] of ALshort;
    (* * * *)
    state           : array[0..1] of alMSADPCM_decodestate_LOKI;
  end;

  PalMSADPCM_state_LOKI             = ^alMSADPCM_state_LOKI;
  alMSADPCM_state_LOKI              = MS_ADPCM_decoder;

  PIMA_ADPCM_decodestate_s          = ^IMA_ADPCM_decodestate_s;
  IMA_ADPCM_decodestate_s           = packed record
    valprev         : ALint;      (* Previous output value *)
    index           : ALbyte;       (* Index into stepsize table *)
  end;

  PalIMAADPCM_decodestate_LOKI      = ^alIMAADPCM_decodestate_LOKI;
  alIMAADPCM_decodestate_LOKI       = IMA_ADPCM_decodestate_s;

  PIMA_ADPCM_decoder                = ^IMA_ADPCM_decoder;
  IMA_ADPCM_decoder                 = packed record
    wavefmt         : alWaveFMT_LOKI;
    wSamplesPerBlock: ALushort;
    (* * * *)
    state           : array[0..1] of alIMAADPCM_decodestate_LOKI;
  end;

  PalIMAADPCM_state_LOKI            = ^alIMAADPCM_state_LOKI;
  alIMAADPCM_state_LOKI             = IMA_ADPCM_decoder;


const
(**
 * Context creation extension tokens
 * base = $200000
 *)

(**
 * followed by ### of sources
 *)
  ALC_SOURCES_LOKI                         = $200000;

(**
 * followed by ### of buffers
 *)
  ALC_BUFFERS_LOKI                         = $200001;

(*
 *  Channel operations are probably a big no-no and destined
 *  for obsolesence.
 *
 *  base = $300000
 *)
  ALC_CHAN_MAIN_LOKI                       = $300000;
  ALC_CHAN_PCM_LOKI                        = $300001;
  ALC_CHAN_CD_LOKI                         = $300002;

(* loki *)
type
  CALLBACK_LOKI = function(a: ALuint; b: ALuint; c: PALshort; d: ALEnum; e: ALint; f: ALint): cint; cdecl;

function alcGetAudioChannel_LOKI(channel: ALuint): ALfloat; cdecl; external;
procedure alcSetAudioChannel_LOKI(channel: ALuint; volume: ALfloat); cdecl; external;
procedure alBombOnError_LOKI; cdecl; external;
procedure alBufferi_LOKI(bid: ALuint; param: ALenum; value: ALint); cdecl; external;
procedure alBufferDataWithCallback_LOKI(bid: ALuint; cb: CALLBACK_LOKI); cdecl; external;
procedure alBufferWriteData_LOKI(buffer: ALuint; format: ALenum; data: PALvoid; size: ALsizei; freq: ALsizei; internalFormat: ALenum); cdecl; external;
procedure alGenStreamingBuffers_LOKI(n: ALsizei; samples: PALuint); cdecl; external;
function alBufferAppendData_LOKI(buffer: ALuint; format: ALenum; data: PALvoid; size: ALsizei; freq: ALsizei): ALsizei; cdecl; external;
function alBufferAppendWriteData_LOKI(buffer: ALuint; format: ALenum; data: PALvoid; size: ALsizei; freq: ALsizei; internalFormat: ALenum): ALsizei; cdecl; external;

(* binary compatibility *)
function alBufferAppendData(buffer: ALuint; format: ALenum; data: PALvoid; size: ALsizei; freq: ALsizei): ALsizei; cdecl; external;

(*
 * Don't use these.  If you're reading this, you should remove these functions
 * and all other reverb functions.  Now.
 *)
procedure alReverbScale_LOKI(sid: ALuint; param: ALfloat); cdecl; external;
procedure alReverbDelay_LOKI(sid: ALuint; param: ALfloat); cdecl; external;

(* Capture api *)

function alCaptureInit_EXT(format: ALenum; rate: ALuint; bufferSize: ALsizei): ALboolean; cdecl; external;
function alCaptureDestroy_EXT: ALboolean; cdecl; external;
function alCaptureStart_EXT: ALboolean; cdecl; external;
function alCaptureStop_EXT: ALboolean; cdecl; external;

(* Non-blocking device read *)

function alCaptureGetData_EXT(data: PALvoid; n: ALsizei; format: ALenum; rate: ALuint): ALsizei; cdecl; external;

(* custom loaders *)

function alutLoadVorbis_LOKI(bid: ALuint; const data: PALvoid; size: ALint): ALboolean; cdecl; external;
function alutLoadMP3_LOKI(bid: ALuint; data: PALvoid; size: ALint): ALboolean; cdecl; external;

(* function pointers *)
{
type
typedef ALfloat   ( ALC_APIENTRY *PFNALCGETAUDIOCHANNELPROC ) ( ALuint channel ): ALfloat; cdecl;
typedef void      ( ALC_APIENTRY *PFNALCSETAUDIOCHANNELPROC ) ( ALuint channel, ALfloat volume ); cdecl;
typedef void      ( AL_APIENTRY *PFNALBOMBONERRORPROC ) ( void ); cdecl;
typedef void      ( AL_APIENTRY *PFNALBUFFERIPROC ) ( ALuint bid, ALenum param, ALint value ); cdecl;
typedef void      ( AL_APIENTRY *PFNALBUFFERDATAWITHCALLBACKPROC ) ( ALuint bid, int ( *Callback ) ( ALuint, ALuint, ALshort *, ALenum, ALint, ALint ) ); cdecl;
typedef void      ( AL_APIENTRY *PFNALBUFFERWRITEDATAPROC ) ( ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq, ALenum internalFormat ); cdecl;
typedef void      ( AL_APIENTRY *PFNALGENSTREAMINGBUFFERSPROC ) ( ALsizei n, ALuint *samples ); cdecl;
typedef ALsizei   ( AL_APIENTRY *PFNALBUFFERAPPENDDATAPROC ) ( ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq ): ALsizei; cdecl;
typedef ALsizei   ( AL_APIENTRY *PFNALBUFFERAPPENDWRITEDATAPROC ) ( ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq, ALenum internalFormat ): ALsizei; cdecl;

typedef ALboolean ( ALC_APIENTRY *PFNALCAPTUREINITPROC ) ( ALenum format, ALuint rate, ALsizei bufferSize ): ALboolean; cdecl;
typedef ALboolean ( ALC_APIENTRY *PFNALCAPTUREDESTROYPROC ) ( void ): ALboolean; cdecl;
typedef ALboolean ( ALC_APIENTRY *PFNALCAPTURESTARTPROC ) ( void ): ALboolean; cdecl;
typedef ALboolean ( ALC_APIENTRY *PFNALCAPTURESTOPPROC ) ( void ): ALboolean; cdecl;

typedef ALsizei   ( ALC_APIENTRY *PFNALCAPTUREGETDATAPROC ) ( ALvoid *data, ALsizei n, ALenum format, ALuint rate ): ALsizei; cdecl;

typedef ALboolean ( AL_APIENTRY *PFNALUTLOADVORBISPROC ) ( ALuint bid, ALvoid *data, ALint size ): ALboolean; cdecl;
typedef ALboolean ( AL_APIENTRY *PFNALUTLOADRAW_ADPCMDATAPROC ) ( ALuint bid, ALvoid *data, ALuint size, ALuint freq, ALenum format ): ALboolean; cdecl;
typedef ALboolean ( AL_APIENTRY *ALUTLOADIMA_ADPCMDATAPROC ) ( ALuint bid, ALvoid *data, ALuint size, alIMAADPCM_state_LOKI *ias ): ALboolean; cdecl;
typedef ALboolean ( AL_APIENTRY *ALUTLOADMS_ADPCMDATAPROC ) ( ALuint bid, void *data, int size, alMSADPCM_state_LOKI *mss ): ALboolean; cdecl;

typedef void      ( AL_APIENTRY *PFNALREVERBSCALEPROC ) ( ALuint sid, ALfloat param ); cdecl;
typedef void      ( AL_APIENTRY *PFNALREVERBDELAYPROC ) ( ALuint sid, ALfloat param ); cdecl;
}