| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972 |
- #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 ALfontsound *LookupFontsound(ALCdevice *device, ALuint id);
- extern inline struct ALfontsound *RemoveFontsound(ALCdevice *device, ALuint id);
- static void ALfontsound_Construct(ALfontsound *self);
- 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);
- 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(inst->ref != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
- for(i = 0;i < n;i++)
- {
- if((inst=RemoveFontsound(device, ids[i])) == NULL)
- continue;
- ALfontsound_Destruct(inst);
- memset(inst, 0, sizeof(*inst));
- free(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(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(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(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;
- 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_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:
- values[0] = (sound->Link ? sound->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;
- }
- static void ALfontsound_Construct(ALfontsound *self)
- {
- self->ref = 0;
- 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;
- self->Link = NULL;
- InitUIntMap(&self->ModulatorMap, ~0);
- self->id = 0;
- }
- void ALfontsound_Destruct(ALfontsound *self)
- {
- ALsizei i;
- FreeThunkEntry(self->id);
- self->id = 0;
- if(self->Link)
- DecrementRef(&self->Link->ref);
- self->Link = NULL;
- 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;
- switch(param)
- {
- 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:
- if(!value)
- link = NULL;
- else
- {
- link = LookupFontsound(context->Device, value);
- if(!link)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- }
- if(link) IncrementRef(&link->ref);
- link = ExchangePtr((XchgPtr*)&self->Link, link);
- if(link) 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(*ret));
- *ret = moddef;
- InsertUIntMapEntry(&self->ModulatorMap, stage, ret);
- }
- return ret;
- }
- void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value)
- {
- ALint srcidx = 0;
- if(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 ||
- (value > 0 && value < 120 && !(value == 6 || (value >= 32 && value <= 63) ||
- (value >= 98 && value <= 101))
- )
- ))
- 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);
- }
- }
|