diff options
Diffstat (limited to 'OpenAL32')
-rw-r--r-- | OpenAL32/Include/alMain.h | 214 | ||||
-rw-r--r-- | OpenAL32/Include/alMidi.h | 173 | ||||
-rw-r--r-- | OpenAL32/alFontsound.c | 1014 | ||||
-rw-r--r-- | OpenAL32/alMidi.c | 217 | ||||
-rw-r--r-- | OpenAL32/alPreset.c | 339 | ||||
-rw-r--r-- | OpenAL32/alSoundfont.c | 455 | ||||
-rw-r--r-- | OpenAL32/alState.c | 96 |
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); } |