Allow processing some effects in higher order ambisonics
Reverb notably is still only first-order (any higher order channels are dropped, and it writes to FOAOut). But others, like the equalizer, work on all available channels.
This commit is contained in:
parent
a964890537
commit
8ac2d34706
@ -2068,7 +2068,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
|
||||
if(context->DefaultSlot)
|
||||
{
|
||||
ALeffectslot *slot = context->DefaultSlot.get();
|
||||
aluInitEffectPanning(slot);
|
||||
aluInitEffectPanning(slot, device);
|
||||
|
||||
EffectState *state{slot->Effect.State};
|
||||
state->mOutBuffer = device->Dry.Buffer;
|
||||
@ -2091,7 +2091,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
|
||||
|
||||
usemask &= ~(1_u64 << idx);
|
||||
|
||||
aluInitEffectPanning(slot);
|
||||
aluInitEffectPanning(slot, device);
|
||||
|
||||
EffectState *state{slot->Effect.State};
|
||||
state->mOutBuffer = device->Dry.Buffer;
|
||||
@ -3453,7 +3453,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
|
||||
void *ptr{al_calloc(16, sizeof(ALeffectslot))};
|
||||
ALContext->DefaultSlot = std::unique_ptr<ALeffectslot>{new (ptr) ALeffectslot{}};
|
||||
if(InitEffectSlot(ALContext->DefaultSlot.get()) == AL_NO_ERROR)
|
||||
aluInitEffectPanning(ALContext->DefaultSlot.get());
|
||||
aluInitEffectPanning(ALContext->DefaultSlot.get(), dev.get());
|
||||
else
|
||||
{
|
||||
ALContext->DefaultSlot = nullptr;
|
||||
|
@ -117,12 +117,12 @@ void ALautowahState::update(const ALCcontext *context, const ALeffectslot *slot,
|
||||
mFreqMinNorm = MIN_FREQ / device->Frequency;
|
||||
mBandwidthNorm = (MAX_FREQ-MIN_FREQ) / device->Frequency;
|
||||
|
||||
mOutBuffer = target.FOAOut->Buffer;
|
||||
mOutChannels = target.FOAOut->NumChannels;
|
||||
mOutBuffer = target.Main->Buffer;
|
||||
mOutChannels = target.Main->NumChannels;
|
||||
for(size_t i{0u};i < slot->WetBuffer.size();++i)
|
||||
{
|
||||
auto coeffs = GetAmbiIdentityRow(i);
|
||||
ComputePanGains(target.FOAOut, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,12 +76,12 @@ void ALcompressorState::update(const ALCcontext* UNUSED(context), const ALeffect
|
||||
{
|
||||
mEnabled = props->Compressor.OnOff;
|
||||
|
||||
mOutBuffer = target.FOAOut->Buffer;
|
||||
mOutChannels = target.FOAOut->NumChannels;
|
||||
mOutBuffer = target.Main->Buffer;
|
||||
mOutChannels = target.Main->NumChannels;
|
||||
for(size_t i{0u};i < slot->WetBuffer.size();++i)
|
||||
{
|
||||
auto coeffs = GetAmbiIdentityRow(i);
|
||||
ComputePanGains(target.FOAOut, coeffs.data(), slot->Params.Gain, mGain[i]);
|
||||
ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mGain[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,12 +149,12 @@ void ALequalizerState::update(const ALCcontext *context, const ALeffectslot *slo
|
||||
mChans[i].filter[3].copyParamsFrom(mChans[0].filter[3]);
|
||||
}
|
||||
|
||||
mOutBuffer = target.FOAOut->Buffer;
|
||||
mOutChannels = target.FOAOut->NumChannels;
|
||||
mOutBuffer = target.Main->Buffer;
|
||||
mOutChannels = target.Main->NumChannels;
|
||||
for(size_t i{0u};i < slot->WetBuffer.size();++i)
|
||||
{
|
||||
auto coeffs = GetAmbiIdentityRow(i);
|
||||
ComputePanGains(target.FOAOut, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,12 +129,12 @@ void ALmodulatorState::update(const ALCcontext *context, const ALeffectslot *slo
|
||||
for(size_t i{1u};i < slot->WetBuffer.size();++i)
|
||||
mChans[i].Filter.copyParamsFrom(mChans[0].Filter);
|
||||
|
||||
mOutBuffer = target.FOAOut->Buffer;
|
||||
mOutChannels = target.FOAOut->NumChannels;
|
||||
mOutBuffer = target.Main->Buffer;
|
||||
mOutChannels = target.Main->NumChannels;
|
||||
for(size_t i{0u};i < slot->WetBuffer.size();++i)
|
||||
{
|
||||
auto coeffs = GetAmbiIdentityRow(i);
|
||||
ComputePanGains(target.FOAOut, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1134,9 +1134,9 @@ no_hrtf:
|
||||
}
|
||||
|
||||
|
||||
void aluInitEffectPanning(ALeffectslot *slot)
|
||||
void aluInitEffectPanning(ALeffectslot *slot, ALCdevice *device)
|
||||
{
|
||||
const size_t count{4u};
|
||||
const size_t count{AmbiChannelsFromOrder(device->mAmbiOrder)};
|
||||
slot->WetBuffer.resize(count);
|
||||
slot->WetBuffer.shrink_to_fit();
|
||||
|
||||
|
@ -350,7 +350,7 @@ ResamplerFunc SelectResampler(Resampler resampler);
|
||||
*/
|
||||
void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq);
|
||||
|
||||
void aluInitEffectPanning(ALeffectslot *slot);
|
||||
void aluInitEffectPanning(ALeffectslot *slot, ALCdevice *device);
|
||||
|
||||
void aluSelectPostProcess(ALCdevice *device);
|
||||
|
||||
|
@ -237,7 +237,7 @@ ALeffectslot *AllocEffectSlot(ALCcontext *context)
|
||||
alSetError(context, err, "Effect slot object initialization failed");
|
||||
return nullptr;
|
||||
}
|
||||
aluInitEffectPanning(slot);
|
||||
aluInitEffectPanning(slot, device);
|
||||
|
||||
/* Add 1 to avoid source ID 0. */
|
||||
slot->id = ((lidx<<6) | slidx) + 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user