#ifndef _ALTYPES_H_
#define _ALTYPES_H_

/**
 * OpenAL cross platform audio library
 * Copyright (C) 1999-2000 by authors.
 * This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 *  Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 *  License along with this library; if not, write to the
 *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 *  Boston, MA  02111-1307, USA.
 * Or go to http://www.gnu.org/copyleft/lgpl.html
 */


#ifdef __cplusplus
extern "C" {
#endif

/** OpenAL boolean type. */
typedef char ALboolean;

/** OpenAL 8bit signed byte. */
typedef char ALbyte;

/** OpenAL 8bit unsigned byte. */
typedef unsigned char ALubyte;

/** OpenAL 16bit signed short integer type. */
typedef short ALshort;

/** OpenAL 16bit unsigned short integer type. */
typedef unsigned short ALushort;

/** OpenAL 32bit unsigned integer type. */
typedef unsigned ALuint;

/** OpenAL 32bit signed integer type. */
typedef int ALint;

/** OpenAL 32bit floating point type. */
typedef float ALfloat;

/** OpenAL 64bit double point type. */
typedef double ALdouble;

/** OpenAL 32bit type. */
typedef unsigned int ALsizei;

/** OpenAL void type */
typedef void ALvoid;

/** OpenAL enumerations. */
typedef int ALenum;

/* Bad value. */
#define AL_INVALID                               (-1)

/* Disable value. */
#define AL_NONE									 0

/* Boolean False. */
#define AL_FALSE                                 0

/* Boolean True. */
#define AL_TRUE                                  1

/**
  * Indicate the type of AL_SOURCE.
  * Sources can be spatialized 
  */
#define AL_SOURCE_TYPE                           0x200

/** Indicate source has absolute coordinates. */
#define AL_SOURCE_ABSOLUTE                       0x201

/** Indicate Source has listener relative coordinates. */
#define AL_SOURCE_RELATIVE                       0x202

/**
 * Directional source, inner cone angle, in degrees.
 * Range:    [0-360] 
 * Default:  360
 */
#define AL_CONE_INNER_ANGLE                      0x1001

/**
 * Directional source, outer cone angle, in degrees.
 * Range:    [0-360] 
 * Default:  360
 */
#define AL_CONE_OUTER_ANGLE                      0x1002

/**
 * Specify the pitch to be applied, either at source,
 *  or on mixer results, at listener.
 * Range:	 [0.5-2.0]
 * Default:  1.0
 */
#define AL_PITCH                                 0x1003

/** 
 * Specify the current location in three dimensional space.
 * OpenAL, like OpenGL, uses a right handed coordinate system,
 *  where in a frontal default view X (thumb) points right, 
 *  Y points up (index finger), and Z points towards the
 *  viewer/camera (middle finger). 
 * To switch from a left handed coordinate system, flip the
 *  sign on the Z coordinate.
 * Listener position is always in the world coordinate system.
 */ 
#define AL_POSITION                              0x1004
  
/** Specify the current direction as forward vector. */
#define AL_DIRECTION                             0x1005
  
/** Specify the current velocity in three dimensional space. */
#define AL_VELOCITY                              0x1006

/**
 * Indicate whether source has to loop infinite.
 * Type: ALboolean
 * Range:    [AL_TRUE, AL_FALSE]
 * Default:  AL_FALSE
 */
#define AL_LOOPING                               0x1007

/**
 * Indicate the buffer to provide sound samples. 
 * Type: ALuint.
 * Range: any valid Buffer id.
 */
#define AL_BUFFER                                0x1009

/**
 * Indicate the gain (volume amplification) applied. 
 * Type:     ALfloat.
 * Range:    ]0.0-  ]
 * A value of 1.0 means un-attenuated/unchanged.
 * Each division by 2 equals an attenuation of -6dB.
 * Each multiplicaton with 2 equals an amplification of +6dB.
 * A value of 0.0 is meaningless with respect to a logarithmic
 *  scale; it is interpreted as zero volume - the channel
 *  is effectively disabled.
 */
#define AL_GAIN                                  0x100A

/**
 * Indicate minimum source attenuation.
 * Type:     ALfloat
 * Range:	 [0.0 - 1.0]
 */
#define AL_MIN_GAIN                              0x100D

/**
 * Indicate maximum source attenuation.
 * Type:	 ALfloat
 * Range:	 [0.0 - 1.0]
 */
#define AL_MAX_GAIN                              0x100E

/** 
 * Specify the current orientation.
 * Type:	 ALfv6 (at/up)
 * Range:	 N/A
 */
#define AL_ORIENTATION                           0x100F

/* byte offset into source (in canon format).  -1 if source
 * is not playing.  Don't set this, get this.
 *
 * Type:     ALfloat
 * Range:    [0.0 - ]
 * Default:  1.0
 */
#define AL_REFERENCE_DISTANCE                    0x1020

 /**
 * Indicate the rolloff factor for the source.
 * Type: ALfloat
 * Range:    [0.0 - ]
 * Default:  1.0
 */
#define AL_ROLLOFF_FACTOR                        0x1021

/**
 * Indicate the gain (volume amplification) applied. 
 * Type:     ALfloat.
 * Range:    ]0.0-  ]
 * A value of 1.0 means un-attenuated/unchanged.
 * Each division by 2 equals an attenuation of -6dB.
 * Each multiplicaton with 2 equals an amplification of +6dB.
 * A value of 0.0 is meaningless with respect to a logarithmic
 *  scale; it is interpreted as zero volume - the channel
 *  is effectively disabled.
 */
#define AL_CONE_OUTER_GAIN                       0x1022

/** 
 * Specify the maximum distance.
 * Type:	 ALfloat
 * Range:	 [0.0 - ]
 */
#define AL_MAX_DISTANCE                          0x1023

/**
 * Specify the channel mask. (Creative)
 * Type:	 ALuint
 * Range:	 [0 - 255]
 */
#define AL_CHANNEL_MASK							 0x3000

/**
 * Source state information
 */
#define AL_SOURCE_STATE                          0x1010
#define AL_INITIAL                               0x1011
#define AL_PLAYING                               0x1012
#define AL_PAUSED                                0x1013
#define AL_STOPPED                               0x1014

/**
 * Buffer Queue params
 */
#define AL_BUFFERS_QUEUED                        0x1015
#define AL_BUFFERS_PROCESSED                     0x1016

/** Sound buffers: format specifier. */
#define AL_FORMAT_MONO8                          0x1100
#define AL_FORMAT_MONO16                         0x1101
#define AL_FORMAT_STEREO8                        0x1102
#define AL_FORMAT_STEREO16                       0x1103

/** 
 * Sound buffers: frequency, in units of Hertz [Hz].
 * This is the number of samples per second. Half of the
 *  sample frequency marks the maximum significant
 *  frequency component.
 */
#define AL_FREQUENCY                             0x2001
#define AL_BITS                                  0x2002
#define AL_CHANNELS                              0x2003
#define AL_SIZE                                  0x2004
#define AL_DATA                                  0x2005

/**
 * Buffer state.
 *
 * Not supported for public use (yet).
 */
#define AL_UNUSED                                0x2010
#define AL_PENDING                               0x2011
#define AL_PROCESSED                             0x2012

/** Errors: No Error. */
#define AL_NO_ERROR                              AL_FALSE

/** 
 * Illegal name passed as an argument to an AL call.
 */
#define AL_INVALID_NAME                          0xA001

/** 
 * Illegal enum passed as an argument to an AL call.
 */
#define AL_INVALID_ENUM                          0xA002  
/** 
 * Illegal value passed as an argument to an AL call.
 * Applies to parameter values, but not to enumerations.
 */
#define AL_INVALID_VALUE                         0xA003
  
/**
 * A function was called at inappropriate time,
 *  or in an inappropriate way, causing an illegal state.
 * This can be an incompatible ALenum, object ID,
 *  and/or function.
 */
#define AL_INVALID_OPERATION                     0xA004

/**
 * A function could not be completed,
 * because there is not enough memory available.
 */
#define AL_OUT_OF_MEMORY                         0xA005

/** Context strings: Vendor Name. */
#define AL_VENDOR                                0xB001
#define AL_VERSION                               0xB002
#define AL_RENDERER                              0xB003
#define AL_EXTENSIONS                            0xB004

/** Global tweakage. */

/**
 * Doppler scale.  Default 1.0
 */
#define AL_DOPPLER_FACTOR                        0xC000
 
/**
 * Doppler velocity.  Default 1.0
 */
#define AL_DOPPLER_VELOCITY                      0xC001

/**
 * Distance model.  Default AL_INVERSE_DISTANCE_CLAMPED
 */
#define AL_DISTANCE_MODEL                        0xD000

/** Distance models. */

#define AL_INVERSE_DISTANCE                      0xD001
#define AL_INVERSE_DISTANCE_CLAMPED              0xD002
 
 /**
 * enables
 */

#ifdef __cplusplus
}
#endif

#endif
