Named Effect parameters added. Unsupported effects disabled.

Unnamed parameter Effect setting is no longer functional.

--HG--
branch : minor
This commit is contained in:
Raidho
2017-01-06 08:41:27 +03:00
parent 9fd53ad46f
commit 42f89153ae
10 changed files with 683 additions and 322 deletions
+5 -5
View File
@@ -445,7 +445,7 @@ const std::vector<love::audio::RecordingDevice*> &Audio::getRecordingDevices()
return capture;
}
bool Audio::setSceneEffect(int slot, Effect::Type type, std::vector<float> &params)
bool Audio::setSceneEffect(int slot, std::map<Effect::Parameter, float> &params)
{
if (slot < 0 || slot >= MAX_SCENE_EFFECTS)
return false;
@@ -453,15 +453,16 @@ bool Audio::setSceneEffect(int slot, Effect::Type type, std::vector<float> &para
if (!effects[slot])
effects[slot] = new Effect();
bool result = effects[slot]->setParams(type, params);
bool result = effects[slot]->setParams(params);
#ifdef ALC_EXT_EFX
if (alAuxiliaryEffectSloti)
{
if (result == true)
{
if (params.find(Effect::EFFECT_VOLUME) != params.end())
alAuxiliaryEffectSlotf(effectSlots[slot], AL_EFFECTSLOT_GAIN, params[Effect::EFFECT_VOLUME]);
alAuxiliaryEffectSloti(effectSlots[slot], AL_EFFECTSLOT_EFFECT, effects[slot]->getEffect());
alAuxiliaryEffectSlotf(effectSlots[slot], AL_EFFECTSLOT_GAIN, params[0]);
}
else
alAuxiliaryEffectSloti(effectSlots[slot], AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);
@@ -490,7 +491,7 @@ bool Audio::setSceneEffect(int slot)
return true;
}
bool Audio::getSceneEffect(int slot, Effect::Type &type, std::vector<float> &params)
bool Audio::getSceneEffect(int slot, std::map<Effect::Parameter, float> &params)
{
if (slot < 0 || slot >= MAX_SCENE_EFFECTS)
return false;
@@ -498,7 +499,6 @@ bool Audio::getSceneEffect(int slot, Effect::Type &type, std::vector<float> &par
if (!effects[slot])
return false;
type = effects[slot]->getType();
params = effects[slot]->getParams();
return true;
+2 -2
View File
@@ -114,9 +114,9 @@ public:
DistanceModel getDistanceModel() const;
void setDistanceModel(DistanceModel distanceModel);
bool setSceneEffect(int slot, Effect::Type type, std::vector<float> &params);
bool setSceneEffect(int slot, std::map<Effect::Parameter, float> &params);
bool setSceneEffect(int slot);
bool getSceneEffect(int slot, Effect::Type &type, std::vector<float> &params);
bool getSceneEffect(int slot, std::map<Effect::Parameter, float> &params);
int getMaxSceneEffects() const;
int getMaxSourceEffects() const;
bool isEFXsupported() const;
+131 -121
View File
@@ -40,7 +40,7 @@ Effect::Effect()
Effect::Effect(const Effect &s)
: Effect()
{
setParams(s.getType(), s.getParams());
setParams(s.getParams());
}
Effect::~Effect()
@@ -81,21 +81,21 @@ void Effect::deleteEffect()
effect = AL_EFFECT_NULL;
}
ALuint Effect::getEffect() const
{
return effect;
}
bool Effect::setParams(Type type, const std::vector<float> &params)
bool Effect::setParams(const std::map<Parameter, float> &params)
{
this->type = type;
this->params = params;
type = static_cast<Type>(this->params[EFFECT_TYPE]);
if (!generateEffect())
return false;
#ifdef ALC_EXT_EFX
//parameter table without EFFECT_TYPE entry is illegal
switch (type)
{
case TYPE_REVERB:
@@ -113,6 +113,7 @@ bool Effect::setParams(Type type, const std::vector<float> &params)
case TYPE_FLANGER:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_FLANGER);
break;
/*
case TYPE_FREQSHIFTER:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_FREQUENCY_SHIFTER);
break;
@@ -122,18 +123,22 @@ bool Effect::setParams(Type type, const std::vector<float> &params)
case TYPE_PITCHSHIFTER:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER);
break;
*/
case TYPE_MODULATOR:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_RING_MODULATOR);
break;
/*
case TYPE_AUTOWAH:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_AUTOWAH);
break;
*/
case TYPE_COMPRESSOR:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_COMPRESSOR);
break;
case TYPE_EQUALIZER:
alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER);
break;
case TYPE_BASIC:
case TYPE_MAX_ENUM:
break;
}
@@ -145,96 +150,98 @@ bool Effect::setParams(Type type, const std::vector<float> &params)
return false;
}
#define PARAMSTR(i,e,v) effect, AL_ ## e ## _ ## v, clampf(params[(i)], AL_ ## e ## _MIN_ ## v, AL_ ## e ## _MAX_ ## v, AL_ ## e ## _DEFAULT_ ## v)
#define clampf(v,l,h) fmax(fmin((v),(h)),(l))
#define PARAMSTR(i,e,v) effect,AL_##e##_##v,clampf(getValue(i,AL_##e##_DEFAULT_##v),AL_##e##_MIN_##v,AL_##e##_MAX_##v)
switch (type)
{
case TYPE_REVERB:
{
alEffectf(PARAMSTR(1,REVERB,GAIN));
alEffectf(PARAMSTR(2,REVERB,GAINHF));
alEffectf(PARAMSTR(3,REVERB,DENSITY));
alEffectf(PARAMSTR(4,REVERB,DIFFUSION));
alEffectf(PARAMSTR(5,REVERB,DECAY_TIME));
alEffectf(PARAMSTR(6,REVERB,DECAY_HFRATIO));
alEffectf(PARAMSTR(7,REVERB,REFLECTIONS_GAIN));
alEffectf(PARAMSTR(8,REVERB,REFLECTIONS_DELAY));
alEffectf(PARAMSTR(9,REVERB,LATE_REVERB_GAIN));
alEffectf(PARAMSTR(10,REVERB,LATE_REVERB_DELAY));;
alEffectf(PARAMSTR(11,REVERB,ROOM_ROLLOFF_FACTOR));
alEffectf(PARAMSTR(12,REVERB,AIR_ABSORPTION_GAINHF));
alEffecti(effect, AL_REVERB_DECAY_HFLIMIT, params[13] < 0.5 ? AL_FALSE : AL_TRUE);
alEffectf(PARAMSTR(REVERB_GAIN,REVERB,GAIN));
alEffectf(PARAMSTR(REVERB_HFGAIN,REVERB,GAINHF));
alEffectf(PARAMSTR(REVERB_DENSITY,REVERB,DENSITY));
alEffectf(PARAMSTR(REVERB_DIFFUSION,REVERB,DIFFUSION));
alEffectf(PARAMSTR(REVERB_DECAY,REVERB,DECAY_TIME));
alEffectf(PARAMSTR(REVERB_HFDECAY,REVERB,DECAY_HFRATIO));
alEffectf(PARAMSTR(REVERB_EARLYGAIN,REVERB,REFLECTIONS_GAIN));
alEffectf(PARAMSTR(REVERB_EARLYDELAY,REVERB,REFLECTIONS_DELAY));
alEffectf(PARAMSTR(REVERB_LATEGAIN,REVERB,LATE_REVERB_GAIN));
alEffectf(PARAMSTR(REVERB_LATEDELAY,REVERB,LATE_REVERB_DELAY));;
alEffectf(PARAMSTR(REVERB_ROLLOFF,REVERB,ROOM_ROLLOFF_FACTOR));
alEffectf(PARAMSTR(REVERB_AIRHFGAIN,REVERB,AIR_ABSORPTION_GAINHF));
alEffecti(effect, AL_REVERB_DECAY_HFLIMIT, getValue(REVERB_HFLIMITER, 0));
break;
}
case TYPE_CHORUS:
{
Effect::Waveform wave = static_cast<Effect::Waveform>(params[1]);
if (wave == Effect::WAVE_SINE)
Waveform wave = static_cast<Waveform>(getValue(CHORUS_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));
if (wave == WAVE_SINE)
alEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_SINUSOID);
else if (wave == Effect::WAVE_TRIANGLE)
else if (wave == WAVE_TRIANGLE)
alEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_TRIANGLE);
else
alEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_DEFAULT_WAVEFORM);
alEffecti(PARAMSTR(2,CHORUS,PHASE));
alEffectf(PARAMSTR(3,CHORUS,RATE));
alEffectf(PARAMSTR(4,CHORUS,DEPTH));
alEffectf(PARAMSTR(5,CHORUS,FEEDBACK));
alEffectf(PARAMSTR(6,CHORUS,DELAY));
alEffecti(PARAMSTR(CHORUS_PHASE,CHORUS,PHASE));
alEffectf(PARAMSTR(CHORUS_RATE,CHORUS,RATE));
alEffectf(PARAMSTR(CHORUS_DEPTH,CHORUS,DEPTH));
alEffectf(PARAMSTR(CHORUS_FEEDBACK,CHORUS,FEEDBACK));
alEffectf(PARAMSTR(CHORUS_DELAY,CHORUS,DELAY));
break;
}
case TYPE_DISTORTION:
alEffectf(PARAMSTR(1,DISTORTION,GAIN));
alEffectf(PARAMSTR(2,DISTORTION,EDGE));
alEffectf(PARAMSTR(3,DISTORTION,LOWPASS_CUTOFF));
alEffectf(PARAMSTR(4,DISTORTION,EQCENTER));
alEffectf(PARAMSTR(5,DISTORTION,EQBANDWIDTH));
alEffectf(PARAMSTR(DISTORTION_GAIN,DISTORTION,GAIN));
alEffectf(PARAMSTR(DISTORTION_EDGE,DISTORTION,EDGE));
alEffectf(PARAMSTR(DISTORTION_LOWCUT,DISTORTION,LOWPASS_CUTOFF));
alEffectf(PARAMSTR(DISTORTION_EQCENTER,DISTORTION,EQCENTER));
alEffectf(PARAMSTR(DISTORTION_EQBAND,DISTORTION,EQBANDWIDTH));
break;
case TYPE_ECHO:
alEffectf(PARAMSTR(1,ECHO,DELAY));
alEffectf(PARAMSTR(2,ECHO,LRDELAY));
alEffectf(PARAMSTR(3,ECHO,DAMPING));
alEffectf(PARAMSTR(4,ECHO,FEEDBACK));
alEffectf(PARAMSTR(5,ECHO,SPREAD));
alEffectf(PARAMSTR(ECHO_DELAY,ECHO,DELAY));
alEffectf(PARAMSTR(ECHO_LRDELAY,ECHO,LRDELAY));
alEffectf(PARAMSTR(ECHO_DAMPING,ECHO,DAMPING));
alEffectf(PARAMSTR(ECHO_FEEDBACK,ECHO,FEEDBACK));
alEffectf(PARAMSTR(ECHO_SPREAD,ECHO,SPREAD));
break;
case TYPE_FLANGER:
{
Effect::Waveform wave = static_cast<Effect::Waveform>(params[1]);
if (wave == Effect::WAVE_SINE)
Waveform wave = static_cast<Waveform>(getValue(FLANGER_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));
if (wave == WAVE_SINE)
alEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_SINUSOID);
else if (wave == Effect::WAVE_TRIANGLE)
else if (wave == WAVE_TRIANGLE)
alEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_TRIANGLE);
else
alEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_DEFAULT_WAVEFORM);
alEffecti(PARAMSTR(2,FLANGER,PHASE));
alEffectf(PARAMSTR(3,FLANGER,RATE));
alEffectf(PARAMSTR(4,FLANGER,DEPTH));
alEffectf(PARAMSTR(5,FLANGER,FEEDBACK));
alEffectf(PARAMSTR(6,FLANGER,DELAY));
alEffecti(PARAMSTR(FLANGER_PHASE,FLANGER,PHASE));
alEffectf(PARAMSTR(FLANGER_RATE,FLANGER,RATE));
alEffectf(PARAMSTR(FLANGER_DEPTH,FLANGER,DEPTH));
alEffectf(PARAMSTR(FLANGER_FEEDBACK,FLANGER,FEEDBACK));
alEffectf(PARAMSTR(FLANGER_DELAY,FLANGER,DELAY));
break;
}
/*
case TYPE_FREQSHIFTER:
{
alEffectf(PARAMSTR(1,FREQUENCY_SHIFTER,FREQUENCY));
alEffectf(PARAMSTR(FREQSHIFTER_FREQ,FREQUENCY_SHIFTER,FREQUENCY));
Effect::Direction dir = static_cast<Effect::Direction>(params[2]);
if (dir == Effect::DIR_NONE)
Direction dir = static_cast<Direction>(getValue(FREQSHIFTER_LEFTDIR, static_cast<int>(DIR_MAX_ENUM)));
if (dir == DIR_NONE)
alEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_OFF);
else if(dir == Effect::DIR_UP)
else if(dir == DIR_UP)
alEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_UP);
else if(dir == Effect::DIR_DOWN)
else if(dir == DIR_DOWN)
alEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_DOWN);
else
alEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION);
dir = static_cast<Effect::Direction>(params[3]);
if (dir == Effect::DIR_NONE)
dir = static_cast<Direction>(getValue(FREQSHIFTER_RIGHTDIR, static_cast<int>(DIR_MAX_ENUM)));
if (dir == DIR_NONE)
alEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_OFF);
else if(dir == Effect::DIR_UP)
else if(dir == DIR_UP)
alEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_UP);
else if(dir == Effect::DIR_DOWN)
else if(dir == DIR_DOWN)
alEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_DOWN);
else
alEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION);
@@ -242,110 +249,110 @@ bool Effect::setParams(Type type, const std::vector<float> &params)
}
case TYPE_MORPHER:
{
Effect::Waveform wave = static_cast<Effect::Waveform>(params[1]);
if (wave == Effect::WAVE_SINE)
Waveform wave = static_cast<Waveform>(getValue(MORPHER_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));
if (wave == WAVE_SINE)
alEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_SINUSOID);
else if (wave == Effect::WAVE_TRIANGLE)
else if (wave == WAVE_TRIANGLE)
alEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE);
else if (wave == Effect::WAVE_SAWTOOTH)
else if (wave == WAVE_SAWTOOTH)
alEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH);
else
alEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_DEFAULT_WAVEFORM);
alEffectf(PARAMSTR(2,VOCAL_MORPHER,RATE));
if (isnanf(params[3]))
Phoneme phoneme = static_cast<Phoneme>(getValue(MORPHER_PHONEMEA, static_cast<int>(PHONEME_MAX_ENUM)));
if (phoneme == PHONEME_MAX_ENUM)
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEA, AL_VOCAL_MORPHER_DEFAULT_PHONEMEA);
else
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEA, phonemeMap[static_cast<Effect::Phoneme>(params[2])]);
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEA, phonemeMap[phoneme]);
if (isnanf(params[4]))
phoneme = static_cast<Phoneme>(getValue(MORPHER_PHONEMEB, static_cast<int>(PHONEME_MAX_ENUM)));
if (phoneme == PHONEME_MAX_ENUM)
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEB, AL_VOCAL_MORPHER_DEFAULT_PHONEMEB);
else
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEB, phonemeMap[static_cast<Effect::Phoneme>(params[3])]);
alEffecti(effect, AL_VOCAL_MORPHER_PHONEMEB, phonemeMap[phoneme]);
alEffecti(PARAMSTR(5,VOCAL_MORPHER,PHONEMEA_COARSE_TUNING));
alEffecti(PARAMSTR(6,VOCAL_MORPHER,PHONEMEB_COARSE_TUNING));
alEffectf(PARAMSTR(MORPHER_RATE,VOCAL_MORPHER,RATE));
alEffecti(PARAMSTR(MORPHER_TUNEA,VOCAL_MORPHER,PHONEMEA_COARSE_TUNING));
alEffecti(PARAMSTR(MORPHER_TUNEB,VOCAL_MORPHER,PHONEMEB_COARSE_TUNING));
break;
}
case TYPE_PITCHSHIFTER:
{
int coarse = AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE;
int fine = AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE;
if (!isnanf(params[1]))
float tune = getValue(PITCHSHIFTER_PITCH, (float)AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE + (float)(AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE - 50) / 100.0 );
int coarse = (int)floor(tune);
int fine = (int)(fmod(tune, 1.0)*100.0);
if (fine > 50)
{
coarse = (int)floor(params[1]);
fine = (int)(fmod(params[1], 1.0)*100.0);
if (fine > 50)
{
fine -= 100;
coarse += 1;
}
else if (fine < -50)
{
fine += 100;
coarse -= 1;
}
if (coarse > AL_PITCH_SHIFTER_MAX_COARSE_TUNE)
{
coarse = AL_PITCH_SHIFTER_MAX_COARSE_TUNE;
fine = AL_PITCH_SHIFTER_MAX_FINE_TUNE;
}
else if (coarse < AL_PITCH_SHIFTER_MIN_COARSE_TUNE)
{
coarse = AL_PITCH_SHIFTER_MIN_COARSE_TUNE;
fine = AL_PITCH_SHIFTER_MIN_FINE_TUNE;
}
fine -= 100;
coarse += 1;
}
else if (fine < -50)
{
fine += 100;
coarse -= 1;
}
if (coarse > AL_PITCH_SHIFTER_MAX_COARSE_TUNE)
{
coarse = AL_PITCH_SHIFTER_MAX_COARSE_TUNE;
fine = AL_PITCH_SHIFTER_MAX_FINE_TUNE;
}
else if (coarse < AL_PITCH_SHIFTER_MIN_COARSE_TUNE)
{
coarse = AL_PITCH_SHIFTER_MIN_COARSE_TUNE;
fine = AL_PITCH_SHIFTER_MIN_FINE_TUNE;
}
alEffecti(effect, AL_PITCH_SHIFTER_COARSE_TUNE, coarse);
alEffecti(effect, AL_PITCH_SHIFTER_FINE_TUNE, fine);
break;
}
*/
case TYPE_MODULATOR:
{
Effect::Waveform wave = static_cast<Effect::Waveform>(params[1]);
if (wave == Effect::WAVE_SINE)
Waveform wave = static_cast<Waveform>(getValue(MODULATOR_WAVEFORM,static_cast<int>(WAVE_MAX_ENUM)));
if (wave == WAVE_SINE)
alEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SINUSOID);
else if (wave == Effect::WAVE_SAWTOOTH)
else if (wave == WAVE_SAWTOOTH)
alEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SAWTOOTH);
else if (wave == Effect::WAVE_SQUARE)
else if (wave == WAVE_SQUARE)
alEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SQUARE);
else
alEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_DEFAULT_WAVEFORM);
alEffectf(PARAMSTR(2,RING_MODULATOR,FREQUENCY));
alEffectf(PARAMSTR(3,RING_MODULATOR,HIGHPASS_CUTOFF));
alEffectf(PARAMSTR(MODULATOR_FREQ,RING_MODULATOR,FREQUENCY));
alEffectf(PARAMSTR(MODULATOR_HIGHCUT,RING_MODULATOR,HIGHPASS_CUTOFF));
break;
}
/*
case TYPE_AUTOWAH:
alEffectf(PARAMSTR(1,AUTOWAH,ATTACK_TIME));
alEffectf(PARAMSTR(2,AUTOWAH,RELEASE_TIME));
alEffectf(PARAMSTR(3,AUTOWAH,RESONANCE));
alEffectf(PARAMSTR(4,AUTOWAH,PEAK_GAIN));
alEffectf(PARAMSTR(AUTOWAH_ATTACK,AUTOWAH,ATTACK_TIME));
alEffectf(PARAMSTR(AUTOWAH_RELEASE,AUTOWAH,RELEASE_TIME));
alEffectf(PARAMSTR(AUTOWAH_RESONANCE,AUTOWAH,RESONANCE));
alEffectf(PARAMSTR(AUTOWAH_PEAKGAIN,AUTOWAH,PEAK_GAIN));
break;
*/
case TYPE_COMPRESSOR:
alEffecti(effect, AL_COMPRESSOR_ONOFF, params[1] < 0.5 ? 0 : 1);
alEffecti(effect, AL_COMPRESSOR_ONOFF, getValue(COMPRESSOR_ENABLE,static_cast<int>(AL_COMPRESSOR_DEFAULT_ONOFF)));
break;
case TYPE_EQUALIZER:
alEffectf(PARAMSTR(1,EQUALIZER,LOW_GAIN));
alEffectf(PARAMSTR(2,EQUALIZER,LOW_CUTOFF));
alEffectf(PARAMSTR(3,EQUALIZER,MID1_GAIN));
alEffectf(PARAMSTR(4,EQUALIZER,MID1_CENTER));
alEffectf(PARAMSTR(5,EQUALIZER,MID1_WIDTH));
alEffectf(PARAMSTR(6,EQUALIZER,MID2_GAIN));
alEffectf(PARAMSTR(7,EQUALIZER,MID2_CENTER));
alEffectf(PARAMSTR(8,EQUALIZER,MID2_WIDTH));
alEffectf(PARAMSTR(9,EQUALIZER,HIGH_GAIN));
alEffectf(PARAMSTR(10,EQUALIZER,HIGH_CUTOFF));
alEffectf(PARAMSTR(EQUALIZER_LOWGAIN,EQUALIZER,LOW_GAIN));
alEffectf(PARAMSTR(EQUALIZER_LOWCUT,EQUALIZER,LOW_CUTOFF));
alEffectf(PARAMSTR(EQUALIZER_MID1GAIN,EQUALIZER,MID1_GAIN));
alEffectf(PARAMSTR(EQUALIZER_MID1FREQ,EQUALIZER,MID1_CENTER));
alEffectf(PARAMSTR(EQUALIZER_MID1BAND,EQUALIZER,MID1_WIDTH));
alEffectf(PARAMSTR(EQUALIZER_MID2GAIN,EQUALIZER,MID2_GAIN));
alEffectf(PARAMSTR(EQUALIZER_MID2FREQ,EQUALIZER,MID2_CENTER));
alEffectf(PARAMSTR(EQUALIZER_MID2BAND,EQUALIZER,MID2_WIDTH));
alEffectf(PARAMSTR(EQUALIZER_HIGHGAIN,EQUALIZER,HIGH_GAIN));
alEffectf(PARAMSTR(EQUALIZER_HIGHCUT,EQUALIZER,HIGH_CUTOFF));
break;
case TYPE_BASIC:
case TYPE_MAX_ENUM:
break;
}
#undef PARAMSTR
#undef clampf
//alGetError();
return true;
@@ -354,20 +361,22 @@ bool Effect::setParams(Type type, const std::vector<float> &params)
#endif //ALC_EXT_EFX
}
const std::vector<float> &Effect::getParams() const
const std::map<Effect::Parameter, float> &Effect::getParams() const
{
return params;
}
//clamp values silently to avoid randomly throwing errors due to implementation differences
float Effect::clampf(float val, float min, float max, float def)
float Effect::getValue(Parameter in, float def) const
{
if (isnanf(val)) return def;
else if (val < min) val = min;
else if (val > max) val = max;
return val;
return params.find(in) == params.end() ? def : params.at(in);
}
int Effect::getValue(Parameter in, int def) const
{
return params.find(in) == params.end() ? def : static_cast<int>(params.at(in));
}
/*
std::map<Effect::Phoneme, ALint> Effect::phonemeMap =
{
{Effect::PHONEME_A, AL_VOCAL_MORPHER_PHONEME_A},
@@ -401,6 +410,7 @@ std::map<Effect::Phoneme, ALint> Effect::phonemeMap =
{Effect::PHONEME_V, AL_VOCAL_MORPHER_PHONEME_V},
{Effect::PHONEME_Z, AL_VOCAL_MORPHER_PHONEME_Z}
};
*/
} //openal
} //audio
+7 -5
View File
@@ -66,16 +66,18 @@ public:
virtual ~Effect();
virtual Effect *clone();
ALuint getEffect() const;
virtual bool setParams(Type type, const std::vector<float> &params);
virtual const std::vector<float> &getParams() const;
virtual bool setParams(const std::map<Parameter, float> &params);
virtual const std::map<Parameter, float> &getParams() const;
private:
bool generateEffect();
void deleteEffect();
float clampf(float val, float min, float max, float def);
float getValue(Parameter in, float def) const;
int getValue(Parameter in, int def) const;
ALuint effect = AL_EFFECT_NULL;
std::vector<float> params;
static std::map<Phoneme, ALint> phonemeMap;
std::map<Parameter, float> params;
//static std::map<Phoneme, ALint> phonemeMap;
};
} //openal