aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
Diffstat (limited to 'Alc')
-rw-r--r--Alc/alc.cpp53
-rw-r--r--Alc/alu.cpp29
-rw-r--r--Alc/panning.cpp57
3 files changed, 61 insertions, 78 deletions
diff --git a/Alc/alc.cpp b/Alc/alc.cpp
index 99966853..1299e8e2 100644
--- a/Alc/alc.cpp
+++ b/Alc/alc.cpp
@@ -1810,14 +1810,21 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if(device->Flags.get<DeviceRunning>())
return ALC_NO_ERROR;
+ device->AvgSpeakerDist = 0.0f;
device->Uhj_Encoder = nullptr;
+ device->AmbiDecoder = nullptr;
device->Bs2b = nullptr;
+ device->PostProcess = nullptr;
+ device->Stablizer = nullptr;
device->Limiter = nullptr;
device->ChannelDelay.clear();
+ device->Dry.AmbiMap.fill(BFChannelConfig{});
device->Dry.Buffer = nullptr;
device->Dry.NumChannels = 0;
+ std::fill(std::begin(device->NumChannelsPerOrder), std::end(device->NumChannelsPerOrder), 0u);
+ device->RealOut.ChannelIndex.fill(-1);
device->RealOut.Buffer = nullptr;
device->RealOut.NumChannels = 0;
device->MixBuffer.clear();
@@ -1826,6 +1833,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
UpdateClockBase(device);
device->FixedLatency = nanoseconds::zero();
+ device->DitherDepth = 0.0f;
device->DitherSeed = DITHER_RNG_SEED;
/*************************************************************************
@@ -1947,10 +1955,47 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
device->NumAuxSends = new_sends;
TRACE("Max sources: %d (%d + %d), effect slots: %d, sends: %d\n",
- device->SourcesMax, device->NumMonoSources, device->NumStereoSources,
- device->AuxiliaryEffectSlotMax, device->NumAuxSends);
+ device->SourcesMax, device->NumMonoSources, device->NumStereoSources,
+ device->AuxiliaryEffectSlotMax, device->NumAuxSends);
+
+ /* Enable the stablizer only for formats that have front-left, front-right,
+ * and front-center outputs.
+ */
+ switch(device->FmtChans)
+ {
+ case DevFmtX51:
+ case DevFmtX51Rear:
+ case DevFmtX61:
+ case DevFmtX71:
+ if(GetConfigValueBool(device->DeviceName.c_str(), nullptr, "front-stablizer", 0))
+ {
+ auto stablizer = al::make_unique<FrontStablizer>();
+ /* Initialize band-splitting filters for the front-left and
+ * front-right channels, with a crossover at 5khz (could be
+ * higher).
+ */
+ const ALfloat scale{static_cast<ALfloat>(5000.0 / device->Frequency)};
+
+ stablizer->LFilter.init(scale);
+ stablizer->RFilter = stablizer->LFilter;
+
+ device->Stablizer = std::move(stablizer);
+ /* NOTE: Don't know why this has to be "copied" into a local static
+ * constexpr variable to avoid a reference on
+ * FrontStablizer::DelayLength...
+ */
+ static constexpr size_t StablizerDelay{FrontStablizer::DelayLength};
+ device->FixedLatency += nanoseconds{seconds{StablizerDelay}} / device->Frequency;
+ }
+ break;
+ case DevFmtMono:
+ case DevFmtStereo:
+ case DevFmtQuad:
+ case DevFmtAmbi3D:
+ break;
+ }
+ TRACE("Front stablizer %s\n", device->Stablizer ? "enabled" : "disabled");
- device->DitherDepth = 0.0f;
if(GetConfigValueBool(device->DeviceName.c_str(), nullptr, "dither", 1))
{
ALint depth = 0;
@@ -2043,8 +2088,6 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
TRACE("Output limiter enabled, %.4fdB limit\n", thrshld_dB);
}
- aluSelectPostProcess(device);
-
TRACE("Fixed device latency: %ldns\n", (long)device->FixedLatency.count());
/* Need to delay returning failure until replacement Send arrays have been
diff --git a/Alc/alu.cpp b/Alc/alu.cpp
index 07b3ccd3..cc478a89 100644
--- a/Alc/alu.cpp
+++ b/Alc/alu.cpp
@@ -124,6 +124,13 @@ inline HrtfDirectMixerFunc SelectHrtfMixer(void)
return MixDirectHrtf_<CTag>;
}
+} // namespace
+
+void aluInit(void)
+{
+ MixDirectHrtf = SelectHrtfMixer();
+}
+
void ProcessHrtf(ALCdevice *device, const ALsizei SamplesToDo)
{
@@ -174,28 +181,6 @@ void ProcessBs2b(ALCdevice *device, const ALsizei SamplesToDo)
device->RealOut.Buffer[ridx].data(), SamplesToDo);
}
-} // namespace
-
-void aluInit(void)
-{
- MixDirectHrtf = SelectHrtfMixer();
-}
-
-
-void aluSelectPostProcess(ALCdevice *device)
-{
- if(device->mHrtf)
- device->PostProcess = ProcessHrtf;
- else if(device->AmbiDecoder)
- device->PostProcess = ProcessAmbiDec;
- else if(device->Uhj_Encoder)
- device->PostProcess = ProcessUhj;
- else if(device->Bs2b)
- device->PostProcess = ProcessBs2b;
- else
- device->PostProcess = nullptr;
-}
-
/* Prepares the interpolator for a given rate (determined by increment).
*
diff --git a/Alc/panning.cpp b/Alc/panning.cpp
index 4c899f66..41e827ef 100644
--- a/Alc/panning.cpp
+++ b/Alc/panning.cpp
@@ -754,16 +754,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
device->HrtfName.clear();
device->mRenderMode = NormalRender;
- device->Dry.AmbiMap.fill(BFChannelConfig{});
- device->Dry.NumChannels = 0;
- std::fill(std::begin(device->NumChannelsPerOrder), std::end(device->NumChannelsPerOrder), 0u);
-
- device->AvgSpeakerDist = 0.0f;
- device->ChannelDelay.clear();
-
- device->AmbiDecoder = nullptr;
- device->Stablizer = nullptr;
-
if(device->FmtChans != DevFmtStereo)
{
if(old_hrtf)
@@ -816,50 +806,11 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
int hqdec{GetConfigValueBool(devname, "decoder", "hq-mode", 0)};
InitCustomPanning(device, !!hqdec, pconf, speakermap);
}
-
- /* Enable the stablizer only for formats that have front-left, front-
- * right, and front-center outputs.
- */
- switch(device->FmtChans)
- {
- case DevFmtX51:
- case DevFmtX51Rear:
- case DevFmtX61:
- case DevFmtX71:
- if(GetConfigValueBool(devname, nullptr, "front-stablizer", 0))
- {
- auto stablizer = al::make_unique<FrontStablizer>();
- /* Initialize band-splitting filters for the front-left and
- * front-right channels, with a crossover at 5khz (could be
- * higher).
- */
- const ALfloat scale{static_cast<ALfloat>(5000.0 / device->Frequency)};
-
- stablizer->LFilter.init(scale);
- stablizer->RFilter = stablizer->LFilter;
-
- device->Stablizer = std::move(stablizer);
- /* NOTE: Don't know why this has to be "copied" into a local
- * static constexpr variable to avoid a reference on
- * FrontStablizer::DelayLength...
- */
- static constexpr size_t StablizerDelay{FrontStablizer::DelayLength};
- device->FixedLatency += nanoseconds{seconds{StablizerDelay}} / device->Frequency;
- }
- break;
- case DevFmtMono:
- case DevFmtStereo:
- case DevFmtQuad:
- case DevFmtAmbi3D:
- break;
- }
- TRACE("Front stablizer %s\n", device->Stablizer ? "enabled" : "disabled");
-
+ if(device->AmbiDecoder)
+ device->PostProcess = ProcessAmbiDec;
return;
}
- device->AmbiDecoder = nullptr;
-
bool headphones{device->IsHeadphones != AL_FALSE};
if(device->Type != Loopback)
{
@@ -937,6 +888,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
old_hrtf = nullptr;
InitHrtfPanning(device);
+ device->PostProcess = ProcessHrtf;
return;
}
device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT;
@@ -958,6 +910,7 @@ no_hrtf:
bs2b_set_params(device->Bs2b.get(), bs2blevel, device->Frequency);
TRACE("BS2B enabled\n");
InitPanning(device);
+ device->PostProcess = ProcessBs2b;
return;
}
@@ -974,11 +927,13 @@ no_hrtf:
device->Uhj_Encoder = al::make_unique<Uhj2Encoder>();
TRACE("UHJ enabled\n");
InitUhjPanning(device);
+ device->PostProcess = ProcessUhj;
return;
}
TRACE("Stereo rendering\n");
InitPanning(device);
+ device->PostProcess = ProcessAmbiDec;
}