aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32')
-rw-r--r--OpenAL32/Include/alMain.h214
-rw-r--r--OpenAL32/Include/alMidi.h173
-rw-r--r--OpenAL32/alFontsound.c1014
-rw-r--r--OpenAL32/alMidi.c217
-rw-r--r--OpenAL32/alPreset.c339
-rw-r--r--OpenAL32/alSoundfont.c455
-rw-r--r--OpenAL32/alState.c96
7 files changed, 0 insertions, 2508 deletions
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index e7ca5ac7..214047ee 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -61,205 +61,6 @@ ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCi
#endif
#endif
-#ifndef ALC_SOFT_midi_interface
-#define ALC_SOFT_midi_interface 1
-/* Global properties */
-#define AL_MIDI_CLOCK_SOFT 0x9999
-#define AL_MIDI_STATE_SOFT 0x9986
-#define AL_MIDI_GAIN_SOFT 0x9998
-#define AL_SOUNDFONTS_SIZE_SOFT 0x9995
-#define AL_SOUNDFONTS_SOFT 0x9994
-
-/* Soundfont properties */
-#define AL_PRESETS_SIZE_SOFT 0x9993
-#define AL_PRESETS_SOFT 0x9992
-
-/* Preset properties */
-#define AL_MIDI_PRESET_SOFT 0x9997
-#define AL_MIDI_BANK_SOFT 0x9996
-#define AL_FONTSOUNDS_SIZE_SOFT 0x9991
-#define AL_FONTSOUNDS_SOFT 0x9990
-
-/* Fontsound properties */
-/* AL_BUFFER */
-#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
-#define AL_MOD_LFO_TO_PITCH_SOFT 0x0005
-#define AL_VIBRATO_LFO_TO_PITCH_SOFT 0x0006
-#define AL_MOD_ENV_TO_PITCH_SOFT 0x0007
-#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
-#define AL_MOD_LFO_TO_VOLUME_SOFT 0x000D
-#define AL_CHORUS_SEND_SOFT 0x000F
-#define AL_REVERB_SEND_SOFT 0x0010
-#define AL_PAN_SOFT 0x0011
-#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
-#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
-#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
-#define AL_KEY_RANGE_SOFT 0x002B
-#define AL_VELOCITY_RANGE_SOFT 0x002C
-#define AL_ATTENUATION_SOFT 0x0030
-#define AL_TUNING_COARSE_SOFT 0x0033
-#define AL_TUNING_FINE_SOFT 0x0034
-#define AL_LOOP_MODE_SOFT 0x0036
-#define AL_TUNING_SCALE_SOFT 0x0038
-#define AL_EXCLUSIVE_CLASS_SOFT 0x0039
-
-/* Sample Types */
-/* AL_MONO_SOFT */
-#define AL_RIGHT_SOFT 0x0002
-#define AL_LEFT_SOFT 0x0004
-
-/* 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 */
-#define AL_NOTEOFF_SOFT 0x0080
-#define AL_NOTEON_SOFT 0x0090
-#define AL_KEYPRESSURE_SOFT 0x00A0
-#define AL_CONTROLLERCHANGE_SOFT 0x00B0
-#define AL_PROGRAMCHANGE_SOFT 0x00C0
-#define AL_CHANNELPRESSURE_SOFT 0x00D0
-#define AL_PITCHBEND_SOFT 0x00E0
-
-typedef void (AL_APIENTRY*LPALGENSOUNDFONTSSOFT)(ALsizei n, ALuint *ids);
-typedef void (AL_APIENTRY*LPALDELETESOUNDFONTSSOFT)(ALsizei n, const ALuint *ids);
-typedef ALboolean (AL_APIENTRY*LPALISSOUNDFONTSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALGETSOUNDFONTIVSOFT)(ALuint id, ALenum param, ALint *values);
-typedef void (AL_APIENTRY*LPALSOUNDFONTPRESETSSOFT)(ALuint id, ALsizei count, const ALuint *pids);
-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);
-typedef void (AL_APIENTRY*LPALPRESETISOFT)(ALuint id, ALenum param, ALint value);
-typedef void (AL_APIENTRY*LPALPRESETIVSOFT)(ALuint id, ALenum param, const ALint *values);
-typedef void (AL_APIENTRY*LPALPRESETFONTSOUNDSSOFT)(ALuint id, ALsizei count, const ALuint *fsids);
-typedef void (AL_APIENTRY*LPALGETPRESETIVSOFT)(ALuint id, ALenum param, ALint *values);
-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);
-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);
-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);
-typedef void (AL_APIENTRY*LPALMIDISOUNDFONTSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALMIDISOUNDFONTVSOFT)(ALsizei count, const ALuint *ids);
-typedef void (AL_APIENTRY*LPALMIDIEVENTSOFT)(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
-typedef void (AL_APIENTRY*LPALMIDISYSEXSOFT)(ALuint64SOFT time, const ALbyte *data, ALsizei size);
-typedef void (AL_APIENTRY*LPALMIDIPLAYSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIPAUSESOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDISTOPSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIRESETSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIGAINSOFT)(ALfloat value);
-typedef ALint64SOFT (AL_APIENTRY*LPALGETINTEGER64SOFT)(ALenum pname);
-typedef void (AL_APIENTRY*LPALGETINTEGER64VSOFT)(ALenum pname, ALint64SOFT *values);
-typedef void (AL_APIENTRY*LPALLOADSOUNDFONTSOFT)(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
-#ifdef AL_ALEXT_PROTOTYPES
-AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids);
-AL_API void AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids);
-AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id);
-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);
-
-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);
-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);
-AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids);
-
-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);
-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);
-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);
-
-AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id);
-AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids);
-AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
-AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size);
-AL_API void AL_APIENTRY alMidiPlaySOFT(void);
-AL_API void AL_APIENTRY alMidiPauseSOFT(void);
-AL_API void AL_APIENTRY alMidiStopSOFT(void);
-AL_API void AL_APIENTRY alMidiResetSOFT(void);
-AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value);
-AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname);
-AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values);
-AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
-#endif
-#endif
-
#ifndef ALC_SOFT_device_clock
#define ALC_SOFT_device_clock 1
typedef int64_t ALCint64SOFT;
@@ -677,21 +478,6 @@ struct ALCdevice_struct
// Map of Filters for this device
UIntMap FilterMap;
- // Map of Soundfonts for this device
- UIntMap SfontMap;
-
- // Map of Presets for this device
- UIntMap PresetMap;
-
- // Map of Fontsounds for this device
- UIntMap FontsoundMap;
-
- /* Default soundfont (accessible as ID 0) */
- struct ALsoundfont *DefaultSfont;
-
- /* MIDI synth engine */
- struct MidiSynth *Synth;
-
/* HRTF filter tables */
vector_HrtfEntry Hrtf_List;
al_string Hrtf_Name;
diff --git a/OpenAL32/Include/alMidi.h b/OpenAL32/Include/alMidi.h
deleted file mode 100644
index b1c08e40..00000000
--- a/OpenAL32/Include/alMidi.h
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef ALMIDI_H
-#define ALMIDI_H
-
-#include "alMain.h"
-#include "atomic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct ALsfmodulator {
- struct {
- ALenum Input;
- ALenum Type;
- ALenum Form;
- } Source[2];
- ALint Amount;
- ALenum TransformOp;
- ALenum Dest;
-} ALsfmodulator;
-
-typedef struct ALenvelope {
- ALint DelayTime;
- ALint AttackTime;
- ALint HoldTime;
- ALint DecayTime;
- ALint SustainAttn;
- ALint ReleaseTime;
- ALint KeyToHoldTime;
- ALint KeyToDecayTime;
-} ALenvelope;
-
-
-typedef struct ALfontsound {
- RefCount ref;
-
- ATOMIC(struct ALbuffer*) Buffer;
-
- ALint MinKey, MaxKey;
- ALint MinVelocity, MaxVelocity;
-
- ALint ModLfoToPitch;
- ALint VibratoLfoToPitch;
- ALint ModEnvToPitch;
-
- ALint FilterCutoff;
- ALint FilterQ;
- ALint ModLfoToFilterCutoff;
- ALint ModEnvToFilterCutoff;
- ALint ModLfoToVolume;
-
- ALint ChorusSend;
- ALint ReverbSend;
-
- ALint Pan;
-
- struct {
- ALint Delay;
- ALint Frequency;
- } ModLfo;
- struct {
- ALint Delay;
- ALint Frequency;
- } VibratoLfo;
-
- ALenvelope ModEnv;
- ALenvelope VolEnv;
-
- ALint Attenuation;
-
- ALint CoarseTuning;
- ALint FineTuning;
-
- ALenum LoopMode;
-
- ALint TuningScale;
-
- ALint ExclusiveClass;
-
- ALuint Start;
- ALuint End;
- ALuint LoopStart;
- ALuint LoopEnd;
- ALuint SampleRate;
- ALubyte PitchKey;
- ALbyte PitchCorrection;
- ALenum SampleType;
-
- ATOMIC(struct ALfontsound*) Link;
-
- /* NOTE: Each map entry contains *four* (4) ALsfmodulator objects. */
- UIntMap ModulatorMap;
-
- ALuint id;
-} ALfontsound;
-
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value);
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value);
-
-ALfontsound *NewFontsound(ALCcontext *context);
-void DeleteFontsound(ALCdevice *device, ALfontsound *sound);
-
-inline struct ALfontsound *LookupFontsound(ALCdevice *device, ALuint id)
-{ return (struct ALfontsound*)LookupUIntMapKey(&device->FontsoundMap, id); }
-inline struct ALfontsound *RemoveFontsound(ALCdevice *device, ALuint id)
-{ return (struct ALfontsound*)RemoveUIntMapKey(&device->FontsoundMap, id); }
-
-void ReleaseALFontsounds(ALCdevice *device);
-
-
-typedef struct ALsfpreset {
- RefCount ref;
-
- ALint Preset; /* a.k.a. MIDI program number */
- ALint Bank; /* MIDI bank 0...127, or percussion (bank 128) */
-
- ALfontsound **Sounds;
- ALsizei NumSounds;
-
- ALuint id;
-} ALsfpreset;
-
-ALsfpreset *NewPreset(ALCcontext *context);
-void DeletePreset(ALCdevice *device, ALsfpreset *preset);
-
-inline struct ALsfpreset *LookupPreset(ALCdevice *device, ALuint id)
-{ return (struct ALsfpreset*)LookupUIntMapKey(&device->PresetMap, id); }
-inline struct ALsfpreset *RemovePreset(ALCdevice *device, ALuint id)
-{ return (struct ALsfpreset*)RemoveUIntMapKey(&device->PresetMap, id); }
-
-void ReleaseALPresets(ALCdevice *device);
-
-
-typedef struct ALsoundfont {
- RefCount ref;
-
- ALsfpreset **Presets;
- ALsizei NumPresets;
-
- RWLock Lock;
-
- ALuint id;
-} ALsoundfont;
-
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context);
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device);
-
-inline struct ALsoundfont *LookupSfont(ALCdevice *device, ALuint id)
-{ return (struct ALsoundfont*)LookupUIntMapKey(&device->SfontMap, id); }
-inline struct ALsoundfont *RemoveSfont(ALCdevice *device, ALuint id)
-{ return (struct ALsoundfont*)RemoveUIntMapKey(&device->SfontMap, id); }
-
-void ReleaseALSoundfonts(ALCdevice *device);
-
-
-inline ALboolean IsValidCtrlInput(int cc)
-{
- /* These correspond to MIDI functions, not real controller values. */
- if(cc == 0 || cc == 6 || cc == 32 || cc == 38 || (cc >= 98 && cc <= 101) || cc >= 120)
- return AL_FALSE;
- /* These are the LSB components of CC0...CC31, which are automatically used when
- * reading the MSB controller value. */
- if(cc >= 32 && cc <= 63)
- return AL_FALSE;
- /* All the rest are okay! */
- return AL_TRUE;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ALMIDI_H */
diff --git a/OpenAL32/alFontsound.c b/OpenAL32/alFontsound.c
deleted file mode 100644
index 069fedd3..00000000
--- a/OpenAL32/alFontsound.c
+++ /dev/null
@@ -1,1014 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-#include "alBuffer.h"
-
-#include "midi/base.h"
-
-
-extern inline struct ALfontsound *LookupFontsound(ALCdevice *device, ALuint id);
-extern inline struct ALfontsound *RemoveFontsound(ALCdevice *device, ALuint id);
-
-
-static void ALfontsound_Construct(ALfontsound *self);
-static void ALfontsound_Destruct(ALfontsound *self);
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value);
-static ALsfmodulator *ALfontsound_getModStage(ALfontsound *self, ALsizei stage);
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value);
-static void ALfontsound_getModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint *values);
-
-static inline struct ALsfmodulator *LookupModulator(ALfontsound *sound, ALuint id)
-{
- ALsfmodulator *mod = LookupUIntMapKey(&sound->ModulatorMap, id>>2);
- if(mod) mod += id&3;
- return mod;
-}
-
-
-AL_API void AL_APIENTRY alGenFontsoundsSOFT(ALsizei n, ALuint *ids)
-{
- ALCcontext *context;
- ALsizei cur = 0;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- for(cur = 0;cur < n;cur++)
- {
- ALfontsound *sound = NewFontsound(context);
- if(!sound)
- {
- alDeleteFontsoundsSOFT(cur, ids);
- break;
- }
-
- ids[cur] = sound->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeleteFontsoundsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *inst;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid ID */
- if((inst=LookupFontsound(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&inst->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if((inst=LookupFontsound(device, ids[i])) != NULL)
- DeleteFontsound(device, inst);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsFontsoundSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = LookupFontsound(context->Device, id) ? AL_TRUE : AL_FALSE;
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alFontsoundiSOFT(ALuint id, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
-
- ALfontsound_setPropi(sound, context, param, value);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsound2iSOFT(ALuint id, ALenum param, ALint value1, ALint value2)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- case AL_KEY_RANGE_SOFT:
- if(!(value1 >= 0 && value1 <= 127 && value2 >= 0 && value2 <= 127 && value2 >= value1))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- sound->MinKey = value1;
- sound->MaxKey = value2;
- break;
-
- case AL_VELOCITY_RANGE_SOFT:
- if(!(value1 >= 0 && value1 <= 127 && value2 >= 0 && value2 <= 127 && value2 >= value1))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- sound->MinVelocity = value1;
- sound->MaxVelocity = value2;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsoundivSOFT(ALuint id, ALenum param, const ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- switch(param)
- {
- case AL_KEY_RANGE_SOFT:
- case AL_VELOCITY_RANGE_SOFT:
- alFontsound2iSOFT(id, param, values[0], values[1]);
- return;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- case AL_MOD_ENV_TO_PITCH_SOFT:
- case AL_FILTER_CUTOFF_SOFT:
- case AL_FILTER_RESONANCE_SOFT:
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- case AL_CHORUS_SEND_SOFT:
- case AL_REVERB_SEND_SOFT:
- case AL_PAN_SOFT:
- case AL_MOD_LFO_DELAY_SOFT:
- case AL_MOD_LFO_FREQUENCY_SOFT:
- case AL_VIBRATO_LFO_DELAY_SOFT:
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- case AL_MOD_ENV_DELAYTIME_SOFT:
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- case AL_MOD_ENV_HOLDTIME_SOFT:
- case AL_MOD_ENV_DECAYTIME_SOFT:
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- case AL_MOD_ENV_RELEASETIME_SOFT:
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- case AL_ATTENUATION_SOFT:
- case AL_TUNING_COARSE_SOFT:
- case AL_TUNING_FINE_SOFT:
- case AL_LOOP_MODE_SOFT:
- case AL_TUNING_SCALE_SOFT:
- case AL_EXCLUSIVE_CLASS_SOFT:
- case AL_SAMPLE_START_SOFT:
- case AL_SAMPLE_END_SOFT:
- case AL_SAMPLE_LOOP_START_SOFT:
- case AL_SAMPLE_LOOP_END_SOFT:
- case AL_SAMPLE_RATE_SOFT:
- case AL_BASE_KEY_SOFT:
- case AL_KEY_CORRECTION_SOFT:
- case AL_SAMPLE_TYPE_SOFT:
- case AL_FONTSOUND_LINK_SOFT:
- alFontsoundiSOFT(id, param, values[0]);
- return;
- }
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetFontsoundivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- const ALfontsound *sound;
- ALfontsound *link;
- ALbuffer *buffer;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_BUFFER:
- buffer = ATOMIC_LOAD(&sound->Buffer);
- values[0] = (buffer ? buffer->id : 0);
- break;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- values[0] = sound->ModLfoToPitch;
- break;
-
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- values[0] = sound->VibratoLfoToPitch;
- break;
-
- case AL_MOD_ENV_TO_PITCH_SOFT:
- values[0] = sound->ModEnvToPitch;
- break;
-
- case AL_FILTER_CUTOFF_SOFT:
- values[0] = sound->FilterCutoff;
- break;
-
- case AL_FILTER_RESONANCE_SOFT:
- values[0] = sound->FilterQ;
- break;
-
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- values[0] = sound->ModLfoToFilterCutoff;
- break;
-
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- values[0] = sound->ModEnvToFilterCutoff;
- break;
-
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- values[0] = sound->ModLfoToVolume;
- break;
-
- case AL_CHORUS_SEND_SOFT:
- values[0] = sound->ChorusSend;
- break;
-
- case AL_REVERB_SEND_SOFT:
- values[0] = sound->ReverbSend;
- break;
-
- case AL_PAN_SOFT:
- values[0] = sound->Pan;
- break;
-
- case AL_MOD_LFO_DELAY_SOFT:
- values[0] = sound->ModLfo.Delay;
- break;
- case AL_MOD_LFO_FREQUENCY_SOFT:
- values[0] = sound->ModLfo.Frequency;
- break;
-
- case AL_VIBRATO_LFO_DELAY_SOFT:
- values[0] = sound->VibratoLfo.Delay;
- break;
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- values[0] = sound->VibratoLfo.Frequency;
- break;
-
- case AL_MOD_ENV_DELAYTIME_SOFT:
- values[0] = sound->ModEnv.DelayTime;
- break;
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- values[0] = sound->ModEnv.AttackTime;
- break;
- case AL_MOD_ENV_HOLDTIME_SOFT:
- values[0] = sound->ModEnv.HoldTime;
- break;
- case AL_MOD_ENV_DECAYTIME_SOFT:
- values[0] = sound->ModEnv.DecayTime;
- break;
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- values[0] = sound->ModEnv.SustainAttn;
- break;
- case AL_MOD_ENV_RELEASETIME_SOFT:
- values[0] = sound->ModEnv.ReleaseTime;
- break;
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- values[0] = sound->ModEnv.KeyToHoldTime;
- break;
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- values[0] = sound->ModEnv.KeyToDecayTime;
- break;
-
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- values[0] = sound->VolEnv.DelayTime;
- break;
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- values[0] = sound->VolEnv.AttackTime;
- break;
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- values[0] = sound->VolEnv.HoldTime;
- break;
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- values[0] = sound->VolEnv.DecayTime;
- break;
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- values[0] = sound->VolEnv.SustainAttn;
- break;
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- values[0] = sound->VolEnv.ReleaseTime;
- break;
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- values[0] = sound->VolEnv.KeyToHoldTime;
- break;
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- values[0] = sound->VolEnv.KeyToDecayTime;
- break;
-
- case AL_KEY_RANGE_SOFT:
- values[0] = sound->MinKey;
- values[1] = sound->MaxKey;
- break;
-
- case AL_VELOCITY_RANGE_SOFT:
- values[0] = sound->MinVelocity;
- values[1] = sound->MaxVelocity;
- break;
-
- case AL_ATTENUATION_SOFT:
- values[0] = sound->Attenuation;
- break;
-
- case AL_TUNING_COARSE_SOFT:
- values[0] = sound->CoarseTuning;
- break;
- case AL_TUNING_FINE_SOFT:
- values[0] = sound->FineTuning;
- break;
-
- case AL_LOOP_MODE_SOFT:
- values[0] = sound->LoopMode;
- break;
-
- case AL_TUNING_SCALE_SOFT:
- values[0] = sound->TuningScale;
- break;
-
- case AL_EXCLUSIVE_CLASS_SOFT:
- values[0] = sound->ExclusiveClass;
- break;
-
- case AL_SAMPLE_START_SOFT:
- values[0] = sound->Start;
- break;
-
- case AL_SAMPLE_END_SOFT:
- values[0] = sound->End;
- break;
-
- case AL_SAMPLE_LOOP_START_SOFT:
- values[0] = sound->LoopStart;
- break;
-
- case AL_SAMPLE_LOOP_END_SOFT:
- values[0] = sound->LoopEnd;
- break;
-
- case AL_SAMPLE_RATE_SOFT:
- values[0] = sound->SampleRate;
- break;
-
- case AL_BASE_KEY_SOFT:
- values[0] = sound->PitchKey;
- break;
-
- case AL_KEY_CORRECTION_SOFT:
- values[0] = sound->PitchCorrection;
- break;
-
- case AL_SAMPLE_TYPE_SOFT:
- values[0] = sound->SampleType;
- break;
-
- case AL_FONTSOUND_LINK_SOFT:
- link = ATOMIC_LOAD(&sound->Link);
- values[0] = (link ? link->id : 0);
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsoundModulatoriSOFT(ALuint id, ALsizei stage, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- ALfontsound_setModStagei(sound, context, stage, param, value);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetFontsoundModulatorivSOFT(ALuint id, ALsizei stage, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- ALfontsound_getModStagei(sound, context, stage, param, values);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-ALfontsound *NewFontsound(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- ALfontsound *sound;
- ALenum err;
-
- sound = calloc(1, sizeof(*sound));
- if(!sound)
- SET_ERROR_AND_RETURN_VALUE(context, AL_OUT_OF_MEMORY, NULL);
- ALfontsound_Construct(sound);
-
- err = NewThunkEntry(&sound->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->FontsoundMap, sound->id, sound);
- if(err != AL_NO_ERROR)
- {
- ALfontsound_Destruct(sound);
- memset(sound, 0, sizeof(*sound));
- free(sound);
-
- SET_ERROR_AND_RETURN_VALUE(context, err, NULL);
- }
-
- return sound;
-}
-
-void DeleteFontsound(ALCdevice *device, ALfontsound *sound)
-{
- RemoveFontsound(device, sound->id);
-
- ALfontsound_Destruct(sound);
-
- memset(sound, 0, sizeof(*sound));
- free(sound);
-}
-
-
-static void ALfontsound_Construct(ALfontsound *self)
-{
- InitRef(&self->ref, 0);
-
- ATOMIC_INIT(&self->Buffer, NULL);
-
- self->MinKey = 0;
- self->MaxKey = 127;
- self->MinVelocity = 0;
- self->MaxVelocity = 127;
-
- self->ModLfoToPitch = 0;
- self->VibratoLfoToPitch = 0;
- self->ModEnvToPitch = 0;
-
- self->FilterCutoff = 13500;
- self->FilterQ = 0;
- self->ModLfoToFilterCutoff = 0;
- self->ModEnvToFilterCutoff = 0;
- self->ModLfoToVolume = 0;
-
- self->ChorusSend = 0;
- self->ReverbSend = 0;
-
- self->Pan = 0;
-
- self->ModLfo.Delay = 0;
- self->ModLfo.Frequency = 0;
-
- self->VibratoLfo.Delay = 0;
- self->VibratoLfo.Frequency = 0;
-
- self->ModEnv.DelayTime = -12000;
- self->ModEnv.AttackTime = -12000;
- self->ModEnv.HoldTime = -12000;
- self->ModEnv.DecayTime = -12000;
- self->ModEnv.SustainAttn = 0;
- self->ModEnv.ReleaseTime = -12000;
- self->ModEnv.KeyToHoldTime = 0;
- self->ModEnv.KeyToDecayTime = 0;
-
- self->VolEnv.DelayTime = -12000;
- self->VolEnv.AttackTime = -12000;
- self->VolEnv.HoldTime = -12000;
- self->VolEnv.DecayTime = -12000;
- self->VolEnv.SustainAttn = 0;
- self->VolEnv.ReleaseTime = -12000;
- self->VolEnv.KeyToHoldTime = 0;
- self->VolEnv.KeyToDecayTime = 0;
-
- self->Attenuation = 0;
-
- self->CoarseTuning = 0;
- self->FineTuning = 0;
-
- self->LoopMode = AL_NONE;
-
- self->TuningScale = 100;
-
- self->ExclusiveClass = 0;
-
- self->Start = 0;
- self->End = 0;
- self->LoopStart = 0;
- self->LoopEnd = 0;
- self->SampleRate = 0;
- self->PitchKey = 0;
- self->PitchCorrection = 0;
- self->SampleType = AL_MONO_SOFT;
-
- ATOMIC_INIT(&self->Link, NULL);
-
- InitUIntMap(&self->ModulatorMap, ~0);
-
- self->id = 0;
-}
-
-static void ALfontsound_Destruct(ALfontsound *self)
-{
- ALfontsound *link;
- ALbuffer *buffer;
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- if((buffer=ATOMIC_EXCHANGE(ALbuffer*, &self->Buffer, NULL)) != NULL)
- DecrementRef(&buffer->ref);
-
- if((link=ATOMIC_EXCHANGE(ALfontsound*, &self->Link, NULL)) != NULL)
- DecrementRef(&link->ref);
-
- for(i = 0;i < self->ModulatorMap.size;i++)
- {
- free(self->ModulatorMap.array[i].value);
- self->ModulatorMap.array[i].value = NULL;
- }
- ResetUIntMap(&self->ModulatorMap);
-}
-
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value)
-{
- ALfontsound *link;
- ALbuffer *buffer;
-
- switch(param)
- {
- case AL_BUFFER:
- buffer = value ? LookupBuffer(context->Device, value) : NULL;
- if(value && !buffer)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- else if(buffer)
- {
- /* Buffer must have a non-0 length, and must be mono. */
- if(buffer->SampleLen <= 0 || buffer->FmtChannels != FmtMono)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- }
-
- if(buffer) IncrementRef(&buffer->ref);
- if((buffer=ATOMIC_EXCHANGE(ALbuffer*, &self->Buffer, buffer)) != NULL)
- DecrementRef(&buffer->ref);
- break;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- self->ModLfoToPitch = value;
- break;
-
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- self->VibratoLfoToPitch = value;
- break;
-
- case AL_MOD_ENV_TO_PITCH_SOFT:
- self->ModEnvToPitch = value;
- break;
-
- case AL_FILTER_CUTOFF_SOFT:
- self->FilterCutoff = value;
- break;
-
- case AL_FILTER_RESONANCE_SOFT:
- if(!(value >= 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->FilterQ = value;
- break;
-
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- self->ModLfoToFilterCutoff = value;
- break;
-
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- self->ModEnvToFilterCutoff = value;
- break;
-
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- self->ModLfoToVolume = value;
- break;
-
- case AL_CHORUS_SEND_SOFT:
- if(!(value >= 0 && value <= 1000))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->ChorusSend = value;
- break;
- case AL_REVERB_SEND_SOFT:
- if(!(value >= 0 && value <= 1000))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->ReverbSend = value;
- break;
-
- case AL_PAN_SOFT:
- self->Pan = value;
- break;
-
- case AL_MOD_LFO_DELAY_SOFT:
- self->ModLfo.Delay = value;
- break;
- case AL_MOD_LFO_FREQUENCY_SOFT:
- self->ModLfo.Frequency = value;
- break;
-
- case AL_VIBRATO_LFO_DELAY_SOFT:
- self->VibratoLfo.Delay = value;
- break;
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- self->VibratoLfo.Frequency = value;
- break;
-
- case AL_MOD_ENV_DELAYTIME_SOFT:
- self->ModEnv.DelayTime = value;
- break;
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- self->ModEnv.AttackTime = value;
- break;
- case AL_MOD_ENV_HOLDTIME_SOFT:
- self->ModEnv.HoldTime = value;
- break;
- case AL_MOD_ENV_DECAYTIME_SOFT:
- self->ModEnv.DecayTime = value;
- break;
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- self->ModEnv.SustainAttn = value;
- break;
- case AL_MOD_ENV_RELEASETIME_SOFT:
- self->ModEnv.ReleaseTime = value;
- break;
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- self->ModEnv.KeyToHoldTime = value;
- break;
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- self->ModEnv.KeyToDecayTime = value;
- break;
-
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- self->VolEnv.DelayTime = value;
- break;
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- self->VolEnv.AttackTime = value;
- break;
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- self->VolEnv.HoldTime = value;
- break;
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- self->VolEnv.DecayTime = value;
- break;
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- self->VolEnv.SustainAttn = value;
- break;
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- self->VolEnv.ReleaseTime = value;
- break;
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- self->VolEnv.KeyToHoldTime = value;
- break;
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- self->VolEnv.KeyToDecayTime = value;
- break;
-
- case AL_ATTENUATION_SOFT:
- if(!(value >= 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->Attenuation = value;
- break;
-
- case AL_TUNING_COARSE_SOFT:
- self->CoarseTuning = value;
- break;
- case AL_TUNING_FINE_SOFT:
- self->FineTuning = value;
- break;
-
- case AL_LOOP_MODE_SOFT:
- if(!(value == AL_NONE || value == AL_LOOP_CONTINUOUS_SOFT ||
- value == AL_LOOP_UNTIL_RELEASE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->LoopMode = value;
- break;
-
- case AL_TUNING_SCALE_SOFT:
- self->TuningScale = value;
- break;
-
- case AL_EXCLUSIVE_CLASS_SOFT:
- self->ExclusiveClass = value;
- break;
-
- case AL_SAMPLE_START_SOFT:
- self->Start = value;
- break;
-
- case AL_SAMPLE_END_SOFT:
- self->End = value;
- break;
-
- case AL_SAMPLE_LOOP_START_SOFT:
- self->LoopStart = value;
- break;
-
- case AL_SAMPLE_LOOP_END_SOFT:
- self->LoopEnd = value;
- break;
-
- case AL_SAMPLE_RATE_SOFT:
- if(!(value > 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->SampleRate = value;
- break;
-
- case AL_BASE_KEY_SOFT:
- if(!((value >= 0 && value <= 127) || value == 255))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->PitchKey = value;
- break;
-
- case AL_KEY_CORRECTION_SOFT:
- if(!(value >= -99 && value <= 99))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->PitchCorrection = value;
- break;
-
- case AL_SAMPLE_TYPE_SOFT:
- if(!(value == AL_MONO_SOFT || value == AL_RIGHT_SOFT || value == AL_LEFT_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->SampleType = value;
- break;
-
- case AL_FONTSOUND_LINK_SOFT:
- link = value ? LookupFontsound(context->Device, value) : NULL;
- if(value && !link)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
-
- if(link) IncrementRef(&link->ref);
- if((link=ATOMIC_EXCHANGE(ALfontsound*, &self->Link, link)) != NULL)
- DecrementRef(&link->ref);
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-static ALsfmodulator *ALfontsound_getModStage(ALfontsound *self, ALsizei stage)
-{
- ALsfmodulator *ret = LookupModulator(self, stage);
- if(!ret)
- {
- static const ALsfmodulator moddef = {
- { { AL_ONE_SOFT, AL_UNORM_SOFT, AL_LINEAR_SOFT },
- { AL_ONE_SOFT, AL_UNORM_SOFT, AL_LINEAR_SOFT } },
- 0,
- AL_LINEAR_SOFT,
- AL_NONE
- };
- ret = malloc(sizeof(ALsfmodulator[4]));
- ret[0] = moddef;
- ret[1] = moddef;
- ret[2] = moddef;
- ret[3] = moddef;
- InsertUIntMapEntry(&self->ModulatorMap, stage>>2, ret);
- ret += stage&3;
- }
- return ret;
-}
-
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value)
-{
- ALint srcidx = 0;
-
- if(ReadRef(&self->ref) != 0)
- SET_ERROR_AND_RETURN(context, AL_INVALID_OPERATION);
- switch(param)
- {
- case AL_SOURCE1_INPUT_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_INPUT_SOFT:
- if(!(value == AL_ONE_SOFT || value == AL_NOTEON_VELOCITY_SOFT ||
- value == AL_NOTEON_KEY_SOFT || value == AL_KEYPRESSURE_SOFT ||
- value == AL_CHANNELPRESSURE_SOFT || value == AL_PITCHBEND_SOFT ||
- value == AL_PITCHBEND_SENSITIVITY_SOFT ||
- IsValidCtrlInput(value)))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Input = value;
- break;
-
- case AL_SOURCE1_TYPE_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_TYPE_SOFT:
- if(!(value == AL_UNORM_SOFT || value == AL_UNORM_REV_SOFT ||
- value == AL_SNORM_SOFT || value == AL_SNORM_REV_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Type = value;
- break;
-
- case AL_SOURCE1_FORM_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_FORM_SOFT:
- if(!(value == AL_LINEAR_SOFT || value == AL_CONCAVE_SOFT ||
- value == AL_CONVEX_SOFT || value == AL_SWITCH_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Form = value;
- break;
-
- case AL_AMOUNT_SOFT:
- ALfontsound_getModStage(self, stage)->Amount = value;
- break;
-
- case AL_TRANSFORM_OP_SOFT:
- if(!(value == AL_LINEAR_SOFT || value == AL_ABSOLUTE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->TransformOp = value;
- break;
-
- case AL_DESTINATION_SOFT:
- if(!(value == AL_MOD_LFO_TO_PITCH_SOFT || value == AL_VIBRATO_LFO_TO_PITCH_SOFT ||
- value == AL_MOD_ENV_TO_PITCH_SOFT || value == AL_FILTER_CUTOFF_SOFT ||
- value == AL_FILTER_RESONANCE_SOFT || value == AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT ||
- value == AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT || value == AL_MOD_LFO_TO_VOLUME_SOFT ||
- value == AL_CHORUS_SEND_SOFT || value == AL_REVERB_SEND_SOFT || value == AL_PAN_SOFT ||
- value == AL_MOD_LFO_DELAY_SOFT || value == AL_MOD_LFO_FREQUENCY_SOFT ||
- value == AL_VIBRATO_LFO_DELAY_SOFT || value == AL_VIBRATO_LFO_FREQUENCY_SOFT ||
- value == AL_MOD_ENV_DELAYTIME_SOFT || value == AL_MOD_ENV_ATTACKTIME_SOFT ||
- value == AL_MOD_ENV_HOLDTIME_SOFT || value == AL_MOD_ENV_DECAYTIME_SOFT ||
- value == AL_MOD_ENV_SUSTAINVOLUME_SOFT || value == AL_MOD_ENV_RELEASETIME_SOFT ||
- value == AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT || value == AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT ||
- value == AL_VOLUME_ENV_DELAYTIME_SOFT || value == AL_VOLUME_ENV_ATTACKTIME_SOFT ||
- value == AL_VOLUME_ENV_HOLDTIME_SOFT || value == AL_VOLUME_ENV_DECAYTIME_SOFT ||
- value == AL_VOLUME_ENV_SUSTAINVOLUME_SOFT || value == AL_VOLUME_ENV_RELEASETIME_SOFT ||
- value == AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT || value == AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT ||
- value == AL_ATTENUATION_SOFT || value == AL_TUNING_COARSE_SOFT ||
- value == AL_TUNING_FINE_SOFT || value == AL_TUNING_SCALE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Dest = value;
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-static void ALfontsound_getModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint *values)
-{
- ALsfmodulator *mod = LookupModulator(self, stage);
- ALint srcidx = 0;
-
- switch(param)
- {
- case AL_SOURCE1_INPUT_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_INPUT_SOFT:
- values[0] = mod ? mod->Source[srcidx].Input : AL_ONE_SOFT;
- break;
-
- case AL_SOURCE1_TYPE_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_TYPE_SOFT:
- values[0] = mod ? mod->Source[srcidx].Type : AL_UNORM_SOFT;
- break;
-
- case AL_SOURCE1_FORM_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_FORM_SOFT:
- values[0] = mod ? mod->Source[srcidx].Form : AL_LINEAR_SOFT;
- break;
-
- case AL_AMOUNT_SOFT:
- values[0] = mod ? mod->Amount : 0;
- break;
-
- case AL_TRANSFORM_OP_SOFT:
- values[0] = mod ? mod->TransformOp : AL_LINEAR_SOFT;
- break;
-
- case AL_DESTINATION_SOFT:
- values[0] = mod ? mod->Dest : AL_NONE;
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-
-/* ReleaseALFontsounds
- *
- * Called to destroy any fontsounds that still exist on the device
- */
-void ReleaseALFontsounds(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->FontsoundMap.size;i++)
- {
- ALfontsound *temp = device->FontsoundMap.array[i].value;
- device->FontsoundMap.array[i].value = NULL;
-
- ALfontsound_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alMidi.c b/OpenAL32/alMidi.c
deleted file mode 100644
index 015b1915..00000000
--- a/OpenAL32/alMidi.c
+++ /dev/null
@@ -1,217 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-#include "evtqueue.h"
-#include "rwlock.h"
-#include "alu.h"
-
-#include "midi/base.h"
-
-
-MidiSynth *SynthCreate(ALCdevice *device)
-{
- MidiSynth *synth = NULL;
- if(!synth) synth = SSynth_create(device);
- if(!synth) synth = FSynth_create(device);
- if(!synth) synth = DSynth_create(device);
- return synth;
-}
-
-
-AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id)
-{
- alMidiSoundfontvSOFT(1, &id);
-}
-
-AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- if(synth->State == AL_PLAYING || synth->State == AL_PAUSED)
- alSetError(context, AL_INVALID_OPERATION);
- else
- {
- err = V(synth,selectSoundfonts)(context, count, ids);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
- }
- WriteUnlock(&synth->Lock);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(event == AL_NOTEOFF_SOFT || event == AL_NOTEON_SOFT ||
- event == AL_KEYPRESSURE_SOFT || event == AL_CONTROLLERCHANGE_SOFT ||
- event == AL_PROGRAMCHANGE_SOFT || event == AL_CHANNELPRESSURE_SOFT ||
- event == AL_PITCHBEND_SOFT))
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- if(!(channel >= 0 && channel <= 15))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- if(!(param1 >= 0 && param1 <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- if(!(param2 >= 0 && param2 <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- ALCdevice_Lock(device);
- err = MidiSynth_insertEvent(device->Synth, time, event|channel, param1, param2);
- ALCdevice_Unlock(device);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!data || size < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- ALCdevice_Lock(device);
- err = MidiSynth_insertSysExEvent(device->Synth, time, data, size);
- ALCdevice_Unlock(device);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiPlaySOFT(void)
-{
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- synth = context->Device->Synth;
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_PLAYING);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiPauseSOFT(void)
-{
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- synth = context->Device->Synth;
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_PAUSED);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiStopSOFT(void)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_STOPPED);
-
- ALCdevice_Lock(device);
- V0(synth,stop)();
- ALCdevice_Unlock(device);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiResetSOFT(void)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_INITIAL);
-
- ALCdevice_Lock(device);
- V0(synth,reset)();
- ALCdevice_Unlock(device);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value)
-{
- ALCdevice *device;
- ALCcontext *context;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(value >= 0.0f && isfinite(value)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- V(device->Synth,setGain)(value);
-
-done:
- ALCcontext_DecRef(context);
-}
diff --git a/OpenAL32/alPreset.c b/OpenAL32/alPreset.c
deleted file mode 100644
index 1934ba05..00000000
--- a/OpenAL32/alPreset.c
+++ /dev/null
@@ -1,339 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-
-#include "midi/base.h"
-
-
-extern inline struct ALsfpreset *LookupPreset(ALCdevice *device, ALuint id);
-extern inline struct ALsfpreset *RemovePreset(ALCdevice *device, ALuint id);
-
-static void ALsfpreset_Construct(ALsfpreset *self);
-static void ALsfpreset_Destruct(ALsfpreset *self);
-
-
-AL_API void AL_APIENTRY alGenPresetsSOFT(ALsizei n, ALuint *ids)
-{
- ALCcontext *context;
- ALsizei cur = 0;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- for(cur = 0;cur < n;cur++)
- {
- ALsfpreset *preset = NewPreset(context);
- if(!preset)
- {
- alDeletePresetsSOFT(cur, ids);
- break;
- }
-
- ids[cur] = preset->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeletePresetsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid ID */
- if((preset=LookupPreset(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if((preset=LookupPreset(device, ids[i])) != NULL)
- DeletePreset(device, preset);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsPresetSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = LookupPreset(context->Device, id) ? AL_TRUE : AL_FALSE;
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alPresetiSOFT(ALuint id, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- if(!(value >= 0 && value <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- preset->Preset = value;
- break;
-
- case AL_MIDI_BANK_SOFT:
- if(!(value >= 0 && value <= 128))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- preset->Bank = value;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alPresetivSOFT(ALuint id, ALenum param, const ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
-
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- case AL_MIDI_BANK_SOFT:
- alPresetiSOFT(id, param, values[0]);
- return;
- }
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetPresetivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- values[0] = preset->Preset;
- break;
-
- case AL_MIDI_BANK_SOFT:
- values[0] = preset->Bank;
- break;
-
- case AL_FONTSOUNDS_SIZE_SOFT:
- values[0] = preset->NumSounds;
- break;
-
- case AL_FONTSOUNDS_SOFT:
- for(i = 0;i < preset->NumSounds;i++)
- values[i] = preset->Sounds[i]->id;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALfontsound **sounds;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(preset=LookupPreset(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
-
- if(count == 0)
- sounds = NULL;
- else
- {
- sounds = calloc(count, sizeof(sounds[0]));
- if(!sounds)
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
-
- for(i = 0;i < count;i++)
- {
- if(!(sounds[i]=LookupFontsound(device, fsids[i])))
- {
- free(sounds);
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- }
- }
- }
-
- for(i = 0;i < count;i++)
- IncrementRef(&sounds[i]->ref);
-
- sounds = ExchangePtr((XchgPtr*)&preset->Sounds, sounds);
- count = ExchangeInt(&preset->NumSounds, count);
-
- for(i = 0;i < count;i++)
- DecrementRef(&sounds[i]->ref);
- free(sounds);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-ALsfpreset *NewPreset(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- ALsfpreset *preset;
- ALenum err;
-
- preset = calloc(1, sizeof(*preset));
- if(!preset)
- SET_ERROR_AND_RETURN_VALUE(context, AL_OUT_OF_MEMORY, NULL);
- ALsfpreset_Construct(preset);
-
- err = NewThunkEntry(&preset->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->PresetMap, preset->id, preset);
- if(err != AL_NO_ERROR)
- {
- ALsfpreset_Destruct(preset);
- memset(preset, 0, sizeof(*preset));
- free(preset);
-
- SET_ERROR_AND_RETURN_VALUE(context, err, NULL);
- }
-
- return preset;
-}
-
-void DeletePreset(ALCdevice *device, ALsfpreset *preset)
-{
- RemovePreset(device, preset->id);
-
- ALsfpreset_Destruct(preset);
- memset(preset, 0, sizeof(*preset));
- free(preset);
-}
-
-
-static void ALsfpreset_Construct(ALsfpreset *self)
-{
- InitRef(&self->ref, 0);
-
- self->Preset = 0;
- self->Bank = 0;
-
- self->Sounds = NULL;
- self->NumSounds = 0;
-
- self->id = 0;
-}
-
-static void ALsfpreset_Destruct(ALsfpreset *self)
-{
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- for(i = 0;i < self->NumSounds;i++)
- DecrementRef(&self->Sounds[i]->ref);
- free(self->Sounds);
- self->Sounds = NULL;
- self->NumSounds = 0;
-}
-
-
-/* ReleaseALPresets
- *
- * Called to destroy any presets that still exist on the device
- */
-void ReleaseALPresets(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->PresetMap.size;i++)
- {
- ALsfpreset *temp = device->PresetMap.array[i].value;
- device->PresetMap.array[i].value = NULL;
-
- ALsfpreset_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alSoundfont.c b/OpenAL32/alSoundfont.c
deleted file mode 100644
index 96feed46..00000000
--- a/OpenAL32/alSoundfont.c
+++ /dev/null
@@ -1,455 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alThunk.h"
-#include "alError.h"
-#include <alBuffer.h>
-
-#include "midi/base.h"
-
-
-extern inline struct ALsoundfont *LookupSfont(ALCdevice *device, ALuint id);
-extern inline struct ALsoundfont *RemoveSfont(ALCdevice *device, ALuint id);
-
-static void ALsoundfont_Construct(ALsoundfont *self);
-static void ALsoundfont_Destruct(ALsoundfont *self);
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device);
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context);
-static size_t ALsoundfont_read(ALvoid *buf, size_t bytes, ALvoid *ptr);
-
-
-AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsizei cur = 0;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(cur = 0;cur < n;cur++)
- {
- ALsoundfont *sfont = calloc(1, sizeof(ALsoundfont));
- if(!sfont)
- {
- alDeleteSoundfontsSOFT(cur, ids);
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
- }
- ALsoundfont_Construct(sfont);
-
- err = NewThunkEntry(&sfont->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->SfontMap, sfont->id, sfont);
- if(err != AL_NO_ERROR)
- {
- ALsoundfont_Destruct(sfont);
- memset(sfont, 0, sizeof(ALsoundfont));
- free(sfont);
-
- alDeleteSoundfontsSOFT(cur, ids);
- SET_ERROR_AND_GOTO(context, err, done);
- }
-
- ids[cur] = sfont->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid soundfont ID */
- if(ids[i] == 0)
- {
- if(!(sfont=device->DefaultSfont))
- continue;
- }
- else if((sfont=LookupSfont(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sfont->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if(ids[i] == 0)
- {
- MidiSynth *synth = device->Synth;
- WriteLock(&synth->Lock);
- if(device->DefaultSfont != NULL)
- ALsoundfont_deleteSoundfont(device->DefaultSfont, device);
- device->DefaultSfont = NULL;
- WriteUnlock(&synth->Lock);
- continue;
- }
- else if((sfont=RemoveSfont(device, ids[i])) == NULL)
- continue;
-
- ALsoundfont_Destruct(sfont);
-
- memset(sfont, 0, sizeof(*sfont));
- free(sfont);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = ((!id || LookupSfont(context->Device, id)) ?
- AL_TRUE : AL_FALSE);
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alGetSoundfontivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- sfont = ALsoundfont_getDefSoundfont(context);
- else if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_PRESETS_SIZE_SOFT:
- values[0] = sfont->NumPresets;
- break;
-
- case AL_PRESETS_SOFT:
- for(i = 0;i < sfont->NumPresets;i++)
- values[i] = sfont->Presets[i]->id;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alSoundfontPresetsSOFT(ALuint id, ALsizei count, const ALuint *pids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsfpreset **presets;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- WriteLock(&sfont->Lock);
- if(ReadRef(&sfont->ref) != 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- if(count == 0)
- presets = NULL;
- else
- {
- presets = calloc(count, sizeof(presets[0]));
- if(!presets)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
- }
-
- for(i = 0;i < count;i++)
- {
- if(!(presets[i]=LookupPreset(device, pids[i])))
- {
- free(presets);
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- }
- }
- }
-
- for(i = 0;i < count;i++)
- IncrementRef(&presets[i]->ref);
-
- presets = ExchangePtr((XchgPtr*)&sfont->Presets, presets);
- count = ExchangeInt(&sfont->NumPresets, count);
- WriteUnlock(&sfont->Lock);
-
- for(i = 0;i < count;i++)
- DecrementRef(&presets[i]->ref);
- free(presets);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- Reader reader;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
-
- WriteLock(&sfont->Lock);
- if(ReadRef(&sfont->ref) != 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
- if(sfont->NumPresets > 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- reader.cb = cb;
- reader.ptr = user;
- reader.error = 0;
- loadSf2(&reader, sfont, context);
- WriteUnlock(&sfont->Lock);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-static void ALsoundfont_Construct(ALsoundfont *self)
-{
- InitRef(&self->ref, 0);
-
- self->Presets = NULL;
- self->NumPresets = 0;
-
- RWLockInit(&self->Lock);
-
- self->id = 0;
-}
-
-static void ALsoundfont_Destruct(ALsoundfont *self)
-{
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- for(i = 0;i < self->NumPresets;i++)
- {
- DecrementRef(&self->Presets[i]->ref);
- self->Presets[i] = NULL;
- }
- free(self->Presets);
- self->Presets = NULL;
- self->NumPresets = 0;
-}
-
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- al_string fname = AL_STRING_INIT_STATIC();
- const char *namelist;
-
- if(device->DefaultSfont)
- return device->DefaultSfont;
-
- device->DefaultSfont = calloc(1, sizeof(device->DefaultSfont[0]));
- ALsoundfont_Construct(device->DefaultSfont);
-
- namelist = getenv("ALSOFT_SOUNDFONT");
- if(!namelist || !namelist[0])
- ConfigValueStr(al_string_get_cstr(device->DeviceName), "midi", "soundfont", &namelist);
- while(namelist && namelist[0])
- {
- const char *next, *end;
- FILE *f;
-
- while(*namelist && (isspace(*namelist) || *namelist == ','))
- namelist++;
- if(!*namelist)
- break;
- next = strchr(namelist, ',');
- end = next ? next++ : (namelist+strlen(namelist));
- while(--end != namelist && isspace(*end)) {
- }
- if(end == namelist)
- continue;
- al_string_append_range(&fname, namelist, end+1);
- namelist = next;
-
- f = OpenDataFile(al_string_get_cstr(fname), "openal/soundfonts");
- if(f == NULL)
- ERR("Failed to open %s\n", al_string_get_cstr(fname));
- else
- {
- Reader reader;
- reader.cb = ALsoundfont_read;
- reader.ptr = f;
- reader.error = 0;
- TRACE("Loading %s\n", al_string_get_cstr(fname));
- loadSf2(&reader, device->DefaultSfont, context);
- fclose(f);
- }
-
- al_string_clear(&fname);
- }
- AL_STRING_DEINIT(fname);
-
- return device->DefaultSfont;
-}
-
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device)
-{
- ALsfpreset **presets = self->Presets;
- ALsizei num_presets = self->NumPresets;
- VECTOR(ALbuffer*) buffers;
- ALsizei i;
-
- VECTOR_INIT(buffers);
-
- self->Presets = NULL;
- self->NumPresets = 0;
-
- for(i = 0;i < num_presets;i++)
- {
- ALsfpreset *preset = presets[i];
- ALfontsound **sounds = preset->Sounds;
- ALsizei num_sounds = preset->NumSounds;
- ALboolean deleting;
- ALsizei j;
-
- preset->Sounds = NULL;
- preset->NumSounds = 0;
- DeletePreset(device, preset);
- preset = NULL;
-
- for(j = 0;j < num_sounds;j++)
- DecrementRef(&sounds[j]->ref);
- /* Some fontsounds may not be immediately deletable because they're
- * linked to another fontsound. When those fontsounds are deleted
- * they should become deletable, so use a loop until all fontsounds
- * are deleted. */
- do {
- deleting = AL_FALSE;
- for(j = 0;j < num_sounds;j++)
- {
- if(sounds[j] && ReadRef(&sounds[j]->ref) == 0)
- {
- ALbuffer *buffer;
-
- deleting = AL_TRUE;
- if((buffer=ATOMIC_LOAD(&sounds[j]->Buffer)) != NULL)
- {
- ALbuffer **iter;
-
-#define MATCH_BUFFER(_i) (buffer == *(_i))
- VECTOR_FIND_IF(iter, ALbuffer*, buffers, MATCH_BUFFER);
- if(iter == VECTOR_ITER_END(buffers))
- VECTOR_PUSH_BACK(buffers, buffer);
-#undef MATCH_BUFFER
- }
- DeleteFontsound(device, sounds[j]);
- sounds[j] = NULL;
- }
- }
- } while(deleting);
- free(sounds);
- }
-
- ALsoundfont_Destruct(self);
- free(self);
-
-#define DELETE_BUFFER(iter) do { \
- assert(ReadRef(&(*(iter))->ref) == 0); \
- DeleteBuffer(device, *(iter)); \
-} while(0)
- VECTOR_FOR_EACH(ALbuffer*, buffers, DELETE_BUFFER);
-#undef DELETE_BUFFER
- VECTOR_DEINIT(buffers);
-}
-
-
-static size_t ALsoundfont_read(ALvoid *buf, size_t bytes, ALvoid *ptr)
-{
- return fread(buf, 1, bytes, (FILE*)ptr);
-}
-
-
-/* ReleaseALSoundfonts
- *
- * Called to destroy any soundfonts that still exist on the device
- */
-void ReleaseALSoundfonts(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->SfontMap.size;i++)
- {
- ALsoundfont *temp = device->SfontMap.array[i].value;
- device->SfontMap.array[i].value = NULL;
-
- ALsoundfont_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c
index f2f25f97..dca41363 100644
--- a/OpenAL32/alState.c
+++ b/OpenAL32/alState.c
@@ -28,10 +28,8 @@
#include "alError.h"
#include "alSource.h"
#include "alAuxEffectSlot.h"
-#include "alMidi.h"
#include "backends/base.h"
-#include "midi/base.h"
static const ALchar alVendor[] = "OpenAL Community";
@@ -160,7 +158,6 @@ done:
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname)
{
- ALCdevice *device;
ALCcontext *context;
ALdouble value = 0.0;
@@ -189,16 +186,6 @@ AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname)
value = (ALdouble)context->DeferUpdates;
break;
- case AL_MIDI_GAIN_SOFT:
- device = context->Device;
- value = (ALdouble)MidiSynth_getGain(device->Synth);
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALdouble)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -211,7 +198,6 @@ done:
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname)
{
- ALCdevice *device;
ALCcontext *context;
ALfloat value = 0.0f;
@@ -240,16 +226,6 @@ AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname)
value = (ALfloat)context->DeferUpdates;
break;
- case AL_MIDI_GAIN_SOFT:
- device = context->Device;
- value = MidiSynth_getGain(device->Synth);
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALfloat)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -263,8 +239,6 @@ done:
AL_API ALint AL_APIENTRY alGetInteger(ALenum pname)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
ALint value = 0;
context = GetContextRef();
@@ -292,17 +266,6 @@ AL_API ALint AL_APIENTRY alGetInteger(ALenum pname)
value = (ALint)context->DeferUpdates;
break;
- case AL_SOUNDFONTS_SIZE_SOFT:
- device = context->Device;
- synth = device->Synth;
- value = synth->NumSoundfonts;
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -316,8 +279,6 @@ done:
AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
ALint64SOFT value = 0;
context = GetContextRef();
@@ -345,24 +306,6 @@ AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname)
value = (ALint64SOFT)context->DeferUpdates;
break;
- case AL_MIDI_CLOCK_SOFT:
- device = context->Device;
- V0(device->Backend,lock)();
- value = MidiSynth_getTime(device->Synth);
- V0(device->Backend,unlock)();
- break;
-
- case AL_SOUNDFONTS_SIZE_SOFT:
- device = context->Device;
- synth = device->Synth;
- value = (ALint64SOFT)synth->NumSoundfonts;
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALint64SOFT)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -419,8 +362,6 @@ AL_API ALvoid AL_APIENTRY alGetDoublev(ALenum pname, ALdouble *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_GAIN_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetDouble(pname);
return;
}
@@ -454,8 +395,6 @@ AL_API ALvoid AL_APIENTRY alGetFloatv(ALenum pname, ALfloat *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_GAIN_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetFloat(pname);
return;
}
@@ -479,9 +418,6 @@ done:
AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
- ALsizei i;
if(values)
{
@@ -492,8 +428,6 @@ AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_SOUNDFONTS_SIZE_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetInteger(pname);
return;
}
@@ -504,18 +438,6 @@ AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
switch(pname)
{
- case AL_SOUNDFONTS_SOFT:
- device = context->Device;
- synth = device->Synth;
- if(synth->NumSoundfonts > 0)
- {
- if(!(values))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- for(i = 0;i < synth->NumSoundfonts;i++)
- values[i] = synth->Soundfonts[i]->id;
- }
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -527,9 +449,6 @@ done:
AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
- ALsizei i;
if(values)
{
@@ -540,9 +459,6 @@ AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_CLOCK_SOFT:
- case AL_SOUNDFONTS_SIZE_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetInteger64SOFT(pname);
return;
}
@@ -553,18 +469,6 @@ AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
switch(pname)
{
- case AL_SOUNDFONTS_SOFT:
- device = context->Device;
- synth = device->Synth;
- if(synth->NumSoundfonts > 0)
- {
- if(!(values))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- for(i = 0;i < synth->NumSoundfonts;i++)
- values[i] = (ALint64SOFT)synth->Soundfonts[i]->id;
- }
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}