aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/alcmain.h13
-rw-r--r--alc/alu.cpp44
-rw-r--r--alc/alu.h5
-rw-r--r--alc/panning.cpp10
4 files changed, 35 insertions, 37 deletions
diff --git a/alc/alcmain.h b/alc/alcmain.h
index 464febcc..910e3279 100644
--- a/alc/alcmain.h
+++ b/alc/alcmain.h
@@ -188,8 +188,6 @@ struct RealMixParams {
al::span<FloatBufferLine> Buffer;
};
-using POSTPROCESS = void(*)(ALCdevice *device, const ALsizei SamplesToDo);
-
enum {
// Frequency was requested by the app or config file
FrequencyRequest,
@@ -305,7 +303,8 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice> {
/* Stereo-to-binaural filter */
std::unique_ptr<bs2b> Bs2b;
- POSTPROCESS PostProcess{};
+ using PostProc = void(ALCdevice::*)(const ALsizei SamplesToDo);
+ PostProc PostProcess{nullptr};
std::unique_ptr<FrontStablizer> Stablizer;
@@ -345,6 +344,14 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice> {
ALsizei channelsFromFmt() const noexcept { return ChannelsFromDevFmt(FmtChans, mAmbiOrder); }
ALsizei frameSizeFromFmt() const noexcept { return bytesFromFmt() * channelsFromFmt(); }
+ void ProcessHrtf(const ALsizei SamplesToDo);
+ void ProcessAmbiDec(const ALsizei SamplesToDo);
+ void ProcessUhj(const ALsizei SamplesToDo);
+ void ProcessBs2b(const ALsizei SamplesToDo);
+
+ inline void postProcess(const ALsizei SamplesToDo)
+ { if LIKELY(PostProcess) (this->*PostProcess)(SamplesToDo); }
+
DEF_NEWDEL(ALCdevice)
};
diff --git a/alc/alu.cpp b/alc/alu.cpp
index b50927e2..8cef4228 100644
--- a/alc/alu.cpp
+++ b/alc/alu.cpp
@@ -147,51 +147,47 @@ void aluInit(void)
}
-void ProcessHrtf(ALCdevice *device, const ALsizei SamplesToDo)
+void ALCdevice::ProcessHrtf(const ALsizei SamplesToDo)
{
/* HRTF is stereo output only. */
- const int lidx{device->RealOut.ChannelIndex[FrontLeft]};
- const int ridx{device->RealOut.ChannelIndex[FrontRight]};
+ const int lidx{RealOut.ChannelIndex[FrontLeft]};
+ const int ridx{RealOut.ChannelIndex[FrontRight]};
ASSUME(lidx >= 0 && ridx >= 0);
- DirectHrtfState *state{device->mHrtfState.get()};
- MixDirectHrtf(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], device->Dry.Buffer,
- device->HrtfAccumData, state, SamplesToDo);
+ MixDirectHrtf(RealOut.Buffer[lidx], RealOut.Buffer[ridx], Dry.Buffer, HrtfAccumData,
+ mHrtfState.get(), SamplesToDo);
}
-void ProcessAmbiDec(ALCdevice *device, const ALsizei SamplesToDo)
+void ALCdevice::ProcessAmbiDec(const ALsizei SamplesToDo)
{
- BFormatDec *ambidec{device->AmbiDecoder.get()};
- ambidec->process(device->RealOut.Buffer, device->Dry.Buffer.data(), SamplesToDo);
+ AmbiDecoder->process(RealOut.Buffer, Dry.Buffer.data(), SamplesToDo);
}
-void ProcessUhj(ALCdevice *device, const ALsizei SamplesToDo)
+void ALCdevice::ProcessUhj(const ALsizei SamplesToDo)
{
/* UHJ is stereo output only. */
- const int lidx{device->RealOut.ChannelIndex[FrontLeft]};
- const int ridx{device->RealOut.ChannelIndex[FrontRight]};
+ const int lidx{RealOut.ChannelIndex[FrontLeft]};
+ const int ridx{RealOut.ChannelIndex[FrontRight]};
ASSUME(lidx >= 0 && ridx >= 0);
/* Encode to stereo-compatible 2-channel UHJ output. */
- Uhj2Encoder *uhj2enc{device->Uhj_Encoder.get()};
- uhj2enc->encode(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx],
- device->Dry.Buffer.data(), SamplesToDo);
+ Uhj_Encoder->encode(RealOut.Buffer[lidx], RealOut.Buffer[ridx], Dry.Buffer.data(),
+ SamplesToDo);
}
-void ProcessBs2b(ALCdevice *device, const ALsizei SamplesToDo)
+void ALCdevice::ProcessBs2b(const ALsizei SamplesToDo)
{
/* First, decode the ambisonic mix to the "real" output. */
- BFormatDec *ambidec{device->AmbiDecoder.get()};
- ambidec->process(device->RealOut.Buffer, device->Dry.Buffer.data(), SamplesToDo);
+ AmbiDecoder->process(RealOut.Buffer, Dry.Buffer.data(), SamplesToDo);
/* BS2B is stereo output only. */
- const int lidx{device->RealOut.ChannelIndex[FrontLeft]};
- const int ridx{device->RealOut.ChannelIndex[FrontRight]};
+ const int lidx{RealOut.ChannelIndex[FrontLeft]};
+ const int ridx{RealOut.ChannelIndex[FrontRight]};
ASSUME(lidx >= 0 && ridx >= 0);
/* Now apply the BS2B binaural/crossfeed filter. */
- bs2b_cross_feed(device->Bs2b.get(), device->RealOut.Buffer[lidx].data(),
- device->RealOut.Buffer[ridx].data(), SamplesToDo);
+ bs2b_cross_feed(Bs2b.get(), RealOut.Buffer[lidx].data(), RealOut.Buffer[ridx].data(),
+ SamplesToDo);
}
@@ -1665,8 +1661,8 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples)
/* Apply any needed post-process for finalizing the Dry mix to the
* RealOut (Ambisonic decode, UHJ encode, etc).
*/
- if LIKELY(device->PostProcess)
- device->PostProcess(device, SamplesToDo);
+ device->postProcess(SamplesToDo);
+
const al::span<FloatBufferLine> RealOut{device->RealOut.Buffer};
/* Apply front image stablization for surround sound, if applicable. */
diff --git a/alc/alu.h b/alc/alu.h
index dd133f5a..b030dbaa 100644
--- a/alc/alu.h
+++ b/alc/alu.h
@@ -380,11 +380,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
void aluInitEffectPanning(ALeffectslot *slot, ALCdevice *device);
-void ProcessHrtf(ALCdevice *device, const ALsizei SamplesToDo);
-void ProcessAmbiDec(ALCdevice *device, const ALsizei SamplesToDo);
-void ProcessUhj(ALCdevice *device, const ALsizei SamplesToDo);
-void ProcessBs2b(ALCdevice *device, const ALsizei SamplesToDo);
-
/**
* Calculates ambisonic encoder coefficients using the X, Y, and Z direction
* components, which must represent a normalized (unit length) vector, and the
diff --git a/alc/panning.cpp b/alc/panning.cpp
index 55af4747..d946d1fc 100644
--- a/alc/panning.cpp
+++ b/alc/panning.cpp
@@ -721,7 +721,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
InitCustomPanning(device, !!hqdec, pconf, speakermap);
}
if(device->AmbiDecoder)
- device->PostProcess = ProcessAmbiDec;
+ device->PostProcess = &ALCdevice::ProcessAmbiDec;
return;
}
@@ -802,7 +802,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
old_hrtf = nullptr;
InitHrtfPanning(device);
- device->PostProcess = ProcessHrtf;
+ device->PostProcess = &ALCdevice::ProcessHrtf;
return;
}
device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT;
@@ -824,7 +824,7 @@ no_hrtf:
bs2b_set_params(device->Bs2b.get(), *cflevopt, device->Frequency);
TRACE("BS2B enabled\n");
InitPanning(device);
- device->PostProcess = ProcessBs2b;
+ device->PostProcess = &ALCdevice::ProcessBs2b;
return;
}
}
@@ -843,13 +843,13 @@ no_hrtf:
device->Uhj_Encoder = al::make_unique<Uhj2Encoder>();
TRACE("UHJ enabled\n");
InitUhjPanning(device);
- device->PostProcess = ProcessUhj;
+ device->PostProcess = &ALCdevice::ProcessUhj;
return;
}
TRACE("Stereo rendering\n");
InitPanning(device);
- device->PostProcess = ProcessAmbiDec;
+ device->PostProcess = &ALCdevice::ProcessAmbiDec;
}