2007-11-13 18:02:18 -08:00
|
|
|
#ifndef AL_MAIN_H
|
|
|
|
#define AL_MAIN_H
|
|
|
|
|
|
|
|
#include <string.h>
|
2008-01-15 12:45:24 -08:00
|
|
|
#include <stdio.h>
|
2009-06-07 15:42:15 -07:00
|
|
|
#include <stdarg.h>
|
2012-04-23 19:46:05 -07:00
|
|
|
#include <assert.h>
|
2012-09-28 04:20:55 -07:00
|
|
|
#include <math.h>
|
2014-02-27 18:17:20 -08:00
|
|
|
#include <limits.h>
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2013-11-05 13:07:46 -08:00
|
|
|
#ifdef HAVE_STRINGS_H
|
|
|
|
#include <strings.h>
|
|
|
|
#endif
|
|
|
|
|
2008-08-08 08:12:41 -07:00
|
|
|
#ifdef HAVE_FENV_H
|
|
|
|
#include <fenv.h>
|
|
|
|
#endif
|
|
|
|
|
2009-05-16 23:26:39 -07:00
|
|
|
#include "AL/al.h"
|
|
|
|
#include "AL/alc.h"
|
|
|
|
#include "AL/alext.h"
|
|
|
|
|
2014-04-07 11:48:28 -07:00
|
|
|
|
2014-04-19 09:42:03 -07:00
|
|
|
#if defined(_WIN64)
|
|
|
|
#define SZFMT "%I64u"
|
|
|
|
#elif defined(_WIN32)
|
2014-05-22 08:02:39 -07:00
|
|
|
#define SZFMT "%u"
|
2014-04-19 09:42:03 -07:00
|
|
|
#else
|
|
|
|
#define SZFMT "%zu"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2014-05-07 02:28:25 -07:00
|
|
|
#include "static_assert.h"
|
2014-04-19 02:11:04 -07:00
|
|
|
#include "align.h"
|
2013-10-28 12:48:13 -07:00
|
|
|
#include "atomic.h"
|
|
|
|
#include "uintmap.h"
|
2014-03-21 00:54:37 -07:00
|
|
|
#include "vector.h"
|
2014-03-28 22:11:34 -07:00
|
|
|
#include "alstring.h"
|
2013-10-28 12:48:13 -07:00
|
|
|
|
2013-05-31 15:49:56 -07:00
|
|
|
#ifndef ALC_SOFT_HRTF
|
|
|
|
#define ALC_SOFT_HRTF 1
|
|
|
|
#define ALC_HRTF_SOFT 0x1992
|
|
|
|
#endif
|
|
|
|
|
2013-11-28 01:53:05 -08:00
|
|
|
#ifndef ALC_SOFT_midi_interface
|
|
|
|
#define ALC_SOFT_midi_interface 1
|
2014-07-06 08:05:35 -07:00
|
|
|
/* Global properties */
|
2013-11-28 01:53:05 -08:00
|
|
|
#define AL_MIDI_CLOCK_SOFT 0x9999
|
2014-01-12 12:27:46 -08:00
|
|
|
#define AL_MIDI_STATE_SOFT 0x9986
|
2013-11-30 23:47:42 -08:00
|
|
|
#define AL_MIDI_GAIN_SOFT 0x9998
|
2013-12-27 02:59:50 -08:00
|
|
|
#define AL_SOUNDFONTS_SIZE_SOFT 0x9995
|
|
|
|
#define AL_SOUNDFONTS_SOFT 0x9994
|
2014-07-06 08:05:35 -07:00
|
|
|
|
|
|
|
/* Soundfont properties */
|
2013-12-27 02:59:50 -08:00
|
|
|
#define AL_PRESETS_SIZE_SOFT 0x9993
|
|
|
|
#define AL_PRESETS_SOFT 0x9992
|
2014-07-06 08:05:35 -07:00
|
|
|
|
|
|
|
/* Preset properties */
|
|
|
|
#define AL_MIDI_PRESET_SOFT 0x9997
|
|
|
|
#define AL_MIDI_BANK_SOFT 0x9996
|
2013-12-27 02:59:50 -08:00
|
|
|
#define AL_FONTSOUNDS_SIZE_SOFT 0x9991
|
|
|
|
#define AL_FONTSOUNDS_SOFT 0x9990
|
2014-01-05 17:21:34 -08:00
|
|
|
|
2014-07-06 08:05:35 -07:00
|
|
|
/* Fontsound properties */
|
|
|
|
/* AL_BUFFER */
|
2013-12-26 23:37:22 -08:00
|
|
|
#define AL_SAMPLE_START_SOFT 0x2000
|
|
|
|
#define AL_SAMPLE_END_SOFT 0x2001
|
|
|
|
#define AL_SAMPLE_LOOP_START_SOFT 0x2002
|
|
|
|
#define AL_SAMPLE_LOOP_END_SOFT 0x2003
|
|
|
|
#define AL_SAMPLE_RATE_SOFT 0x2004
|
|
|
|
#define AL_BASE_KEY_SOFT 0x2005
|
|
|
|
#define AL_KEY_CORRECTION_SOFT 0x2006
|
|
|
|
#define AL_SAMPLE_TYPE_SOFT 0x2007
|
|
|
|
#define AL_FONTSOUND_LINK_SOFT 0x2008
|
2013-12-29 02:25:40 -08:00
|
|
|
#define AL_MOD_LFO_TO_PITCH_SOFT 0x0005
|
|
|
|
#define AL_VIBRATO_LFO_TO_PITCH_SOFT 0x0006
|
|
|
|
#define AL_MOD_ENV_TO_PITCH_SOFT 0x0007
|
2013-12-29 03:18:31 -08:00
|
|
|
#define AL_FILTER_CUTOFF_SOFT 0x0008
|
|
|
|
#define AL_FILTER_RESONANCE_SOFT 0x0009
|
|
|
|
#define AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT 0x000A
|
|
|
|
#define AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT 0x000B
|
2013-12-29 05:09:50 -08:00
|
|
|
#define AL_MOD_LFO_TO_VOLUME_SOFT 0x000D
|
2013-12-29 04:36:01 -08:00
|
|
|
#define AL_CHORUS_SEND_SOFT 0x000F
|
|
|
|
#define AL_REVERB_SEND_SOFT 0x0010
|
2013-12-29 04:24:32 -08:00
|
|
|
#define AL_PAN_SOFT 0x0011
|
2013-12-29 05:09:50 -08:00
|
|
|
#define AL_MOD_LFO_DELAY_SOFT 0x0015
|
|
|
|
#define AL_MOD_LFO_FREQUENCY_SOFT 0x0016
|
|
|
|
#define AL_VIBRATO_LFO_DELAY_SOFT 0x0017
|
|
|
|
#define AL_VIBRATO_LFO_FREQUENCY_SOFT 0x0018
|
2013-12-29 02:40:12 -08:00
|
|
|
#define AL_MOD_ENV_DELAYTIME_SOFT 0x0019
|
|
|
|
#define AL_MOD_ENV_ATTACKTIME_SOFT 0x001A
|
|
|
|
#define AL_MOD_ENV_HOLDTIME_SOFT 0x001B
|
|
|
|
#define AL_MOD_ENV_DECAYTIME_SOFT 0x001C
|
|
|
|
#define AL_MOD_ENV_SUSTAINVOLUME_SOFT 0x001D
|
|
|
|
#define AL_MOD_ENV_RELEASETIME_SOFT 0x002E
|
|
|
|
#define AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT 0x001F
|
|
|
|
#define AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT 0x0020
|
2013-12-29 02:14:10 -08:00
|
|
|
#define AL_VOLUME_ENV_DELAYTIME_SOFT 0x0021
|
|
|
|
#define AL_VOLUME_ENV_ATTACKTIME_SOFT 0x0022
|
|
|
|
#define AL_VOLUME_ENV_HOLDTIME_SOFT 0x0023
|
|
|
|
#define AL_VOLUME_ENV_DECAYTIME_SOFT 0x0024
|
|
|
|
#define AL_VOLUME_ENV_SUSTAINVOLUME_SOFT 0x0025
|
|
|
|
#define AL_VOLUME_ENV_RELEASETIME_SOFT 0x0026
|
|
|
|
#define AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT 0x0027
|
|
|
|
#define AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT 0x0028
|
2013-12-26 21:45:16 -08:00
|
|
|
#define AL_KEY_RANGE_SOFT 0x002B
|
|
|
|
#define AL_VELOCITY_RANGE_SOFT 0x002C
|
2013-12-29 04:24:32 -08:00
|
|
|
#define AL_ATTENUATION_SOFT 0x0030
|
2013-12-29 03:43:00 -08:00
|
|
|
#define AL_TUNING_COARSE_SOFT 0x0033
|
|
|
|
#define AL_TUNING_FINE_SOFT 0x0034
|
2013-12-29 00:34:58 -08:00
|
|
|
#define AL_LOOP_MODE_SOFT 0x0036
|
2013-12-29 03:43:00 -08:00
|
|
|
#define AL_TUNING_SCALE_SOFT 0x0038
|
2013-12-29 05:09:50 -08:00
|
|
|
#define AL_EXCLUSIVE_CLASS_SOFT 0x0039
|
2014-07-06 08:05:35 -07:00
|
|
|
|
|
|
|
/* Sample Types */
|
|
|
|
/* AL_MONO_SOFT */
|
2014-01-15 22:18:07 -08:00
|
|
|
#define AL_RIGHT_SOFT 0x0002
|
|
|
|
#define AL_LEFT_SOFT 0x0004
|
2014-07-06 08:05:35 -07:00
|
|
|
|
|
|
|
/* Loop Modes */
|
|
|
|
/* AL_NONE */
|
|
|
|
#define AL_LOOP_CONTINUOUS_SOFT 0x0001
|
|
|
|
#define AL_LOOP_UNTIL_RELEASE_SOFT 0x0003
|
|
|
|
|
|
|
|
/* Fontsound modulator stage properties */
|
|
|
|
#define AL_SOURCE0_INPUT_SOFT 0x998F
|
|
|
|
#define AL_SOURCE0_TYPE_SOFT 0x998E
|
|
|
|
#define AL_SOURCE0_FORM_SOFT 0x998D
|
|
|
|
#define AL_SOURCE1_INPUT_SOFT 0x998C
|
|
|
|
#define AL_SOURCE1_TYPE_SOFT 0x998B
|
|
|
|
#define AL_SOURCE1_FORM_SOFT 0x998A
|
|
|
|
#define AL_AMOUNT_SOFT 0x9989
|
|
|
|
#define AL_TRANSFORM_OP_SOFT 0x9988
|
|
|
|
#define AL_DESTINATION_SOFT 0x9987
|
|
|
|
|
|
|
|
/* Sounce Inputs */
|
|
|
|
#define AL_ONE_SOFT 0x0080
|
|
|
|
#define AL_NOTEON_VELOCITY_SOFT 0x0082
|
|
|
|
#define AL_NOTEON_KEY_SOFT 0x0083
|
|
|
|
/* AL_KEYPRESSURE_SOFT */
|
|
|
|
/* AL_CHANNELPRESSURE_SOFT */
|
|
|
|
/* AL_PITCHBEND_SOFT */
|
|
|
|
#define AL_PITCHBEND_SENSITIVITY_SOFT 0x0090
|
|
|
|
/* CC 0...127 */
|
|
|
|
|
|
|
|
/* Source Types */
|
|
|
|
#define AL_UNORM_SOFT 0x0000
|
|
|
|
#define AL_UNORM_REV_SOFT 0x0100
|
|
|
|
#define AL_SNORM_SOFT 0x0200
|
|
|
|
#define AL_SNORM_REV_SOFT 0x0300
|
|
|
|
|
|
|
|
/* Source Forms */
|
|
|
|
#define AL_LINEAR_SOFT 0x0000
|
|
|
|
#define AL_CONCAVE_SOFT 0x0400
|
|
|
|
#define AL_CONVEX_SOFT 0x0800
|
|
|
|
#define AL_SWITCH_SOFT 0x0C00
|
|
|
|
|
|
|
|
/* Transform Ops */
|
|
|
|
/* AL_LINEAR_SOFT */
|
|
|
|
#define AL_ABSOLUTE_SOFT 0x0002
|
|
|
|
|
|
|
|
/* Events */
|
2013-11-28 01:53:05 -08:00
|
|
|
#define AL_NOTEOFF_SOFT 0x0080
|
|
|
|
#define AL_NOTEON_SOFT 0x0090
|
2014-01-17 04:18:49 -08:00
|
|
|
#define AL_KEYPRESSURE_SOFT 0x00A0
|
2013-11-28 01:53:05 -08:00
|
|
|
#define AL_CONTROLLERCHANGE_SOFT 0x00B0
|
|
|
|
#define AL_PROGRAMCHANGE_SOFT 0x00C0
|
|
|
|
#define AL_CHANNELPRESSURE_SOFT 0x00D0
|
|
|
|
#define AL_PITCHBEND_SOFT 0x00E0
|
2014-07-06 08:05:35 -07:00
|
|
|
|
2013-12-18 22:51:53 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALGENSOUNDFONTSSOFT)(ALsizei n, ALuint *ids);
|
|
|
|
typedef void (AL_APIENTRY*LPALDELETESOUNDFONTSSOFT)(ALsizei n, const ALuint *ids);
|
2013-12-18 23:12:44 -08:00
|
|
|
typedef ALboolean (AL_APIENTRY*LPALISSOUNDFONTSOFT)(ALuint id);
|
2013-12-23 04:07:53 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALGETSOUNDFONTIVSOFT)(ALuint id, ALenum param, ALint *values);
|
|
|
|
typedef void (AL_APIENTRY*LPALSOUNDFONTPRESETSSOFT)(ALuint id, ALsizei count, const ALuint *pids);
|
2013-12-19 00:09:55 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALGENPRESETSSOFT)(ALsizei n, ALuint *ids);
|
|
|
|
typedef void (AL_APIENTRY*LPALDELETEPRESETSSOFT)(ALsizei n, const ALuint *ids);
|
|
|
|
typedef ALboolean (AL_APIENTRY*LPALISPRESETSOFT)(ALuint id);
|
2013-12-23 03:23:42 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALPRESETISOFT)(ALuint id, ALenum param, ALint value);
|
|
|
|
typedef void (AL_APIENTRY*LPALPRESETIVSOFT)(ALuint id, ALenum param, const ALint *values);
|
2013-12-25 22:39:38 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALPRESETFONTSOUNDSSOFT)(ALuint id, ALsizei count, const ALuint *fsids);
|
2013-12-23 03:23:42 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALGETPRESETIVSOFT)(ALuint id, ALenum param, ALint *values);
|
2013-12-25 19:13:59 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALGENFONTSOUNDSSOFT)(ALsizei n, ALuint *ids);
|
|
|
|
typedef void (AL_APIENTRY*LPALDELETEFONTSOUNDSSOFT)(ALsizei n, const ALuint *ids);
|
|
|
|
typedef ALboolean (AL_APIENTRY*LPALISFONTSOUNDSOFT)(ALuint id);
|
2013-12-26 21:45:16 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALFONTSOUNDISOFT)(ALuint id, ALenum param, ALint value);
|
|
|
|
typedef void (AL_APIENTRY*LPALFONTSOUND2ISOFT)(ALuint id, ALenum param, ALint value1, ALint value2);
|
|
|
|
typedef void (AL_APIENTRY*LPALFONTSOUNDIVSOFT)(ALuint id, ALenum param, const ALint *values);
|
|
|
|
typedef void (AL_APIENTRY*LPALGETFONTSOUNDIVSOFT)(ALuint id, ALenum param, ALint *values);
|
2014-01-05 17:21:34 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALFONTSOUNDMOFULATORISOFT)(ALuint id, ALsizei stage, ALenum param, ALint value);
|
|
|
|
typedef void (AL_APIENTRY*LPALGETFONTSOUNDMODULATORIVSOFT)(ALuint id, ALsizei stage, ALenum param, ALint *values);
|
2013-12-29 05:44:18 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDISOUNDFONTSOFT)(ALuint id);
|
|
|
|
typedef void (AL_APIENTRY*LPALMIDISOUNDFONTVSOFT)(ALsizei count, const ALuint *ids);
|
2013-11-28 01:53:05 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDIEVENTSOFT)(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
|
2013-11-29 05:37:45 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDISYSEXSOFT)(ALuint64SOFT time, const ALbyte *data, ALsizei size);
|
2013-11-28 01:53:05 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDIPLAYSOFT)(void);
|
|
|
|
typedef void (AL_APIENTRY*LPALMIDIPAUSESOFT)(void);
|
2013-11-28 04:52:53 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDISTOPSOFT)(void);
|
2013-12-13 14:15:01 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDIRESETSOFT)(void);
|
2013-11-30 23:47:42 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALMIDIGAINSOFT)(ALfloat value);
|
2013-11-28 01:53:05 -08:00
|
|
|
typedef ALint64SOFT (AL_APIENTRY*LPALGETINTEGER64SOFT)(ALenum pname);
|
|
|
|
typedef void (AL_APIENTRY*LPALGETINTEGER64VSOFT)(ALenum pname, ALint64SOFT *values);
|
2013-12-28 09:58:55 -08:00
|
|
|
typedef void (AL_APIENTRY*LPALLOADSOUNDFONTSOFT)(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
|
2013-11-28 01:53:05 -08:00
|
|
|
#ifdef AL_ALEXT_PROTOTYPES
|
2013-12-18 22:51:53 -08:00
|
|
|
AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids);
|
|
|
|
AL_API void AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids);
|
2013-12-18 23:12:44 -08:00
|
|
|
AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id);
|
2013-12-23 04:07:53 -08:00
|
|
|
AL_API void AL_APIENTRY alGetSoundfontivSOFT(ALuint id, ALenum param, ALint *values);
|
|
|
|
AL_API void AL_APIENTRY alSoundfontPresetsSOFT(ALuint id, ALsizei count, const ALuint *pids);
|
2013-12-19 04:19:03 -08:00
|
|
|
|
2013-12-19 00:09:55 -08:00
|
|
|
AL_API void AL_APIENTRY alGenPresetsSOFT(ALsizei n, ALuint *ids);
|
|
|
|
AL_API void AL_APIENTRY alDeletePresetsSOFT(ALsizei n, const ALuint *ids);
|
|
|
|
AL_API ALboolean AL_APIENTRY alIsPresetSOFT(ALuint id);
|
2013-12-23 03:23:42 -08:00
|
|
|
AL_API void AL_APIENTRY alPresetiSOFT(ALuint id, ALenum param, ALint value);
|
|
|
|
AL_API void AL_APIENTRY alPresetivSOFT(ALuint id, ALenum param, const ALint *values);
|
|
|
|
AL_API void AL_APIENTRY alGetPresetivSOFT(ALuint id, ALenum param, ALint *values);
|
2013-12-25 22:39:38 -08:00
|
|
|
AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids);
|
2013-12-23 03:23:42 -08:00
|
|
|
|
2013-12-25 19:13:59 -08:00
|
|
|
AL_API void AL_APIENTRY alGenFontsoundsSOFT(ALsizei n, ALuint *ids);
|
|
|
|
AL_API void AL_APIENTRY alDeleteFontsoundsSOFT(ALsizei n, const ALuint *ids);
|
|
|
|
AL_API ALboolean AL_APIENTRY alIsFontsoundSOFT(ALuint id);
|
2013-12-26 21:45:16 -08:00
|
|
|
AL_API void AL_APIENTRY alFontsoundiSOFT(ALuint id, ALenum param, ALint value);
|
|
|
|
AL_API void AL_APIENTRY alFontsound2iSOFT(ALuint id, ALenum param, ALint value1, ALint value2);
|
|
|
|
AL_API void AL_APIENTRY alFontsoundivSOFT(ALuint id, ALenum param, const ALint *values);
|
|
|
|
AL_API void AL_APIENTRY alGetFontsoundivSOFT(ALuint id, ALenum param, ALint *values);
|
2014-01-05 17:21:34 -08:00
|
|
|
AL_API void AL_APIENTRY alFontsoundModulatoriSOFT(ALuint id, ALsizei stage, ALenum param, ALint value);
|
|
|
|
AL_API void AL_APIENTRY alGetFontsoundModulatorivSOFT(ALuint id, ALsizei stage, ALenum param, ALint *values);
|
2013-12-25 19:13:59 -08:00
|
|
|
|
2013-12-29 05:44:18 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id);
|
|
|
|
AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids);
|
2013-11-28 01:53:05 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
|
2013-11-29 05:37:45 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size);
|
2013-11-28 01:53:05 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiPlaySOFT(void);
|
|
|
|
AL_API void AL_APIENTRY alMidiPauseSOFT(void);
|
2013-11-28 04:52:53 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiStopSOFT(void);
|
2013-12-13 14:15:01 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiResetSOFT(void);
|
2013-11-30 23:47:42 -08:00
|
|
|
AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value);
|
2013-11-28 01:53:05 -08:00
|
|
|
AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname);
|
|
|
|
AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values);
|
2013-12-28 09:58:55 -08:00
|
|
|
AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
|
2013-11-28 01:53:05 -08:00
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2014-02-01 17:55:42 -08:00
|
|
|
#ifndef ALC_SOFT_device_clock
|
|
|
|
#define ALC_SOFT_device_clock 1
|
|
|
|
typedef int64_t ALCint64SOFT;
|
|
|
|
typedef uint64_t ALCuint64SOFT;
|
|
|
|
#define ALC_DEVICE_CLOCK_SOFT 0x1600
|
|
|
|
typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
|
|
|
|
#ifdef AL_ALEXT_PROTOTYPES
|
|
|
|
ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2010-07-30 20:23:55 -07:00
|
|
|
|
2013-10-06 03:53:20 -07:00
|
|
|
#ifdef IN_IDE_PARSER
|
|
|
|
/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but
|
|
|
|
* recent versions (at least 4.5.1) do recognize GCC's __restrict. */
|
|
|
|
#define restrict __restrict
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2013-11-01 16:49:05 -07:00
|
|
|
typedef ALint64SOFT ALint64;
|
|
|
|
typedef ALuint64SOFT ALuint64;
|
2009-12-24 15:41:45 -08:00
|
|
|
|
2013-10-06 04:21:03 -07:00
|
|
|
#ifndef U64
|
2013-10-07 07:44:09 -07:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define U64(x) ((ALuint64)(x##ui64))
|
2013-10-06 04:21:03 -07:00
|
|
|
#elif SIZEOF_LONG == 8
|
|
|
|
#define U64(x) ((ALuint64)(x##ul))
|
2013-10-30 12:29:53 -07:00
|
|
|
#elif SIZEOF_LONG_LONG == 8
|
|
|
|
#define U64(x) ((ALuint64)(x##ull))
|
2013-10-06 04:21:03 -07:00
|
|
|
#endif
|
2013-10-07 07:44:09 -07:00
|
|
|
#endif
|
|
|
|
|
2013-11-27 05:09:33 -08:00
|
|
|
#ifndef UINT64_MAX
|
|
|
|
#define UINT64_MAX U64(18446744073709551615)
|
|
|
|
#endif
|
|
|
|
|
2013-10-07 07:44:09 -07:00
|
|
|
#ifndef UNUSED
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
#define UNUSED(x)
|
|
|
|
#elif defined(__GNUC__)
|
|
|
|
#define UNUSED(x) UNUSED_##x __attribute__((unused))
|
|
|
|
#elif defined(__LCLINT__)
|
|
|
|
#define UNUSED(x) /*@unused@*/ x
|
2013-10-06 04:21:03 -07:00
|
|
|
#else
|
2013-10-07 07:44:09 -07:00
|
|
|
#define UNUSED(x) x
|
2013-10-06 04:21:03 -07:00
|
|
|
#endif
|
|
|
|
#endif
|
2012-08-19 22:31:55 -07:00
|
|
|
|
2014-05-22 07:40:22 -07:00
|
|
|
#ifdef __GNUC__
|
2014-05-23 08:30:33 -07:00
|
|
|
#define DECL_CONST __attribute__((const))
|
|
|
|
#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z))))
|
2010-01-12 08:48:25 -08:00
|
|
|
#else
|
2014-05-23 08:30:33 -07:00
|
|
|
#define DECL_CONST
|
|
|
|
#define DECL_FORMAT(x, y, z)
|
2010-01-12 08:48:25 -08:00
|
|
|
#endif
|
|
|
|
|
2013-11-25 17:29:39 -08:00
|
|
|
#if defined(__GNUC__) && defined(__i386__)
|
|
|
|
/* force_align_arg_pointer is required for proper function arguments aligning
|
|
|
|
* when SSE code is used. Some systems (Windows, QNX) do not guarantee our
|
|
|
|
* thread functions will be properly aligned on the stack, even though GCC may
|
|
|
|
* generate code with the assumption that it is. */
|
|
|
|
#define FORCE_ALIGN __attribute__((force_align_arg_pointer))
|
|
|
|
#else
|
|
|
|
#define FORCE_ALIGN
|
|
|
|
#endif
|
|
|
|
|
2014-03-25 18:16:03 -07:00
|
|
|
#ifdef HAVE_C99_VLA
|
|
|
|
#define DECL_VLA(T, _name, _size) T _name[(_size)]
|
|
|
|
#else
|
|
|
|
#define DECL_VLA(T, _name, _size) T *_name = alloca((_size) * sizeof(T))
|
|
|
|
#endif
|
|
|
|
|
2014-02-27 18:17:20 -08:00
|
|
|
#ifndef PATH_MAX
|
|
|
|
#ifdef MAX_PATH
|
|
|
|
#define PATH_MAX MAX_PATH
|
|
|
|
#else
|
|
|
|
#define PATH_MAX 4096
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2011-08-28 17:21:01 -07:00
|
|
|
|
2012-02-15 21:47:35 -08:00
|
|
|
static const union {
|
|
|
|
ALuint u;
|
|
|
|
ALubyte b[sizeof(ALuint)];
|
|
|
|
} EndianTest = { 1 };
|
|
|
|
#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1)
|
|
|
|
|
2012-02-19 12:07:40 -08:00
|
|
|
#define COUNTOF(x) (sizeof((x))/sizeof((x)[0]))
|
2012-02-15 21:47:35 -08:00
|
|
|
|
2013-05-21 12:47:18 -07:00
|
|
|
|
2013-05-21 02:30:11 -07:00
|
|
|
#define DERIVE_FROM_TYPE(t) t t##_parent
|
|
|
|
#define STATIC_CAST(to, obj) (&(obj)->to##_parent)
|
2014-04-19 02:38:32 -07:00
|
|
|
#ifdef __GNUC__
|
|
|
|
#define STATIC_UPCAST(to, from, obj) __extension__({ \
|
|
|
|
static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \
|
|
|
|
"Invalid upcast object from type"); \
|
|
|
|
(to*)((char*)(obj) - offsetof(to, from##_parent)); \
|
|
|
|
})
|
|
|
|
#else
|
2013-05-21 02:30:11 -07:00
|
|
|
#define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent)))
|
2014-04-19 02:38:32 -07:00
|
|
|
#endif
|
2013-05-21 12:47:18 -07:00
|
|
|
|
2013-10-29 11:22:18 -07:00
|
|
|
#define DECLARE_FORWARD(T1, T2, rettype, func) \
|
|
|
|
rettype T1##_##func(T1 *obj) \
|
|
|
|
{ return T2##_##func(STATIC_CAST(T2, obj)); }
|
2013-10-28 11:06:04 -07:00
|
|
|
|
2013-11-27 00:16:30 -08:00
|
|
|
#define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \
|
|
|
|
rettype T1##_##func(T1 *obj, argtype1 a) \
|
|
|
|
{ return T2##_##func(STATIC_CAST(T2, obj), a); }
|
|
|
|
|
2013-10-29 15:07:13 -07:00
|
|
|
#define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \
|
|
|
|
rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \
|
|
|
|
{ return T2##_##func(STATIC_CAST(T2, obj), a, b); }
|
|
|
|
|
2013-12-27 02:59:50 -08:00
|
|
|
#define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
|
|
|
|
rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \
|
|
|
|
{ return T2##_##func(STATIC_CAST(T2, obj), a, b, c); }
|
|
|
|
|
2013-10-29 20:08:03 -07:00
|
|
|
|
|
|
|
#define GET_VTABLE1(T1) (&(T1##_vtable))
|
|
|
|
#define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable))
|
|
|
|
|
|
|
|
#define SET_VTABLE1(T1, obj) ((obj)->vtbl = GET_VTABLE1(T1))
|
|
|
|
#define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2))
|
|
|
|
|
|
|
|
#define DECLARE_THUNK(T1, T2, rettype, func) \
|
|
|
|
static rettype T1##_##T2##_##func(T2 *obj) \
|
|
|
|
{ return T1##_##func(STATIC_UPCAST(T1, T2, obj)); }
|
|
|
|
|
|
|
|
#define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \
|
|
|
|
static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \
|
|
|
|
{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); }
|
|
|
|
|
|
|
|
#define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \
|
|
|
|
static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \
|
|
|
|
{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); }
|
|
|
|
|
|
|
|
#define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
|
|
|
|
static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \
|
|
|
|
{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); }
|
|
|
|
|
2014-11-07 03:43:33 -08:00
|
|
|
#define DECLARE_THUNK4(T1, T2, rettype, func, argtype1, argtype2, argtype3, argtype4) \
|
|
|
|
static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c, argtype4 d) \
|
|
|
|
{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c, d); }
|
|
|
|
|
2014-03-21 23:56:18 -07:00
|
|
|
#define DECLARE_DEFAULT_ALLOCATORS(T) \
|
2014-08-24 20:16:28 -07:00
|
|
|
static void* T##_New(size_t size) { return al_malloc(16, size); } \
|
|
|
|
static void T##_Delete(void *ptr) { al_free(ptr); }
|
2013-10-29 20:08:03 -07:00
|
|
|
|
2013-05-27 11:48:29 -07:00
|
|
|
/* Helper to extract an argument list for VCALL. Not used directly. */
|
2013-10-28 11:06:04 -07:00
|
|
|
#define EXTRACT_VCALL_ARGS(...) __VA_ARGS__))
|
2013-05-27 11:48:29 -07:00
|
|
|
|
|
|
|
/* Call a "virtual" method on an object, with arguments. */
|
2013-11-02 17:30:28 -07:00
|
|
|
#define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS
|
2013-05-27 11:48:29 -07:00
|
|
|
/* Call a "virtual" method on an object, with no arguments. */
|
2013-11-02 17:30:28 -07:00
|
|
|
#define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS
|
2013-05-27 11:48:29 -07:00
|
|
|
|
2013-05-25 21:04:00 -07:00
|
|
|
#define DELETE_OBJ(obj) do { \
|
2013-05-27 11:57:28 -07:00
|
|
|
if((obj) != NULL) \
|
|
|
|
{ \
|
2013-11-02 17:30:28 -07:00
|
|
|
V0((obj),Destruct)(); \
|
|
|
|
V0((obj),Delete)(); \
|
2013-05-27 11:57:28 -07:00
|
|
|
} \
|
2013-05-25 21:04:00 -07:00
|
|
|
} while(0)
|
2013-05-21 13:27:27 -07:00
|
|
|
|
2013-05-21 12:47:18 -07:00
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
#ifdef __cplusplus
|
2008-02-08 19:55:51 -08:00
|
|
|
extern "C" {
|
2007-11-13 18:02:18 -08:00
|
|
|
#endif
|
|
|
|
|
2012-09-14 02:52:37 -07:00
|
|
|
struct Hrtf;
|
2008-07-24 00:41:25 -07:00
|
|
|
|
|
|
|
|
2012-09-14 02:52:37 -07:00
|
|
|
#define DEFAULT_OUTPUT_RATE (44100)
|
|
|
|
#define MIN_OUTPUT_RATE (8000)
|
2011-09-18 09:52:40 -07:00
|
|
|
|
|
|
|
|
2013-11-04 13:44:46 -08:00
|
|
|
/* Find the next power-of-2 for non-power-of-2 numbers. */
|
|
|
|
inline ALuint NextPowerOf2(ALuint value)
|
2009-11-19 09:50:15 -08:00
|
|
|
{
|
2012-10-13 08:58:48 -07:00
|
|
|
if(value > 0)
|
2009-11-19 09:50:15 -08:00
|
|
|
{
|
|
|
|
value--;
|
2012-10-13 08:58:48 -07:00
|
|
|
value |= value>>1;
|
|
|
|
value |= value>>2;
|
|
|
|
value |= value>>4;
|
|
|
|
value |= value>>8;
|
|
|
|
value |= value>>16;
|
2009-11-19 09:50:15 -08:00
|
|
|
}
|
2012-10-13 08:58:48 -07:00
|
|
|
return value+1;
|
2009-11-19 09:50:15 -08:00
|
|
|
}
|
|
|
|
|
2011-09-29 03:51:46 -07:00
|
|
|
/* Fast float-to-int conversion. Assumes the FPU is already in round-to-zero
|
|
|
|
* mode. */
|
2013-11-04 13:44:46 -08:00
|
|
|
inline ALint fastf2i(ALfloat f)
|
2011-09-29 03:51:46 -07:00
|
|
|
{
|
2012-09-28 04:20:55 -07:00
|
|
|
#ifdef HAVE_LRINTF
|
|
|
|
return lrintf(f);
|
|
|
|
#elif defined(_MSC_VER) && defined(_M_IX86)
|
2011-09-29 03:51:46 -07:00
|
|
|
ALint i;
|
|
|
|
__asm fld f
|
|
|
|
__asm fistp i
|
2012-11-13 15:12:46 -08:00
|
|
|
return i;
|
2011-09-29 03:51:46 -07:00
|
|
|
#else
|
2012-09-28 04:20:55 -07:00
|
|
|
return (ALint)f;
|
2011-09-29 03:51:46 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fast float-to-uint conversion. Assumes the FPU is already in round-to-zero
|
|
|
|
* mode. */
|
2013-11-04 13:44:46 -08:00
|
|
|
inline ALuint fastf2u(ALfloat f)
|
2011-09-29 03:51:46 -07:00
|
|
|
{ return fastf2i(f); }
|
|
|
|
|
2009-11-19 09:50:15 -08:00
|
|
|
|
2011-08-20 03:59:46 -07:00
|
|
|
enum DevProbe {
|
|
|
|
ALL_DEVICE_PROBE,
|
|
|
|
CAPTURE_DEVICE_PROBE
|
|
|
|
};
|
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
typedef struct {
|
2011-08-24 14:24:48 -07:00
|
|
|
ALCenum (*OpenPlayback)(ALCdevice*, const ALCchar*);
|
2007-11-13 18:02:18 -08:00
|
|
|
void (*ClosePlayback)(ALCdevice*);
|
2009-09-16 00:24:44 -07:00
|
|
|
ALCboolean (*ResetPlayback)(ALCdevice*);
|
2012-03-05 07:11:09 -08:00
|
|
|
ALCboolean (*StartPlayback)(ALCdevice*);
|
2009-09-16 00:24:44 -07:00
|
|
|
void (*StopPlayback)(ALCdevice*);
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2011-08-24 14:44:15 -07:00
|
|
|
ALCenum (*OpenCapture)(ALCdevice*, const ALCchar*);
|
2007-11-13 18:02:18 -08:00
|
|
|
void (*CloseCapture)(ALCdevice*);
|
|
|
|
void (*StartCapture)(ALCdevice*);
|
|
|
|
void (*StopCapture)(ALCdevice*);
|
2011-09-14 02:01:35 -07:00
|
|
|
ALCenum (*CaptureSamples)(ALCdevice*, void*, ALCuint);
|
2007-11-13 18:02:18 -08:00
|
|
|
ALCuint (*AvailableSamples)(ALCdevice*);
|
|
|
|
} BackendFuncs;
|
|
|
|
|
2011-08-17 06:05:26 -07:00
|
|
|
ALCboolean alc_solaris_init(BackendFuncs *func_list);
|
2009-08-26 23:45:00 -07:00
|
|
|
void alc_solaris_deinit(void);
|
2011-06-14 04:02:58 -07:00
|
|
|
void alc_solaris_probe(enum DevProbe type);
|
2011-08-17 06:05:26 -07:00
|
|
|
ALCboolean alc_sndio_init(BackendFuncs *func_list);
|
2011-06-22 19:29:13 -07:00
|
|
|
void alc_sndio_deinit(void);
|
|
|
|
void alc_sndio_probe(enum DevProbe type);
|
2011-08-17 06:05:26 -07:00
|
|
|
ALCboolean alc_pa_init(BackendFuncs *func_list);
|
2009-08-26 23:45:00 -07:00
|
|
|
void alc_pa_deinit(void);
|
2011-06-14 04:02:58 -07:00
|
|
|
void alc_pa_probe(enum DevProbe type);
|
2011-08-17 06:05:26 -07:00
|
|
|
ALCboolean alc_ca_init(BackendFuncs *func_list);
|
2011-03-15 04:58:56 -07:00
|
|
|
void alc_ca_deinit(void);
|
2011-06-14 04:02:58 -07:00
|
|
|
void alc_ca_probe(enum DevProbe type);
|
2011-08-17 06:05:26 -07:00
|
|
|
ALCboolean alc_opensl_init(BackendFuncs *func_list);
|
2011-06-12 04:41:42 -07:00
|
|
|
void alc_opensl_deinit(void);
|
2011-06-14 04:02:58 -07:00
|
|
|
void alc_opensl_probe(enum DevProbe type);
|
2013-03-14 01:29:20 -07:00
|
|
|
ALCboolean alc_qsa_init(BackendFuncs *func_list);
|
|
|
|
void alc_qsa_deinit(void);
|
|
|
|
void alc_qsa_probe(enum DevProbe type);
|
2007-12-06 22:22:11 -08:00
|
|
|
|
2013-10-27 14:24:55 -07:00
|
|
|
struct ALCbackend;
|
|
|
|
|
2007-12-06 22:22:11 -08:00
|
|
|
|
2012-09-14 02:42:36 -07:00
|
|
|
enum DistanceModel {
|
|
|
|
InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED,
|
|
|
|
LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED,
|
|
|
|
ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED,
|
|
|
|
InverseDistance = AL_INVERSE_DISTANCE,
|
|
|
|
LinearDistance = AL_LINEAR_DISTANCE,
|
|
|
|
ExponentDistance = AL_EXPONENT_DISTANCE,
|
|
|
|
DisableDistance = AL_NONE,
|
|
|
|
|
|
|
|
DefaultDistanceModel = InverseDistanceClamped
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Resampler {
|
|
|
|
PointResampler,
|
|
|
|
LinearResampler,
|
|
|
|
CubicResampler,
|
|
|
|
|
|
|
|
ResamplerMax,
|
|
|
|
};
|
|
|
|
|
2012-09-14 02:14:29 -07:00
|
|
|
enum Channel {
|
|
|
|
FrontLeft = 0,
|
|
|
|
FrontRight,
|
|
|
|
FrontCenter,
|
|
|
|
LFE,
|
|
|
|
BackLeft,
|
|
|
|
BackRight,
|
|
|
|
BackCenter,
|
|
|
|
SideLeft,
|
|
|
|
SideRight,
|
|
|
|
|
2014-11-07 02:18:24 -08:00
|
|
|
InvalidChannel
|
2012-09-14 02:14:29 -07:00
|
|
|
};
|
2014-11-07 15:47:41 -08:00
|
|
|
|
2012-09-14 02:42:36 -07:00
|
|
|
|
2010-12-04 19:50:00 -08:00
|
|
|
/* Device formats */
|
|
|
|
enum DevFmtType {
|
2011-11-01 16:00:47 -07:00
|
|
|
DevFmtByte = ALC_BYTE_SOFT,
|
|
|
|
DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT,
|
|
|
|
DevFmtShort = ALC_SHORT_SOFT,
|
|
|
|
DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT,
|
2012-02-14 11:44:57 -08:00
|
|
|
DevFmtInt = ALC_INT_SOFT,
|
|
|
|
DevFmtUInt = ALC_UNSIGNED_INT_SOFT,
|
2012-03-13 15:32:44 -07:00
|
|
|
DevFmtFloat = ALC_FLOAT_SOFT,
|
|
|
|
|
|
|
|
DevFmtTypeDefault = DevFmtFloat
|
2010-12-04 19:50:00 -08:00
|
|
|
};
|
|
|
|
enum DevFmtChannels {
|
2011-11-01 16:00:47 -07:00
|
|
|
DevFmtMono = ALC_MONO_SOFT,
|
|
|
|
DevFmtStereo = ALC_STEREO_SOFT,
|
|
|
|
DevFmtQuad = ALC_QUAD_SOFT,
|
|
|
|
DevFmtX51 = ALC_5POINT1_SOFT,
|
|
|
|
DevFmtX61 = ALC_6POINT1_SOFT,
|
|
|
|
DevFmtX71 = ALC_7POINT1_SOFT,
|
2011-05-28 19:35:32 -07:00
|
|
|
|
2014-11-07 00:54:16 -08:00
|
|
|
/* Similar to 5.1, except using rear channels instead of sides */
|
|
|
|
DevFmtX51Rear = 0x80000000,
|
2012-03-13 15:32:44 -07:00
|
|
|
|
|
|
|
DevFmtChannelsDefault = DevFmtStereo
|
2010-12-04 19:50:00 -08:00
|
|
|
};
|
2014-11-07 15:47:41 -08:00
|
|
|
#define MAX_OUTPUT_CHANNELS (8)
|
2010-12-04 19:50:00 -08:00
|
|
|
|
2014-05-23 08:30:33 -07:00
|
|
|
ALuint BytesFromDevFmt(enum DevFmtType type) DECL_CONST;
|
|
|
|
ALuint ChannelsFromDevFmt(enum DevFmtChannels chans) DECL_CONST;
|
2013-11-04 13:44:46 -08:00
|
|
|
inline ALuint FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type)
|
2010-12-04 19:50:00 -08:00
|
|
|
{
|
|
|
|
return ChannelsFromDevFmt(chans) * BytesFromDevFmt(type);
|
|
|
|
}
|
|
|
|
|
2010-05-01 19:59:41 -07:00
|
|
|
|
2011-03-12 20:37:22 -08:00
|
|
|
extern const struct EffectList {
|
|
|
|
const char *name;
|
|
|
|
int type;
|
|
|
|
const char *ename;
|
2011-03-12 20:54:49 -08:00
|
|
|
ALenum val;
|
2011-03-12 20:37:22 -08:00
|
|
|
} EffectList[];
|
|
|
|
|
|
|
|
|
2012-02-23 15:25:30 -08:00
|
|
|
enum DeviceType {
|
|
|
|
Playback,
|
|
|
|
Capture,
|
|
|
|
Loopback
|
|
|
|
};
|
|
|
|
|
2012-09-14 02:14:29 -07:00
|
|
|
|
2014-10-02 20:25:30 -07:00
|
|
|
/* The maximum number of Ambisonics coefficients. For a given order (o), the
|
|
|
|
* size needed will be (o+1)**2, thus zero-order has 1, first-order has 4,
|
|
|
|
* second-order has 9, and third-order has 16. */
|
|
|
|
#define MAX_AMBI_COEFFS 16
|
|
|
|
|
|
|
|
typedef struct ChannelConfig {
|
2014-10-31 17:18:45 -07:00
|
|
|
ALfloat HOACoeff[MAX_AMBI_COEFFS];
|
|
|
|
ALfloat FOACoeff[4];
|
2014-10-02 20:25:30 -07:00
|
|
|
} ChannelConfig;
|
|
|
|
|
|
|
|
|
2012-09-14 02:14:29 -07:00
|
|
|
/* Size for temporary storage of buffer data, in ALfloats. Larger values need
|
2012-10-05 06:42:26 -07:00
|
|
|
* more memory, while smaller values may need more iterations. The value needs
|
2012-09-14 02:14:29 -07:00
|
|
|
* to be a sensible size, however, as it constrains the max stepping value used
|
|
|
|
* for mixing, as well as the maximum number of samples per mixing iteration.
|
|
|
|
*/
|
2013-07-02 06:57:27 -07:00
|
|
|
#define BUFFERSIZE (2048u)
|
2012-09-14 02:14:29 -07:00
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
struct ALCdevice_struct
|
|
|
|
{
|
2014-05-14 02:47:07 -07:00
|
|
|
RefCount ref;
|
2011-09-10 02:43:07 -07:00
|
|
|
|
2012-02-23 15:25:30 -08:00
|
|
|
ALCboolean Connected;
|
|
|
|
enum DeviceType Type;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
|
|
|
ALuint Frequency;
|
2008-02-12 19:38:27 -08:00
|
|
|
ALuint UpdateSize;
|
2009-09-16 22:58:54 -07:00
|
|
|
ALuint NumUpdates;
|
2010-12-04 19:50:00 -08:00
|
|
|
enum DevFmtChannels FmtChans;
|
|
|
|
enum DevFmtType FmtType;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2014-03-28 22:11:34 -07:00
|
|
|
al_string DeviceName;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2014-07-22 18:57:51 -07:00
|
|
|
ATOMIC(ALCenum) LastError;
|
2009-12-28 23:19:13 -08:00
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
// Maximum number of sources that can be created
|
|
|
|
ALuint MaxNoOfSources;
|
2009-06-07 14:53:22 -07:00
|
|
|
// Maximum number of slots that can be created
|
|
|
|
ALuint AuxiliaryEffectSlotMax;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2010-03-25 18:39:16 -07:00
|
|
|
ALCuint NumMonoSources;
|
|
|
|
ALCuint NumStereoSources;
|
2009-07-06 03:09:01 -07:00
|
|
|
ALuint NumAuxSends;
|
|
|
|
|
2010-05-01 19:59:41 -07:00
|
|
|
// Map of Buffers for this device
|
|
|
|
UIntMap BufferMap;
|
2009-08-15 09:14:08 -07:00
|
|
|
|
2010-05-18 17:41:06 -07:00
|
|
|
// Map of Effects for this device
|
|
|
|
UIntMap EffectMap;
|
2009-08-15 09:39:18 -07:00
|
|
|
|
2010-05-18 17:54:45 -07:00
|
|
|
// Map of Filters for this device
|
|
|
|
UIntMap FilterMap;
|
2009-08-15 09:39:18 -07:00
|
|
|
|
2013-12-18 22:51:53 -08:00
|
|
|
// Map of Soundfonts for this device
|
|
|
|
UIntMap SfontMap;
|
|
|
|
|
2013-12-19 00:09:55 -08:00
|
|
|
// Map of Presets for this device
|
|
|
|
UIntMap PresetMap;
|
|
|
|
|
2013-12-25 19:13:59 -08:00
|
|
|
// Map of Fontsounds for this device
|
|
|
|
UIntMap FontsoundMap;
|
|
|
|
|
2014-01-03 20:21:12 -08:00
|
|
|
/* Default soundfont (accessible as ID 0) */
|
|
|
|
struct ALsoundfont *DefaultSfont;
|
|
|
|
|
2013-11-27 18:45:02 -08:00
|
|
|
/* MIDI synth engine */
|
|
|
|
struct MidiSynth *Synth;
|
|
|
|
|
2011-09-18 09:52:40 -07:00
|
|
|
/* HRTF filter tables */
|
|
|
|
const struct Hrtf *Hrtf;
|
|
|
|
|
2009-09-15 19:06:47 -07:00
|
|
|
// Stereo-to-binaural filter
|
|
|
|
struct bs2b *Bs2b;
|
|
|
|
ALCint Bs2bLevel;
|
|
|
|
|
2011-05-01 18:18:37 -07:00
|
|
|
// Device flags
|
|
|
|
ALuint Flags;
|
2011-05-01 13:19:23 -07:00
|
|
|
|
2014-11-07 02:18:24 -08:00
|
|
|
enum Channel ChannelName[MAX_OUTPUT_CHANNELS];
|
2014-11-07 03:12:32 -08:00
|
|
|
ChannelConfig Channel[MAX_OUTPUT_CHANNELS];
|
|
|
|
ALuint NumChannels;
|
2010-04-08 15:58:11 -07:00
|
|
|
|
2014-02-01 16:37:11 -08:00
|
|
|
ALuint64 ClockBase;
|
|
|
|
ALuint SamplesDone;
|
|
|
|
|
2014-05-19 05:46:01 -07:00
|
|
|
/* Temp storage used for each source when mixing. */
|
|
|
|
alignas(16) ALfloat SourceData[BUFFERSIZE];
|
|
|
|
alignas(16) ALfloat ResampledData[BUFFERSIZE];
|
|
|
|
alignas(16) ALfloat FilteredData[BUFFERSIZE];
|
2012-10-05 06:42:26 -07:00
|
|
|
|
2012-08-29 01:40:42 -07:00
|
|
|
// Dry path buffer mix
|
2014-11-07 02:18:24 -08:00
|
|
|
alignas(16) ALfloat DryBuffer[MAX_OUTPUT_CHANNELS][BUFFERSIZE];
|
2012-08-29 01:40:42 -07:00
|
|
|
|
Keep track of the mix count
The purpose of this is to provide a safe way to be able to "swap" resources
used by the mixer from other threads without the need to block the mixer, as
well as a way to track when mixes have occurred. The idea is two-fold:
It provides a way to safely swap resources. If the mixer were to (atomically)
get a reference to an object to access it from, another thread would be able
allocate and prepare a new object then swap the reference to it with the stored
one. The other thread would then be able to wait until (count&1) is clear,
indicating the mixer is not running, before safely freeing the old object for
the mixer to use the new one.
It also provides a way to tell if the mixer has run. With this, a thread would
be able to read multiple values, which could be altered by the mixer, without
requiring a mixer lock. Comparing the before and after counts for inequality
would signify if the mixer has (started to) run, indicating the values may be
out of sync and should try getting them again. Of course, it will still need
something like a RWLock to ensure another (non-mixer) thread doesn't try to
write to the values at the same time.
Note that because of the possibility of overflow, the counter is not reliable
as an absolute count.
2014-03-19 19:00:54 -07:00
|
|
|
/* Running count of the mixer invocations, in 31.1 fixed point. This
|
|
|
|
* actually increments *twice* when mixing, first at the start and then at
|
|
|
|
* the end, so the bottom bit indicates if the device is currently mixing
|
|
|
|
* and the upper bits indicates how many mixes have been done.
|
|
|
|
*/
|
2014-05-14 02:47:07 -07:00
|
|
|
RefCount MixCount;
|
Keep track of the mix count
The purpose of this is to provide a safe way to be able to "swap" resources
used by the mixer from other threads without the need to block the mixer, as
well as a way to track when mixes have occurred. The idea is two-fold:
It provides a way to safely swap resources. If the mixer were to (atomically)
get a reference to an object to access it from, another thread would be able
allocate and prepare a new object then swap the reference to it with the stored
one. The other thread would then be able to wait until (count&1) is clear,
indicating the mixer is not running, before safely freeing the old object for
the mixer to use the new one.
It also provides a way to tell if the mixer has run. With this, a thread would
be able to read multiple values, which could be altered by the mixer, without
requiring a mixer lock. Comparing the before and after counts for inequality
would signify if the mixer has (started to) run, indicating the values may be
out of sync and should try getting them again. Of course, it will still need
something like a RWLock to ensure another (non-mixer) thread doesn't try to
write to the values at the same time.
Note that because of the possibility of overflow, the counter is not reliable
as an absolute count.
2014-03-19 19:00:54 -07:00
|
|
|
|
2012-01-19 19:30:03 -08:00
|
|
|
/* Default effect slot */
|
|
|
|
struct ALeffectslot *DefaultSlot;
|
|
|
|
|
2009-10-20 11:54:04 -07:00
|
|
|
// Contexts created on this device
|
2014-08-01 02:04:40 -07:00
|
|
|
ATOMIC(ALCcontext*) ContextList;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2013-10-27 14:24:55 -07:00
|
|
|
struct ALCbackend *Backend;
|
|
|
|
|
2014-08-01 02:04:40 -07:00
|
|
|
void *ExtraData; // For the backend's use
|
2008-01-14 10:39:54 -08:00
|
|
|
|
2011-09-12 03:57:53 -07:00
|
|
|
ALCdevice *volatile next;
|
2014-03-20 14:49:46 -07:00
|
|
|
|
|
|
|
/* Memory space used by the default slot (Playback devices only) */
|
2014-04-19 02:11:04 -07:00
|
|
|
alignas(16) ALCbyte _slot_mem[];
|
2007-11-13 18:02:18 -08:00
|
|
|
};
|
|
|
|
|
2011-05-03 02:29:26 -07:00
|
|
|
// Frequency was requested by the app or config file
|
2011-10-06 01:16:07 -07:00
|
|
|
#define DEVICE_FREQUENCY_REQUEST (1<<1)
|
2011-05-03 17:11:07 -07:00
|
|
|
// Channel configuration was requested by the config file
|
2011-10-06 01:16:07 -07:00
|
|
|
#define DEVICE_CHANNELS_REQUEST (1<<2)
|
2012-02-15 16:26:32 -08:00
|
|
|
// Sample type was requested by the config file
|
|
|
|
#define DEVICE_SAMPLE_TYPE_REQUEST (1<<3)
|
2013-05-31 19:29:32 -07:00
|
|
|
// HRTF was requested by the app
|
|
|
|
#define DEVICE_HRTF_REQUEST (1<<4)
|
2011-05-01 18:18:37 -07:00
|
|
|
|
2014-01-15 16:44:12 -08:00
|
|
|
// Specifies if the DSP is paused at user request
|
|
|
|
#define DEVICE_PAUSED (1<<30)
|
|
|
|
|
2011-06-15 01:59:07 -07:00
|
|
|
// Specifies if the device is currently running
|
|
|
|
#define DEVICE_RUNNING (1<<31)
|
2011-05-01 18:18:37 -07:00
|
|
|
|
2012-11-04 04:41:11 -08:00
|
|
|
/* Invalid channel offset */
|
|
|
|
#define INVALID_OFFSET (~0u)
|
|
|
|
|
|
|
|
|
2014-02-01 16:37:11 -08:00
|
|
|
/* Nanosecond resolution for the device clock time. */
|
|
|
|
#define DEVICE_CLOCK_RES U64(1000000000)
|
|
|
|
|
|
|
|
|
2013-10-27 07:00:44 -07:00
|
|
|
/* Must be less than 15 characters (16 including terminating null) for
|
|
|
|
* compatibility with pthread_setname_np limitations. */
|
|
|
|
#define MIXER_THREAD_NAME "alsoft-mixer"
|
|
|
|
|
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
struct ALCcontext_struct
|
|
|
|
{
|
2014-05-14 02:47:07 -07:00
|
|
|
RefCount ref;
|
2011-08-28 15:44:03 -07:00
|
|
|
|
2012-10-09 04:48:12 -07:00
|
|
|
struct ALlistener *Listener;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2010-05-01 19:59:41 -07:00
|
|
|
UIntMap SourceMap;
|
2010-05-12 02:20:14 -07:00
|
|
|
UIntMap EffectSlotMap;
|
2008-01-15 16:22:39 -08:00
|
|
|
|
2014-07-22 18:57:51 -07:00
|
|
|
ATOMIC(ALenum) LastError;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2014-07-21 23:14:48 -07:00
|
|
|
ATOMIC(ALenum) UpdateSources;
|
2009-12-09 12:14:53 -08:00
|
|
|
|
2011-08-31 00:19:27 -07:00
|
|
|
volatile enum DistanceModel DistanceModel;
|
|
|
|
volatile ALboolean SourceDistanceModel;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2011-08-31 00:19:27 -07:00
|
|
|
volatile ALfloat DopplerFactor;
|
|
|
|
volatile ALfloat DopplerVelocity;
|
2012-04-19 22:50:11 -07:00
|
|
|
volatile ALfloat SpeedOfSound;
|
2011-08-31 00:19:27 -07:00
|
|
|
volatile ALenum DeferUpdates;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2014-08-21 03:24:48 -07:00
|
|
|
struct ALvoice *Voices;
|
|
|
|
ALsizei VoiceCount;
|
|
|
|
ALsizei MaxVoices;
|
2010-06-06 00:17:50 -07:00
|
|
|
|
2014-07-06 03:27:39 -07:00
|
|
|
VECTOR(struct ALeffectslot*) ActiveAuxSlots;
|
2011-08-30 20:13:42 -07:00
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
ALCdevice *Device;
|
2008-07-22 12:39:10 -07:00
|
|
|
const ALCchar *ExtensionList;
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2011-09-10 07:18:29 -07:00
|
|
|
ALCcontext *volatile next;
|
2014-03-20 14:49:46 -07:00
|
|
|
|
|
|
|
/* Memory space used by the listener */
|
2014-04-19 02:11:04 -07:00
|
|
|
alignas(16) ALCbyte _listener_mem[];
|
2007-11-13 18:02:18 -08:00
|
|
|
};
|
|
|
|
|
2011-09-11 09:28:30 -07:00
|
|
|
ALCcontext *GetContextRef(void);
|
|
|
|
|
2011-08-29 13:22:07 -07:00
|
|
|
void ALCcontext_IncRef(ALCcontext *context);
|
|
|
|
void ALCcontext_DecRef(ALCcontext *context);
|
|
|
|
|
2012-05-09 16:28:16 -07:00
|
|
|
void AppendAllDevicesList(const ALCchar *name);
|
2009-08-27 01:47:41 -07:00
|
|
|
void AppendCaptureDeviceList(const ALCchar *name);
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2013-10-28 05:10:28 -07:00
|
|
|
void ALCdevice_Lock(ALCdevice *device);
|
|
|
|
void ALCdevice_Unlock(ALCdevice *device);
|
2013-11-02 12:01:58 -07:00
|
|
|
ALint64 ALCdevice_GetLatency(ALCdevice *device);
|
|
|
|
|
2014-10-12 09:03:08 -07:00
|
|
|
void ALCcontext_DeferUpdates(ALCcontext *context);
|
|
|
|
void ALCcontext_ProcessUpdates(ALCcontext *context);
|
|
|
|
|
2013-11-04 13:44:46 -08:00
|
|
|
inline void LockContext(ALCcontext *context)
|
2013-11-02 12:05:02 -07:00
|
|
|
{ ALCdevice_Lock(context->Device); }
|
|
|
|
|
2013-11-04 13:44:46 -08:00
|
|
|
inline void UnlockContext(ALCcontext *context)
|
2013-11-02 12:05:02 -07:00
|
|
|
{ ALCdevice_Unlock(context->Device); }
|
2012-01-09 23:37:03 -08:00
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2012-08-15 05:50:40 -07:00
|
|
|
void *al_malloc(size_t alignment, size_t size);
|
|
|
|
void *al_calloc(size_t alignment, size_t size);
|
|
|
|
void al_free(void *ptr);
|
|
|
|
|
2013-10-28 05:10:28 -07:00
|
|
|
|
2012-09-16 01:35:16 -07:00
|
|
|
typedef struct {
|
2013-05-22 23:05:26 -07:00
|
|
|
#ifdef HAVE_FENV_H
|
|
|
|
DERIVE_FROM_TYPE(fenv_t);
|
|
|
|
#else
|
2012-09-16 01:35:16 -07:00
|
|
|
int state;
|
2013-05-22 23:05:26 -07:00
|
|
|
#endif
|
2012-09-16 03:19:53 -07:00
|
|
|
#ifdef HAVE_SSE
|
|
|
|
int sse_state;
|
|
|
|
#endif
|
2012-09-16 01:35:16 -07:00
|
|
|
} FPUCtl;
|
|
|
|
void SetMixerFPUMode(FPUCtl *ctl);
|
|
|
|
void RestoreFPUMode(const FPUCtl *ctl);
|
2012-09-14 01:10:19 -07:00
|
|
|
|
2013-10-26 12:39:19 -07:00
|
|
|
|
2007-12-16 18:36:06 -08:00
|
|
|
typedef struct RingBuffer RingBuffer;
|
|
|
|
RingBuffer *CreateRingBuffer(ALsizei frame_size, ALsizei length);
|
|
|
|
void DestroyRingBuffer(RingBuffer *ring);
|
|
|
|
ALsizei RingBufferSize(RingBuffer *ring);
|
|
|
|
void WriteRingBuffer(RingBuffer *ring, const ALubyte *data, ALsizei len);
|
|
|
|
void ReadRingBuffer(RingBuffer *ring, ALubyte *data, ALsizei len);
|
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
void ReadALConfig(void);
|
|
|
|
void FreeALConfig(void);
|
2009-12-28 13:08:15 -08:00
|
|
|
int ConfigValueExists(const char *blockName, const char *keyName);
|
2007-11-13 18:02:18 -08:00
|
|
|
const char *GetConfigValue(const char *blockName, const char *keyName, const char *def);
|
2009-12-26 07:42:57 -08:00
|
|
|
int GetConfigValueBool(const char *blockName, const char *keyName, int def);
|
2011-09-19 11:29:18 -07:00
|
|
|
int ConfigValueStr(const char *blockName, const char *keyName, const char **ret);
|
2011-09-18 16:16:55 -07:00
|
|
|
int ConfigValueInt(const char *blockName, const char *keyName, int *ret);
|
|
|
|
int ConfigValueUInt(const char *blockName, const char *keyName, unsigned int *ret);
|
|
|
|
int ConfigValueFloat(const char *blockName, const char *keyName, float *ret);
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2010-05-12 07:27:12 -07:00
|
|
|
void SetRTPriority(void);
|
2009-12-01 23:15:09 -08:00
|
|
|
|
2009-12-07 04:19:33 -08:00
|
|
|
void SetDefaultChannelOrder(ALCdevice *device);
|
|
|
|
void SetDefaultWFXChannelOrder(ALCdevice *device);
|
|
|
|
|
2014-05-23 08:30:33 -07:00
|
|
|
const ALCchar *DevFmtTypeString(enum DevFmtType type) DECL_CONST;
|
|
|
|
const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans) DECL_CONST;
|
2011-05-15 04:03:15 -07:00
|
|
|
|
2014-10-02 21:19:34 -07:00
|
|
|
/**
|
|
|
|
* GetChannelIdxByName
|
|
|
|
*
|
|
|
|
* Returns the device's channel index given a channel name (e.g. FrontCenter),
|
|
|
|
* or -1 if it doesn't exist.
|
|
|
|
*/
|
|
|
|
inline ALint GetChannelIdxByName(const ALCdevice *device, enum Channel chan)
|
|
|
|
{
|
|
|
|
ALint i = 0;
|
2014-11-07 02:18:24 -08:00
|
|
|
for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
|
2014-10-02 21:19:34 -07:00
|
|
|
{
|
|
|
|
if(device->ChannelName[i] == chan)
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2010-01-12 09:05:57 -08:00
|
|
|
|
2011-08-20 03:59:46 -07:00
|
|
|
extern FILE *LogFile;
|
2013-10-28 17:09:52 -07:00
|
|
|
|
2014-03-17 09:16:33 -07:00
|
|
|
#if defined(__GNUC__) && !defined(IN_IDE_PARSER)
|
2013-10-28 17:09:52 -07:00
|
|
|
#define AL_PRINT(T, MSG, ...) fprintf(LogFile, "AL lib: %s %s: "MSG, T, __FUNCTION__ , ## __VA_ARGS__)
|
|
|
|
#else
|
2014-05-23 08:30:33 -07:00
|
|
|
void al_print(const char *type, const char *func, const char *fmt, ...) DECL_FORMAT(printf, 3,4);
|
|
|
|
#define AL_PRINT(T, ...) al_print((T), __FUNCTION__, __VA_ARGS__)
|
2013-10-28 17:09:52 -07:00
|
|
|
#endif
|
|
|
|
|
2011-07-10 21:30:25 -07:00
|
|
|
enum LogLevel {
|
|
|
|
NoLog,
|
|
|
|
LogError,
|
|
|
|
LogWarning,
|
2011-09-20 12:24:23 -07:00
|
|
|
LogTrace,
|
|
|
|
LogRef
|
2011-07-10 21:30:25 -07:00
|
|
|
};
|
|
|
|
extern enum LogLevel LogLevel;
|
|
|
|
|
2011-09-20 12:24:23 -07:00
|
|
|
#define TRACEREF(...) do { \
|
|
|
|
if(LogLevel >= LogRef) \
|
2012-10-07 04:31:31 -07:00
|
|
|
AL_PRINT("(--)", __VA_ARGS__); \
|
2011-09-20 12:24:23 -07:00
|
|
|
} while(0)
|
|
|
|
|
2011-07-10 21:30:25 -07:00
|
|
|
#define TRACE(...) do { \
|
|
|
|
if(LogLevel >= LogTrace) \
|
2012-10-07 04:31:31 -07:00
|
|
|
AL_PRINT("(II)", __VA_ARGS__); \
|
2011-07-10 21:30:25 -07:00
|
|
|
} while(0)
|
|
|
|
|
|
|
|
#define WARN(...) do { \
|
|
|
|
if(LogLevel >= LogWarning) \
|
2012-10-07 04:31:31 -07:00
|
|
|
AL_PRINT("(WW)", __VA_ARGS__); \
|
2011-07-10 21:30:25 -07:00
|
|
|
} while(0)
|
|
|
|
|
2011-07-13 01:43:00 -07:00
|
|
|
#define ERR(...) do { \
|
2011-07-10 21:30:25 -07:00
|
|
|
if(LogLevel >= LogError) \
|
2012-10-07 04:31:31 -07:00
|
|
|
AL_PRINT("(EE)", __VA_ARGS__); \
|
2011-07-10 21:30:25 -07:00
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
2011-08-20 03:59:46 -07:00
|
|
|
extern ALint RTPrioLevel;
|
|
|
|
|
2012-08-13 08:53:36 -07:00
|
|
|
|
|
|
|
extern ALuint CPUCapFlags;
|
|
|
|
enum {
|
2012-08-15 01:29:19 -07:00
|
|
|
CPU_CAP_SSE = 1<<0,
|
2013-05-22 16:59:20 -07:00
|
|
|
CPU_CAP_SSE2 = 1<<1,
|
2014-06-04 02:57:13 -07:00
|
|
|
CPU_CAP_SSE4_1 = 1<<2,
|
|
|
|
CPU_CAP_NEON = 1<<3,
|
2012-08-13 08:53:36 -07:00
|
|
|
};
|
|
|
|
|
2012-08-13 10:37:49 -07:00
|
|
|
void FillCPUCaps(ALuint capfilter);
|
2012-08-13 08:53:36 -07:00
|
|
|
|
2014-02-27 01:49:23 -08:00
|
|
|
FILE *OpenDataFile(const char *fname, const char *subdir);
|
2012-08-13 08:53:36 -07:00
|
|
|
|
2013-11-27 00:16:30 -08:00
|
|
|
/* Small hack to use a pointer-to-array type as a normal argument type.
|
|
|
|
* Shouldn't be used directly. */
|
|
|
|
typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE];
|
|
|
|
|
|
|
|
|
2007-11-13 18:02:18 -08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|