aboutsummaryrefslogtreecommitdiffstats
path: root/alc/voice.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2021-04-27 08:26:42 -0700
committerChris Robinson <[email protected]>2021-04-27 08:26:42 -0700
commitff380298e4086490584707b8ffde44c5ad64830f (patch)
tree313288fbfdc2ea7824508e85d264966db6078368 /alc/voice.h
parent99157f149f180cfcc2e4be6a3d2a54843411e87a (diff)
Move BufferStorage and Voice to core
Diffstat (limited to 'alc/voice.h')
-rw-r--r--alc/voice.h271
1 files changed, 0 insertions, 271 deletions
diff --git a/alc/voice.h b/alc/voice.h
deleted file mode 100644
index 937294e3..00000000
--- a/alc/voice.h
+++ /dev/null
@@ -1,271 +0,0 @@
-#ifndef VOICE_H
-#define VOICE_H
-
-#include <stddef.h>
-
-#include <array>
-#include <atomic>
-#include <memory>
-#include <string>
-
-#include "albyte.h"
-#include "almalloc.h"
-#include "aloptional.h"
-#include "alspan.h"
-#include "buffer_storage.h"
-#include "core/bufferline.h"
-#include "core/devformat.h"
-#include "core/filters/biquad.h"
-#include "core/filters/nfc.h"
-#include "core/filters/splitter.h"
-#include "core/mixer/defs.h"
-#include "core/mixer/hrtfdefs.h"
-#include "core/resampler_limits.h"
-#include "core/uhjfilter.h"
-#include "vector.h"
-
-struct ContextBase;
-struct DeviceBase;
-struct EffectSlot;
-enum class DistanceModel : unsigned char;
-
-using uint = unsigned int;
-
-
-#define MAX_SENDS 6
-
-
-enum class SpatializeMode : unsigned char {
- Off,
- On,
- Auto
-};
-
-enum class DirectMode : unsigned char {
- Off,
- DropMismatch,
- RemixMismatch
-};
-
-
-/* Maximum number of extra source samples that may need to be loaded, for
- * resampling or conversion purposes.
- */
-constexpr uint MaxPostVoiceLoad{MaxResamplerEdge + UhjDecoder::sFilterDelay};
-
-
-enum {
- AF_None = 0,
- AF_LowPass = 1,
- AF_HighPass = 2,
- AF_BandPass = AF_LowPass | AF_HighPass
-};
-
-
-struct DirectParams {
- BiquadFilter LowPass;
- BiquadFilter HighPass;
-
- NfcFilter NFCtrlFilter;
-
- struct {
- HrtfFilter Old;
- HrtfFilter Target;
- alignas(16) std::array<float,HrtfHistoryLength> History;
- } Hrtf;
-
- struct {
- std::array<float,MAX_OUTPUT_CHANNELS> Current;
- std::array<float,MAX_OUTPUT_CHANNELS> Target;
- } Gains;
-};
-
-struct SendParams {
- BiquadFilter LowPass;
- BiquadFilter HighPass;
-
- struct {
- std::array<float,MAX_OUTPUT_CHANNELS> Current;
- std::array<float,MAX_OUTPUT_CHANNELS> Target;
- } Gains;
-};
-
-
-struct VoiceBufferItem {
- std::atomic<VoiceBufferItem*> mNext{nullptr};
-
- CallbackType mCallback{nullptr};
- void *mUserData{nullptr};
-
- uint mSampleLen{0u};
- uint mLoopStart{0u};
- uint mLoopEnd{0u};
-
- al::byte *mSamples{nullptr};
-};
-
-
-struct VoiceProps {
- float Pitch;
- float Gain;
- float OuterGain;
- float MinGain;
- float MaxGain;
- float InnerAngle;
- float OuterAngle;
- float RefDistance;
- float MaxDistance;
- float RolloffFactor;
- std::array<float,3> Position;
- std::array<float,3> Velocity;
- std::array<float,3> Direction;
- std::array<float,3> OrientAt;
- std::array<float,3> OrientUp;
- bool HeadRelative;
- DistanceModel mDistanceModel;
- Resampler mResampler;
- DirectMode DirectChannels;
- SpatializeMode mSpatializeMode;
-
- bool DryGainHFAuto;
- bool WetGainAuto;
- bool WetGainHFAuto;
- float OuterGainHF;
-
- float AirAbsorptionFactor;
- float RoomRolloffFactor;
- float DopplerFactor;
-
- std::array<float,2> StereoPan;
-
- float Radius;
-
- /** Direct filter and auxiliary send info. */
- struct {
- float Gain;
- float GainHF;
- float HFReference;
- float GainLF;
- float LFReference;
- } Direct;
- struct SendData {
- EffectSlot *Slot;
- float Gain;
- float GainHF;
- float HFReference;
- float GainLF;
- float LFReference;
- } Send[MAX_SENDS];
-};
-
-struct VoicePropsItem : public VoiceProps {
- std::atomic<VoicePropsItem*> next{nullptr};
-
- DEF_NEWDEL(VoicePropsItem)
-};
-
-constexpr uint VoiceIsStatic{ 1u<<0};
-constexpr uint VoiceIsCallback{ 1u<<1};
-constexpr uint VoiceIsAmbisonic{ 1u<<2}; /* Needs HF scaling for ambisonic upsampling. */
-constexpr uint VoiceCallbackStopped{1u<<3};
-constexpr uint VoiceIsFading{ 1u<<4}; /* Use gain stepping for smooth transitions. */
-constexpr uint VoiceHasHrtf{ 1u<<5};
-constexpr uint VoiceHasNfc{ 1u<<6};
-
-struct Voice {
- enum State {
- Stopped,
- Playing,
- Stopping,
- Pending
- };
-
- std::atomic<VoicePropsItem*> mUpdate{nullptr};
-
- VoiceProps mProps;
-
- std::atomic<uint> mSourceID{0u};
- std::atomic<State> mPlayState{Stopped};
- std::atomic<bool> mPendingChange{false};
-
- /**
- * Source offset in samples, relative to the currently playing buffer, NOT
- * the whole queue.
- */
- std::atomic<uint> mPosition;
- /** Fractional (fixed-point) offset to the next sample. */
- std::atomic<uint> mPositionFrac;
-
- /* Current buffer queue item being played. */
- std::atomic<VoiceBufferItem*> mCurrentBuffer;
-
- /* Buffer queue item to loop to at end of queue (will be NULL for non-
- * looping voices).
- */
- std::atomic<VoiceBufferItem*> mLoopBuffer;
-
- /* Properties for the attached buffer(s). */
- FmtChannels mFmtChannels;
- FmtType mFmtType;
- uint mFrequency;
- uint mFrameSize;
- AmbiLayout mAmbiLayout;
- AmbiScaling mAmbiScaling;
- uint mAmbiOrder;
-
- std::unique_ptr<UhjDecoder> mDecoder;
-
- /** Current target parameters used for mixing. */
- uint mStep{0};
-
- ResamplerFunc mResampler;
-
- InterpState mResampleState;
-
- uint mFlags{};
- uint mNumCallbackSamples{0};
-
- struct TargetData {
- int FilterType;
- al::span<FloatBufferLine> Buffer;
- };
- TargetData mDirect;
- std::array<TargetData,MAX_SENDS> mSend;
-
- /* The first MaxResamplerPadding/2 elements are the sample history from the
- * previous mix, with an additional MaxResamplerPadding/2 elements that are
- * now current (which may be overwritten if the buffer data is still
- * available).
- */
- static constexpr size_t LineSize{BufferLineSize + MaxResamplerPadding +
- UhjDecoder::sFilterDelay};
- using BufferLine = std::array<float,LineSize>;
- al::vector<BufferLine,16> mVoiceSamples{2};
-
- struct ChannelData {
- float mAmbiScale;
- BandSplitter mAmbiSplitter;
-
- DirectParams mDryParams;
- std::array<SendParams,MAX_SENDS> mWetParams;
- };
- al::vector<ChannelData> mChans{2};
-
- Voice() = default;
- ~Voice() { delete mUpdate.exchange(nullptr, std::memory_order_acq_rel); }
-
- Voice(const Voice&) = delete;
- Voice& operator=(const Voice&) = delete;
-
- void mix(const State vstate, ContextBase *Context, const uint SamplesToDo);
-
- void prepare(DeviceBase *device);
-
- DEF_NEWDEL(Voice)
-};
-
-extern Resampler ResamplerDefault;
-
-void aluInitMixer(al::optional<std::string> resampler);
-
-#endif /* VOICE_H */