2001-04-26 16:45:43 +00:00
/*
SDL - Simple DirectMedia Layer
2008-12-08 00:27:32 +00:00
Copyright ( C ) 1997 - 2009 Sam Lantinga
2001-04-26 16:45:43 +00:00
This library is free software ; you can redistribute it and / or
2006-02-01 06:32:25 +00:00
modify it under the terms of the GNU Lesser General Public
2001-04-26 16:45:43 +00:00
License as published by the Free Software Foundation ; either
2006-02-01 06:32:25 +00:00
version 2.1 of the License , or ( at your option ) any later version .
2001-04-26 16:45:43 +00:00
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
2006-02-01 06:32:25 +00:00
Lesser General Public License for more details .
2001-04-26 16:45:43 +00:00
2006-02-01 06:32:25 +00:00
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-04-26 16:45:43 +00:00
Sam Lantinga
2001-12-14 12:37:47 +00:00
slouken @ libsdl . org
2001-04-26 16:45:43 +00:00
*/
2006-07-10 21:04:37 +00:00
/**
* \ file SDL_audio . h
*
* Access to the raw audio mixing buffer for the SDL library
*/
2001-04-26 16:45:43 +00:00
# ifndef _SDL_audio_h
# define _SDL_audio_h
2006-02-09 09:07:13 +00:00
# include "SDL_stdinc.h"
2001-04-26 16:45:43 +00:00
# include "SDL_error.h"
2006-02-10 03:19:02 +00:00
# include "SDL_endian.h"
2006-02-10 06:48:43 +00:00
# include "SDL_mutex.h"
# include "SDL_thread.h"
# include "SDL_rwops.h"
2001-04-26 16:45:43 +00:00
# include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
# ifdef __cplusplus
2006-07-10 21:04:37 +00:00
/* *INDENT-OFF* */
2001-04-26 16:45:43 +00:00
extern " C " {
2006-07-10 21:04:37 +00:00
/* *INDENT-ON* */
2001-04-26 16:45:43 +00:00
# endif
2006-08-03 19:34:05 +00:00
typedef Uint16 SDL_AudioFormat ;
2001-04-26 16:45:43 +00:00
/* The calculated values in this structure are calculated by SDL_OpenAudio() */
2006-07-10 21:04:37 +00:00
typedef struct SDL_AudioSpec
{
int freq ; /* DSP frequency -- samples per second */
2006-08-03 19:34:05 +00:00
SDL_AudioFormat format ; /* Audio data format */
2006-07-10 21:04:37 +00:00
Uint8 channels ; /* Number of channels: 1 mono, 2 stereo */
Uint8 silence ; /* Audio buffer silence value (calculated) */
Uint16 samples ; /* Audio buffer size in samples (power of 2) */
Uint16 padding ; /* Necessary for some compile environments */
Uint32 size ; /* Audio buffer size in bytes (calculated) */
/* This function is called when the audio device needs more data.
' stream ' is a pointer to the audio data buffer
' len ' is the length of that buffer in bytes .
Once the callback returns , the buffer will no longer be valid .
Stereo samples are stored in a LRLRLR ordering .
*/
void ( SDLCALL * callback ) ( void * userdata , Uint8 * stream , int len ) ;
void * userdata ;
2001-04-26 16:45:43 +00:00
} SDL_AudioSpec ;
2006-08-03 19:34:05 +00:00
/*
These are what the 16 bits in SDL_AudioFormat currently mean . . .
( Unspecified bits are always zero . )
+ + - - - - - - - - - - - - - - - - - - - - - - - sample is signed if set
| |
| | + + - - - - - - - - - - - sample is bigendian if set
| | | |
| | | | + + - - - sample is float if set
| | | | | |
| | | | | | + - - - sample bit size - - - +
| | | | | | | |
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
There are macros in SDL 1.3 and later to query these bits .
*/
# define SDL_AUDIO_MASK_BITSIZE (0xFF)
# define SDL_AUDIO_MASK_DATATYPE (1<<8)
# define SDL_AUDIO_MASK_ENDIAN (1<<12)
# define SDL_AUDIO_MASK_SIGNED (1<<15)
# define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE)
# define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE)
# define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN)
# define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED)
# define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x))
# define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x))
# define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x))
2001-04-26 16:45:43 +00:00
/* Audio format flags (defaults to LSB byte order) */
2006-07-10 21:04:37 +00:00
# define AUDIO_U8 0x0008 /* Unsigned 8-bit samples */
# define AUDIO_S8 0x8008 /* Signed 8-bit samples */
# define AUDIO_U16LSB 0x0010 /* Unsigned 16-bit samples */
# define AUDIO_S16LSB 0x8010 /* Signed 16-bit samples */
# define AUDIO_U16MSB 0x1010 /* As above, but big-endian byte order */
# define AUDIO_S16MSB 0x9010 /* As above, but big-endian byte order */
2001-04-26 16:45:43 +00:00
# define AUDIO_U16 AUDIO_U16LSB
# define AUDIO_S16 AUDIO_S16LSB
2006-08-03 19:34:05 +00:00
/* int32 support new to SDL 1.3 */
# define AUDIO_S32LSB 0x8020 /* 32-bit integer samples */
# define AUDIO_S32MSB 0x9020 /* As above, but big-endian byte order */
# define AUDIO_S32 AUDIO_S32LSB
/* float32 support new to SDL 1.3 */
# define AUDIO_F32LSB 0x8120 /* 32-bit floating point samples */
# define AUDIO_F32MSB 0x9120 /* As above, but big-endian byte order */
# define AUDIO_F32 AUDIO_F32LSB
2001-04-26 16:45:43 +00:00
/* Native audio byte ordering */
# if SDL_BYTEORDER == SDL_LIL_ENDIAN
# define AUDIO_U16SYS AUDIO_U16LSB
# define AUDIO_S16SYS AUDIO_S16LSB
2006-08-03 19:34:05 +00:00
# define AUDIO_S32SYS AUDIO_S32LSB
# define AUDIO_F32SYS AUDIO_F32LSB
2001-04-26 16:45:43 +00:00
# else
# define AUDIO_U16SYS AUDIO_U16MSB
# define AUDIO_S16SYS AUDIO_S16MSB
2006-08-03 19:34:05 +00:00
# define AUDIO_S32SYS AUDIO_S32MSB
# define AUDIO_F32SYS AUDIO_F32MSB
2001-04-26 16:45:43 +00:00
# endif
/* A structure to hold a set of audio conversion filters and buffers */
2006-08-24 12:48:16 +00:00
struct SDL_AudioCVT ;
2006-08-28 03:17:39 +00:00
typedef void ( SDLCALL * SDL_AudioFilter ) ( struct SDL_AudioCVT * cvt ,
SDL_AudioFormat format ) ;
2006-08-24 12:48:16 +00:00
2006-07-10 21:04:37 +00:00
typedef struct SDL_AudioCVT
{
2006-08-28 03:17:39 +00:00
int needed ; /* Set to 1 if conversion possible */
SDL_AudioFormat src_format ; /* Source audio format */
SDL_AudioFormat dst_format ; /* Target audio format */
double rate_incr ; /* Rate conversion increment */
Uint8 * buf ; /* Buffer to hold entire audio data */
2008-08-26 02:26:18 +00:00
Uint8 * coeff ; /* Filter coefficients: either big windowed sinc filter, or 6 IIR lowpass coefficients */
Uint8 * state_buf ; /* Sample history for either the FIR or IIR filter. For IIR filter, first two elements are X, second two are Y, and state_pos toggles the order */
int state_pos ; /* Position in the state */
int len_sinc ; /* Length of windowed sinc filter, in appropriate units (not necessarily bytes) */
2006-08-28 03:17:39 +00:00
int len ; /* Length of original audio buffer */
int len_cvt ; /* Length of converted audio buffer */
int len_mult ; /* buffer must be len*len_mult big */
2008-08-26 02:26:18 +00:00
int len_div ; /* destination length = len_mult / len_div * src length */
double len_ratio ; /* Given len, final size is len*len_ratio ( len_ratio = len_mult / len_div ) */
2006-08-28 03:17:39 +00:00
SDL_AudioFilter filters [ 10 ] ; /* Filter list */
int filter_index ; /* Current audio conversion function */
2001-04-26 16:45:43 +00:00
} SDL_AudioCVT ;
/* Function prototypes */
2006-10-17 09:15:21 +00:00
/* These functions return the list of built in audio drivers, in the
2006-07-10 21:04:37 +00:00
* order that they are normally initialized by default .
*/
extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers ( void ) ;
extern DECLSPEC const char * SDLCALL SDL_GetAudioDriver ( int index ) ;
2001-04-26 16:45:43 +00:00
/* These functions are used internally, and should not be used unless you
* have a specific need to specify the audio driver you want to use .
* You should normally use SDL_Init ( ) or SDL_InitSubSystem ( ) .
*/
2002-04-11 14:35:16 +00:00
extern DECLSPEC int SDLCALL SDL_AudioInit ( const char * driver_name ) ;
extern DECLSPEC void SDLCALL SDL_AudioQuit ( void ) ;
2001-04-26 16:45:43 +00:00
2006-07-10 21:04:37 +00:00
/* This function returns the name of the current audio driver, or NULL
* if no driver has been initialized .
2001-04-26 16:45:43 +00:00
*/
2006-07-10 21:04:37 +00:00
extern DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver ( void ) ;
2001-04-26 16:45:43 +00:00
/*
* This function opens the audio device with the desired parameters , and
* returns 0 if successful , placing the actual hardware parameters in the
* structure pointed to by ' obtained ' . If ' obtained ' is NULL , the audio
* data passed to the callback function will be guaranteed to be in the
* requested format , and will be automatically converted to the hardware
* audio format if necessary . This function returns - 1 if it failed
* to open the audio device , or couldn ' t set up the audio thread .
*
* When filling in the desired audio spec structure ,
* ' desired - > freq ' should be the desired audio frequency in samples - per - second .
* ' desired - > format ' should be the desired audio format .
* ' desired - > samples ' is the desired size of the audio buffer , in samples .
* This number should be a power of two , and may be adjusted by the audio
* driver to a value more suitable for the hardware . Good values seem to
* range between 512 and 8096 inclusive , depending on the application and
* CPU speed . Smaller values yield faster response time , but can lead
* to underflow if the application is doing heavy processing and cannot
* fill the audio buffer in time . A stereo sample consists of both right
* and left channels in LR ordering .
* Note that the number of samples is directly related to time by the
* following formula : ms = ( samples * 1000 ) / freq
* ' desired - > size ' is the size in bytes of the audio buffer , and is
* calculated by SDL_OpenAudio ( ) .
* ' desired - > silence ' is the value used to set the buffer to silence ,
* and is calculated by SDL_OpenAudio ( ) .
* ' desired - > callback ' should be set to a function that will be called
* when the audio device is ready for more data . It is passed a pointer
* to the audio buffer , and the length in bytes of the audio buffer .
* This function usually runs in a separate thread , and so you should
* protect data structures that it accesses by calling SDL_LockAudio ( )
* and SDL_UnlockAudio ( ) in your code .
* ' desired - > userdata ' is passed as the first parameter to your callback
* function .
*
* The audio device starts out playing silence when it ' s opened , and should
* be enabled for playing by calling SDL_PauseAudio ( 0 ) when you are ready
* for your audio callback function to be called . Since the audio driver
* may modify the requested size of the audio buffer , you should allocate
* any local mixing buffers after you open the audio device .
*/
2006-10-17 09:15:21 +00:00
extern DECLSPEC int SDLCALL SDL_OpenAudio ( const SDL_AudioSpec * desired ,
2006-07-10 21:04:37 +00:00
SDL_AudioSpec * obtained ) ;
2001-04-26 16:45:43 +00:00
2006-08-03 19:34:05 +00:00
/*
* SDL Audio Device IDs .
* A successful call to SDL_OpenAudio ( ) is always device id 1 , and legacy
* SDL audio APIs assume you want this device ID . SDL_OpenAudioDevice ( ) calls
* always returns devices > = 2 on success . The legacy calls are good both
* for backwards compatibility and when you don ' t care about multiple ,
* specific , or capture devices .
*/
typedef Uint32 SDL_AudioDeviceID ;
/*
* Get the number of available devices exposed by the current driver .
* Only valid after a successfully initializing the audio subsystem .
2006-10-17 09:15:21 +00:00
* Returns - 1 if an explicit list of devices can ' t be determined ; this is
* not an error . For example , if SDL is set up to talk to a remote audio
* server , it can ' t list every one available on the Internet , but it will
* still allow a specific host to be specified to SDL_OpenAudioDevice ( ) .
* In many common cases , when this function returns a value < = 0 , it can still
* successfully open the default device ( NULL for first argument of
* SDL_OpenAudioDevice ( ) ) .
2006-08-03 19:34:05 +00:00
*/
extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices ( int iscapture ) ;
/*
* Get the human - readable name of a specific audio device .
* Must be a value between 0 and ( number of audio devices - 1 ) .
* Only valid after a successfully initializing the audio subsystem .
2006-10-17 09:15:21 +00:00
* The values returned by this function reflect the latest call to
* SDL_GetNumAudioDevices ( ) ; recall that function to redetect available
* hardware .
*
* The string returned by this function is UTF - 8 encoded , read - only , and
* managed internally . You are not to free it . If you need to keep the
* string for any length of time , you should make your own copy of it , as it
* will be invalid next time any of several other SDL functions is called .
2006-08-03 19:34:05 +00:00
*/
2006-10-17 09:15:21 +00:00
extern DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName ( int index ,
int iscapture ) ;
2006-08-03 19:34:05 +00:00
/*
2006-10-17 09:15:21 +00:00
* Open a specific audio device . Passing in a device name of NULL requests
* the most reasonable default ( and is equivalent to calling SDL_OpenAudio ( ) ) .
* The device name is a UTF - 8 string reported by SDL_GetAudioDevice ( ) , but
* some drivers allow arbitrary and driver - specific strings , such as a
* hostname / IP address for a remote audio server , or a filename in the
* diskaudio driver .
* Returns 0 on error , a valid device ID that is > = 2 on success .
* SDL_OpenAudio ( ) , unlike this function , always acts on device ID 1.
2006-08-03 19:34:05 +00:00
*/
2006-08-05 22:34:23 +00:00
extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice ( const char
* device ,
int iscapture ,
const
SDL_AudioSpec *
desired ,
SDL_AudioSpec *
obtained ) ;
2006-08-03 19:34:05 +00:00
2001-04-26 16:45:43 +00:00
/*
* Get the current audio state :
*/
2006-07-10 21:04:37 +00:00
typedef enum
{
SDL_AUDIO_STOPPED = 0 ,
SDL_AUDIO_PLAYING ,
SDL_AUDIO_PAUSED
2001-04-26 16:45:43 +00:00
} SDL_audiostatus ;
2002-04-11 14:35:16 +00:00
extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus ( void ) ;
2001-04-26 16:45:43 +00:00
2006-08-05 22:34:23 +00:00
extern DECLSPEC SDL_audiostatus SDLCALL
SDL_GetAudioDeviceStatus ( SDL_AudioDeviceID dev ) ;
2006-08-03 19:34:05 +00:00
2001-04-26 16:45:43 +00:00
/*
* This function pauses and unpauses the audio callback processing .
* It should be called with a parameter of 0 after opening the audio
* device to start playing sound . This is so you can safely initialize
* data for your callback function after opening the audio device .
* Silence will be written to the audio device during the pause .
*/
2002-04-11 14:35:16 +00:00
extern DECLSPEC void SDLCALL SDL_PauseAudio ( int pause_on ) ;
2006-08-03 19:34:05 +00:00
extern DECLSPEC void SDLCALL SDL_PauseAudioDevice ( SDL_AudioDeviceID dev ,
int pause_on ) ;
2001-04-26 16:45:43 +00:00
/*
* This function loads a WAVE from the data source , automatically freeing
* that source if ' freesrc ' is non - zero . For example , to load a WAVE file ,
* you could do :
* SDL_LoadWAV_RW ( SDL_RWFromFile ( " sample.wav " , " rb " ) , 1 , . . . ) ;
*
* If this function succeeds , it returns the given SDL_AudioSpec ,
* filled with the audio data format of the wave data , and sets
* ' audio_buf ' to a malloc ( ) ' d buffer containing the audio data ,
* and sets ' audio_len ' to the length of that audio buffer , in bytes .
* You need to free the audio buffer with SDL_FreeWAV ( ) when you are
* done with it .
*
* This function returns NULL and sets the SDL error message if the
* wave file cannot be opened , uses an unknown data format , or is
* corrupt . Currently raw and MS - ADPCM WAVE files are supported .
*/
2006-07-10 21:04:37 +00:00
extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW ( SDL_RWops * src ,
int freesrc ,
SDL_AudioSpec * spec ,
Uint8 * * audio_buf ,
Uint32 * audio_len ) ;
2001-04-26 16:45:43 +00:00
/* Compatibility convenience function -- loads a WAV from a file */
# define SDL_LoadWAV(file, spec, audio_buf, audio_len) \
SDL_LoadWAV_RW ( SDL_RWFromFile ( file , " rb " ) , 1 , spec , audio_buf , audio_len )
/*
* This function frees data previously allocated with SDL_LoadWAV_RW ( )
*/
2006-07-10 21:04:37 +00:00
extern DECLSPEC void SDLCALL SDL_FreeWAV ( Uint8 * audio_buf ) ;
2001-04-26 16:45:43 +00:00
/*
* This function takes a source format and rate and a destination format
* and rate , and initializes the ' cvt ' structure with information needed
* by SDL_ConvertAudio ( ) to convert a buffer of audio data from one format
* to the other .
2006-08-03 19:34:05 +00:00
* Returns - 1 if the format conversion is not supported , 0 if there ' s
* no conversion needed , or 1 if the audio filter is set up .
2001-04-26 16:45:43 +00:00
*/
2006-07-10 21:04:37 +00:00
extern DECLSPEC int SDLCALL SDL_BuildAudioCVT ( SDL_AudioCVT * cvt ,
2006-08-24 12:48:16 +00:00
SDL_AudioFormat src_format ,
2006-07-10 21:04:37 +00:00
Uint8 src_channels ,
int src_rate ,
2006-08-24 12:48:16 +00:00
SDL_AudioFormat dst_format ,
2006-07-10 21:04:37 +00:00
Uint8 dst_channels ,
int dst_rate ) ;
2001-04-26 16:45:43 +00:00
/* Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(),
* created an audio buffer cvt - > buf , and filled it with cvt - > len bytes of
* audio data in the source format , this function will convert it in - place
* to the desired format .
* The data conversion may expand the size of the audio data , so the buffer
* cvt - > buf should be allocated after the cvt structure is initialized by
* SDL_BuildAudioCVT ( ) , and should be cvt - > len * cvt - > len_mult bytes long .
*/
2006-07-10 21:04:37 +00:00
extern DECLSPEC int SDLCALL SDL_ConvertAudio ( SDL_AudioCVT * cvt ) ;
2001-04-26 16:45:43 +00:00
/*
* This takes two audio buffers of the playing audio format and mixes
* them , performing addition , volume adjustment , and overflow clipping .
* The volume ranges from 0 - 128 , and should be set to SDL_MIX_MAXVOLUME
* for full audio volume . Note this does not change hardware volume .
* This is provided for convenience - - you can mix your own audio data .
*/
# define SDL_MIX_MAXVOLUME 128
2006-07-10 21:04:37 +00:00
extern DECLSPEC void SDLCALL SDL_MixAudio ( Uint8 * dst , const Uint8 * src ,
Uint32 len , int volume ) ;
2001-04-26 16:45:43 +00:00
2006-08-03 19:34:05 +00:00
/*
* This works like SDL_MixAudio , but you specify the audio format instead of
* using the format of audio device 1. Thus it can be used when no audio
* device is open at all .
*/
2006-08-05 22:34:23 +00:00
extern DECLSPEC void SDLCALL SDL_MixAudioFormat ( Uint8 * dst ,
const Uint8 * src ,
2006-08-03 19:34:05 +00:00
SDL_AudioFormat format ,
Uint32 len , int volume ) ;
2001-04-26 16:45:43 +00:00
/*
* The lock manipulated by these functions protects the callback function .
* During a LockAudio / UnlockAudio pair , you can be guaranteed that the
* callback function is not running . Do not call these from the callback
* function or you will cause deadlock .
*/
2002-04-11 14:35:16 +00:00
extern DECLSPEC void SDLCALL SDL_LockAudio ( void ) ;
2006-08-03 19:34:05 +00:00
extern DECLSPEC void SDLCALL SDL_LockAudioDevice ( SDL_AudioDeviceID dev ) ;
2002-04-11 14:35:16 +00:00
extern DECLSPEC void SDLCALL SDL_UnlockAudio ( void ) ;
2006-08-03 19:34:05 +00:00
extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice ( SDL_AudioDeviceID dev ) ;
2001-04-26 16:45:43 +00:00
/*
* This function shuts down audio processing and closes the audio device .
*/
2002-04-11 14:35:16 +00:00
extern DECLSPEC void SDLCALL SDL_CloseAudio ( void ) ;
2006-08-03 19:34:05 +00:00
extern DECLSPEC void SDLCALL SDL_CloseAudioDevice ( SDL_AudioDeviceID dev ) ;
/*
* Returns 1 if audio device is still functioning , zero if not , - 1 on error .
*/
extern DECLSPEC int SDLCALL SDL_AudioDeviceConnected ( SDL_AudioDeviceID dev ) ;
2001-04-26 16:45:43 +00:00
/* Ends C function definitions when using C++ */
# ifdef __cplusplus
2006-07-10 21:04:37 +00:00
/* *INDENT-OFF* */
2001-04-26 16:45:43 +00:00
}
2006-07-10 21:04:37 +00:00
/* *INDENT-ON* */
2001-04-26 16:45:43 +00:00
# endif
# include "close_code.h"
# endif /* _SDL_audio_h */
2006-07-10 21:04:37 +00:00
/* vi: set ts=4 sw=4 expandtab: */