Mix effect slot output to the effect target if it's set

This commit is contained in:
Chris Robinson
2018-12-23 08:51:28 -08:00
parent e218999b4f
commit 3fe38fed7c
13 changed files with 181 additions and 61 deletions
+16 -5
View File
@@ -119,11 +119,22 @@ void ALautowahState::update(const ALCcontext *context, const ALeffectslot *slot,
mFreqMinNorm = MIN_FREQ / device->Frequency;
mBandwidthNorm = (MAX_FREQ-MIN_FREQ) / device->Frequency;
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
else
{
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
}
void ALautowahState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+17 -5
View File
@@ -146,11 +146,23 @@ void ChorusState::update(const ALCcontext *Context, const ALeffectslot *Slot, co
mFeedback = props->Chorus.Feedback;
/* Gains for left and right sides */
ALfloat coeffs[MAX_AMBI_COEFFS];
CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs);
ComputePanGains(&device->Dry, coeffs, Slot->Params.Gain, mGains[0].Target);
CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs);
ComputePanGains(&device->Dry, coeffs, Slot->Params.Gain, mGains[1].Target);
ALfloat coeffs[2][MAX_AMBI_COEFFS];
CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs[0]);
CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs[1]);
if(ALeffectslot *target{Slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
ComputePanGains(target, coeffs[0], Slot->Params.Gain, mGains[0].Target);
ComputePanGains(target, coeffs[1], Slot->Params.Gain, mGains[1].Target);
}
else
{
mOutBuffer = device->Dry.Buffer;
mOutChannels = device->Dry.NumChannels;
ComputePanGains(&device->Dry, coeffs[0], Slot->Params.Gain, mGains[0].Target);
ComputePanGains(&device->Dry, coeffs[1], Slot->Params.Gain, mGains[1].Target);
}
ALfloat rate{props->Chorus.Rate};
if(!(rate > 0.0f))
+17 -7
View File
@@ -74,15 +74,25 @@ ALboolean ALcompressorState::deviceUpdate(const ALCdevice *device)
void ALcompressorState::update(const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props)
{
const ALCdevice *device = context->Device;
mEnabled = props->Compressor.OnOff;
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(ALsizei i{0};i < 4;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(),
slot->Params.Gain, mGain[i]);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mGain[i]);
}
else
{
const ALCdevice *device{context->Device};
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(ALsizei i{0};i < 4;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(),
slot->Params.Gain, mGain[i]);
}
}
void ALcompressorState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+14 -2
View File
@@ -52,11 +52,23 @@ ALboolean ALdedicatedState::deviceUpdate(const ALCdevice *UNUSED(device))
void ALdedicatedState::update(const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props)
{
const ALCdevice *device = context->Device;
ALfloat Gain;
std::fill(std::begin(mTargetGains), std::end(mTargetGains), 0.0f);
Gain = slot->Params.Gain * props->Dedicated.Gain;
const ALfloat Gain{slot->Params.Gain * props->Dedicated.Gain};
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
if(slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE)
{
ALfloat coeffs[MAX_AMBI_COEFFS];
CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs);
ComputePanGains(target, coeffs, Gain, mTargetGains);
}
return;
}
if(slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT)
{
int idx;
+12 -1
View File
@@ -90,7 +90,18 @@ void ALdistortionState::update(const ALCcontext *context, const ALeffectslot *sl
);
CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs);
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain*props->Distortion.Gain, mGain);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
ComputePanGains(target, coeffs, slot->Params.Gain*props->Distortion.Gain, mGain);
}
else
{
mOutBuffer = device->Dry.Buffer;
mOutChannels = device->Dry.NumChannels;
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain*props->Distortion.Gain, mGain);
}
}
void ALdistortionState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+17 -7
View File
@@ -94,7 +94,6 @@ void ALechoState::update(const ALCcontext *context, const ALeffectslot *slot, co
{
const ALCdevice *device = context->Device;
ALuint frequency = device->Frequency;
ALfloat coeffs[MAX_AMBI_COEFFS];
ALfloat gainhf, lrpan, spread;
mTap[0].delay = maxi(float2int(props->Echo.Delay*frequency + 0.5f), 1);
@@ -116,13 +115,24 @@ void ALechoState::update(const ALCcontext *context, const ALeffectslot *slot, co
calc_rcpQ_from_slope(gainhf, 1.0f)
);
/* First tap panning */
CalcAngleCoeffs(-F_PI_2*lrpan, 0.0f, spread, coeffs);
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mGains[0].Target);
ALfloat coeffs[2][MAX_AMBI_COEFFS];
CalcAngleCoeffs(-F_PI_2*lrpan, 0.0f, spread, coeffs[0]);
CalcAngleCoeffs( F_PI_2*lrpan, 0.0f, spread, coeffs[1]);
/* Second tap panning */
CalcAngleCoeffs( F_PI_2*lrpan, 0.0f, spread, coeffs);
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mGains[1].Target);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
ComputePanGains(target, coeffs[0], slot->Params.Gain, mGains[0].Target);
ComputePanGains(target, coeffs[1], slot->Params.Gain, mGains[1].Target);
}
else
{
mOutBuffer = device->Dry.Buffer;
mOutChannels = device->Dry.NumChannels;
ComputePanGains(&device->Dry, coeffs[0], slot->Params.Gain, mGains[0].Target);
ComputePanGains(&device->Dry, coeffs[1], slot->Params.Gain, mGains[1].Target);
}
}
void ALechoState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+16 -5
View File
@@ -152,11 +152,22 @@ void ALequalizerState::update(const ALCcontext *context, const ALeffectslot *slo
mChans[i].filter[3].copyParamsFrom(mChans[0].filter[3]);
}
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
else
{
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
}
void ALequalizerState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+12 -1
View File
@@ -132,7 +132,18 @@ void ALfshifterState::update(const ALCcontext *context, const ALeffectslot *slot
ALfloat coeffs[MAX_AMBI_COEFFS];
CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs);
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mTargetGains);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
ComputePanGains(target, coeffs, slot->Params.Gain, mTargetGains);
}
else
{
mOutBuffer = device->Dry.Buffer;
mOutChannels = device->Dry.NumChannels;
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mTargetGains);
}
}
void ALfshifterState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+16 -5
View File
@@ -131,11 +131,22 @@ void ALmodulatorState::update(const ALCcontext *context, const ALeffectslot *slo
for(i = 1;i < MAX_EFFECT_CHANNELS;i++)
mChans[i].Filter.copyParamsFrom(mChans[0].Filter);
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
else
{
mOutBuffer = device->FOAOut.Buffer;
mOutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&device->FOAOut, alu::Matrix::Identity()[i].data(), slot->Params.Gain,
mChans[i].TargetGains);
}
}
void ALmodulatorState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+16 -7
View File
@@ -175,18 +175,27 @@ ALboolean ALpshifterState::deviceUpdate(const ALCdevice *device)
void ALpshifterState::update(const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props)
{
const ALCdevice *device = context->Device;
ALfloat coeffs[MAX_AMBI_COEFFS];
float pitch;
pitch = std::pow(2.0f,
const float pitch{std::pow(2.0f,
(ALfloat)(props->Pshifter.CoarseTune*100 + props->Pshifter.FineTune) / 1200.0f
);
)};
mPitchShiftI = fastf2i(pitch*FRACTIONONE);
mPitchShift = mPitchShiftI * (1.0f/FRACTIONONE);
ALfloat coeffs[MAX_AMBI_COEFFS];
CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs);
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mTargetGains);
if(ALeffectslot *target{slot->Params.Target})
{
mOutBuffer = target->WetBuffer;
mOutChannels = target->NumChannels;
ComputePanGains(target, coeffs, slot->Params.Gain, mTargetGains);
}
else
{
const ALCdevice *device{context->Device};
mOutBuffer = device->Dry.Buffer;
mOutChannels = device->Dry.NumChannels;
ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, mTargetGains);
}
}
void ALpshifterState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesIn)[BUFFERSIZE], ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
+23 -16
View File
@@ -763,11 +763,8 @@ alu::Matrix GetTransformFromVector(const ALfloat *vec)
}
/* Update the early and late 3D panning gains. */
ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, const ALfloat earlyGain, const ALfloat lateGain, ReverbState *State)
ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, const ALfloat earlyGain, const ALfloat lateGain, ALeffectslot *target, ReverbState *State)
{
State->mOutBuffer = Device->FOAOut.Buffer;
State->mOutChannels = Device->FOAOut.NumChannels;
/* Note: ret is transposed. */
auto MatrixMult = [](const alu::Matrix &m1, const alu::Matrix &m2) noexcept -> alu::Matrix
{
@@ -784,17 +781,27 @@ ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, c
/* Create a matrix that first converts A-Format to B-Format, then
* transforms the B-Format signal according to the panning vector.
*/
alu::Matrix rot{GetTransformFromVector(ReflectionsPan)};
alu::Matrix transform{MatrixMult(rot, A2B)};
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&Device->FOAOut, transform[i].data(), earlyGain,
State->mEarly.PanGain[i]);
rot = GetTransformFromVector(LateReverbPan);
transform = MatrixMult(rot, A2B);
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&Device->FOAOut, transform[i].data(), lateGain,
State->mLate.PanGain[i]);
alu::Matrix earlymat{MatrixMult(GetTransformFromVector(ReflectionsPan), A2B)};
alu::Matrix latemat{MatrixMult(GetTransformFromVector(LateReverbPan), A2B)};
if(target)
{
State->mOutBuffer = target->WetBuffer;
State->mOutChannels = target->NumChannels;
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, earlymat[i].data(), earlyGain, State->mEarly.PanGain[i]);
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(target, latemat[i].data(), lateGain, State->mLate.PanGain[i]);
}
else
{
State->mOutBuffer = Device->FOAOut.Buffer;
State->mOutChannels = Device->FOAOut.NumChannels;
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&Device->FOAOut, earlymat[i].data(), earlyGain,
State->mEarly.PanGain[i]);
for(ALsizei i{0};i < MAX_EFFECT_CHANNELS;i++)
ComputePanGains(&Device->FOAOut, latemat[i].data(), lateGain, State->mLate.PanGain[i]);
}
}
void ReverbState::update(const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props)
@@ -858,7 +865,7 @@ void ReverbState::update(const ALCcontext *Context, const ALeffectslot *Slot, co
const ALfloat gain{props->Reverb.Gain * Slot->Params.Gain * ReverbBoost};
Update3DPanning(Device, props->Reverb.ReflectionsPan, props->Reverb.LateReverbPan,
props->Reverb.ReflectionsGain*gain, props->Reverb.LateReverbGain*gain,
this);
Slot->Params.Target, this);
/* Calculate the max update size from the smallest relevant delay. */
mMaxUpdate[1] = mini(MAX_UPDATE_SAMPLES, mini(mEarly.Offset[0][1], mLate.Offset[0][1]));
+3
View File
@@ -867,6 +867,9 @@ void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, con
std::fill(iter, std::end(gains), 0.0f);
}
void ComputePanGains(const ALeffectslot *slot, const ALfloat*RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS])
{ ComputePanningGainsBF(slot->ChanMap, slot->NumChannels, coeffs, ingain, gains); }
void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq)
{
+2
View File
@@ -476,6 +476,8 @@ inline void ComputePanGains(const MixParams *dry, const ALfloat*RESTRICT coeffs,
ComputePanningGainsBF(dry->Ambi.Map, dry->NumChannels, coeffs, ingain, gains);
}
void ComputePanGains(const ALeffectslot *slot, const ALfloat*RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS]);
ALboolean MixSource(struct ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo);