aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32')
-rw-r--r--OpenAL32/Include/alAuxEffectSlot.h2
-rw-r--r--OpenAL32/Include/alEffect.h2
-rw-r--r--OpenAL32/Include/alError.h2
-rw-r--r--OpenAL32/Include/alMain.h534
-rw-r--r--OpenAL32/Include/alSource.h2
-rw-r--r--OpenAL32/Include/alu.h466
-rw-r--r--OpenAL32/alAuxEffectSlot.cpp2
-rw-r--r--OpenAL32/alBuffer.cpp2
-rw-r--r--OpenAL32/alEffect.cpp2
-rw-r--r--OpenAL32/alError.cpp2
-rw-r--r--OpenAL32/alExtension.cpp2
-rw-r--r--OpenAL32/alFilter.cpp2
-rw-r--r--OpenAL32/alListener.cpp2
-rw-r--r--OpenAL32/alSource.cpp2
-rw-r--r--OpenAL32/alState.cpp2
-rw-r--r--OpenAL32/event.cpp2
16 files changed, 14 insertions, 1014 deletions
diff --git a/OpenAL32/Include/alAuxEffectSlot.h b/OpenAL32/Include/alAuxEffectSlot.h
index 9956c432..b6976d13 100644
--- a/OpenAL32/Include/alAuxEffectSlot.h
+++ b/OpenAL32/Include/alAuxEffectSlot.h
@@ -3,7 +3,7 @@
#include <array>
-#include "alMain.h"
+#include "alcmain.h"
#include "alEffect.h"
#include "ambidefs.h"
#include "effects/base.h"
diff --git a/OpenAL32/Include/alEffect.h b/OpenAL32/Include/alEffect.h
index d94317a4..d43aa206 100644
--- a/OpenAL32/Include/alEffect.h
+++ b/OpenAL32/Include/alEffect.h
@@ -1,7 +1,7 @@
#ifndef _AL_EFFECT_H_
#define _AL_EFFECT_H_
-#include "alMain.h"
+#include "alcmain.h"
#include "effects/base.h"
diff --git a/OpenAL32/Include/alError.h b/OpenAL32/Include/alError.h
index 7b64b302..0abd6b26 100644
--- a/OpenAL32/Include/alError.h
+++ b/OpenAL32/Include/alError.h
@@ -1,7 +1,7 @@
#ifndef _AL_ERROR_H_
#define _AL_ERROR_H_
-#include "alMain.h"
+#include "alcmain.h"
#include "logging.h"
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
deleted file mode 100644
index 85bc9cbc..00000000
--- a/OpenAL32/Include/alMain.h
+++ /dev/null
@@ -1,534 +0,0 @@
-#ifndef AL_MAIN_H
-#define AL_MAIN_H
-
-#include <algorithm>
-#include <array>
-#include <atomic>
-#include <chrono>
-#include <cstdint>
-#include <cstddef>
-#include <memory>
-#include <mutex>
-#include <string>
-#include <utility>
-
-#include "AL/al.h"
-#include "AL/alc.h"
-#include "AL/alext.h"
-
-#include "albyte.h"
-#include "almalloc.h"
-#include "alnumeric.h"
-#include "alspan.h"
-#include "ambidefs.h"
-#include "atomic.h"
-#include "hrtf.h"
-#include "inprogext.h"
-#include "vector.h"
-
-class BFormatDec;
-struct ALbuffer;
-struct ALeffect;
-struct ALfilter;
-struct BackendBase;
-struct Compressor;
-struct EffectState;
-struct FrontStablizer;
-struct Uhj2Encoder;
-struct bs2b;
-
-
-#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__)
-#define IS_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-#else
-static const union {
- ALuint u;
- ALubyte b[sizeof(ALuint)];
-} EndianTest = { 1 };
-#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1)
-#endif
-
-
-#define MIN_OUTPUT_RATE 8000
-#define DEFAULT_OUTPUT_RATE 44100
-#define DEFAULT_UPDATE_SIZE 882 /* 20ms */
-#define DEFAULT_NUM_UPDATES 3
-
-
-enum Channel {
- FrontLeft = 0,
- FrontRight,
- FrontCenter,
- LFE,
- BackLeft,
- BackRight,
- BackCenter,
- SideLeft,
- SideRight,
-
- UpperFrontLeft,
- UpperFrontRight,
- UpperBackLeft,
- UpperBackRight,
- LowerFrontLeft,
- LowerFrontRight,
- LowerBackLeft,
- LowerBackRight,
-
- Aux0,
- Aux1,
- Aux2,
- Aux3,
- Aux4,
- Aux5,
- Aux6,
- Aux7,
- Aux8,
- Aux9,
- Aux10,
- Aux11,
- Aux12,
- Aux13,
- Aux14,
- Aux15,
-
- MaxChannels
-};
-
-
-/* Device formats */
-enum DevFmtType : ALenum {
- DevFmtByte = ALC_BYTE_SOFT,
- DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT,
- DevFmtShort = ALC_SHORT_SOFT,
- DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT,
- DevFmtInt = ALC_INT_SOFT,
- DevFmtUInt = ALC_UNSIGNED_INT_SOFT,
- DevFmtFloat = ALC_FLOAT_SOFT,
-
- DevFmtTypeDefault = DevFmtFloat
-};
-enum DevFmtChannels : ALenum {
- DevFmtMono = ALC_MONO_SOFT,
- DevFmtStereo = ALC_STEREO_SOFT,
- DevFmtQuad = ALC_QUAD_SOFT,
- DevFmtX51 = ALC_5POINT1_SOFT,
- DevFmtX61 = ALC_6POINT1_SOFT,
- DevFmtX71 = ALC_7POINT1_SOFT,
- DevFmtAmbi3D = ALC_BFORMAT3D_SOFT,
-
- /* Similar to 5.1, except using rear channels instead of sides */
- DevFmtX51Rear = 0x70000000,
-
- DevFmtChannelsDefault = DevFmtStereo
-};
-#define MAX_OUTPUT_CHANNELS (16)
-
-/* DevFmtType traits, providing the type, etc given a DevFmtType. */
-template<DevFmtType T>
-struct DevFmtTypeTraits { };
-
-template<>
-struct DevFmtTypeTraits<DevFmtByte> { using Type = ALbyte; };
-template<>
-struct DevFmtTypeTraits<DevFmtUByte> { using Type = ALubyte; };
-template<>
-struct DevFmtTypeTraits<DevFmtShort> { using Type = ALshort; };
-template<>
-struct DevFmtTypeTraits<DevFmtUShort> { using Type = ALushort; };
-template<>
-struct DevFmtTypeTraits<DevFmtInt> { using Type = ALint; };
-template<>
-struct DevFmtTypeTraits<DevFmtUInt> { using Type = ALuint; };
-template<>
-struct DevFmtTypeTraits<DevFmtFloat> { using Type = ALfloat; };
-
-
-ALsizei BytesFromDevFmt(DevFmtType type) noexcept;
-ALsizei ChannelsFromDevFmt(DevFmtChannels chans, ALsizei ambiorder) noexcept;
-inline ALsizei FrameSizeFromDevFmt(DevFmtChannels chans, DevFmtType type, ALsizei ambiorder) noexcept
-{ return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); }
-
-enum class AmbiLayout {
- FuMa = ALC_FUMA_SOFT, /* FuMa channel order */
- ACN = ALC_ACN_SOFT, /* ACN channel order */
-
- Default = ACN
-};
-
-enum class AmbiNorm {
- FuMa = ALC_FUMA_SOFT, /* FuMa normalization */
- SN3D = ALC_SN3D_SOFT, /* SN3D normalization */
- N3D = ALC_N3D_SOFT, /* N3D normalization */
-
- Default = SN3D
-};
-
-
-enum DeviceType {
- Playback,
- Capture,
- Loopback
-};
-
-
-enum RenderMode {
- NormalRender,
- StereoPair,
- HrtfRender
-};
-
-
-struct BufferSubList {
- uint64_t FreeMask{~0_u64};
- ALbuffer *Buffers{nullptr}; /* 64 */
-
- BufferSubList() noexcept = default;
- BufferSubList(const BufferSubList&) = delete;
- BufferSubList(BufferSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Buffers{rhs.Buffers}
- { rhs.FreeMask = ~0_u64; rhs.Buffers = nullptr; }
- ~BufferSubList();
-
- BufferSubList& operator=(const BufferSubList&) = delete;
- BufferSubList& operator=(BufferSubList&& rhs) noexcept
- { std::swap(FreeMask, rhs.FreeMask); std::swap(Buffers, rhs.Buffers); return *this; }
-};
-
-struct EffectSubList {
- uint64_t FreeMask{~0_u64};
- ALeffect *Effects{nullptr}; /* 64 */
-
- EffectSubList() noexcept = default;
- EffectSubList(const EffectSubList&) = delete;
- EffectSubList(EffectSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Effects{rhs.Effects}
- { rhs.FreeMask = ~0_u64; rhs.Effects = nullptr; }
- ~EffectSubList();
-
- EffectSubList& operator=(const EffectSubList&) = delete;
- EffectSubList& operator=(EffectSubList&& rhs) noexcept
- { std::swap(FreeMask, rhs.FreeMask); std::swap(Effects, rhs.Effects); return *this; }
-};
-
-struct FilterSubList {
- uint64_t FreeMask{~0_u64};
- ALfilter *Filters{nullptr}; /* 64 */
-
- FilterSubList() noexcept = default;
- FilterSubList(const FilterSubList&) = delete;
- FilterSubList(FilterSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Filters{rhs.Filters}
- { rhs.FreeMask = ~0_u64; rhs.Filters = nullptr; }
- ~FilterSubList();
-
- FilterSubList& operator=(const FilterSubList&) = delete;
- FilterSubList& operator=(FilterSubList&& rhs) noexcept
- { std::swap(FreeMask, rhs.FreeMask); std::swap(Filters, rhs.Filters); return *this; }
-};
-
-
-/* Maximum delay in samples for speaker distance compensation. */
-#define MAX_DELAY_LENGTH 1024
-
-class DistanceComp {
-public:
- struct DistData {
- ALfloat Gain{1.0f};
- ALsizei Length{0}; /* Valid range is [0...MAX_DELAY_LENGTH). */
- ALfloat *Buffer{nullptr};
- };
-
-private:
- std::array<DistData,MAX_OUTPUT_CHANNELS> mChannels;
- al::vector<ALfloat,16> mSamples;
-
-public:
- void setSampleCount(size_t new_size) { mSamples.resize(new_size); }
- void clear() noexcept
- {
- for(auto &chan : mChannels)
- {
- chan.Gain = 1.0f;
- chan.Length = 0;
- chan.Buffer = nullptr;
- }
- using SampleVecT = decltype(mSamples);
- SampleVecT{}.swap(mSamples);
- }
-
- ALfloat *getSamples() noexcept { return mSamples.data(); }
-
- al::span<DistData,MAX_OUTPUT_CHANNELS> as_span() { return mChannels; }
-};
-
-struct BFChannelConfig {
- ALfloat Scale;
- ALsizei Index;
-};
-
-/* Size for temporary storage of buffer data, in ALfloats. Larger values need
- * more memory, while smaller values may need more iterations. The value needs
- * to be a sensible size, however, as it constrains the max stepping value used
- * for mixing, as well as the maximum number of samples per mixing iteration.
- */
-#define BUFFERSIZE 1024
-
-using FloatBufferLine = std::array<float,BUFFERSIZE>;
-
-/* Maximum number of samples to pad on either end of a buffer for resampling.
- * Note that both the beginning and end need padding!
- */
-#define MAX_RESAMPLE_PADDING 24
-
-
-struct MixParams {
- /* Coefficient channel mapping for mixing to the buffer. */
- std::array<BFChannelConfig,MAX_OUTPUT_CHANNELS> AmbiMap{};
-
- al::span<FloatBufferLine> Buffer;
-};
-
-struct RealMixParams {
- std::array<ALint,MaxChannels> ChannelIndex{};
-
- al::span<FloatBufferLine> Buffer;
-};
-
-using POSTPROCESS = void(*)(ALCdevice *device, const ALsizei SamplesToDo);
-
-enum {
- // Frequency was requested by the app or config file
- FrequencyRequest,
- // Channel configuration was requested by the config file
- ChannelsRequest,
- // Sample type was requested by the config file
- SampleTypeRequest,
-
- // Specifies if the DSP is paused at user request
- DevicePaused,
- // Specifies if the device is currently running
- DeviceRunning,
-
- DeviceFlagsCount
-};
-
-struct ALCdevice {
- RefCount ref{1u};
-
- std::atomic<bool> Connected{true};
- const DeviceType Type{};
-
- ALuint Frequency{};
- ALuint UpdateSize{};
- ALuint BufferSize{};
-
- DevFmtChannels FmtChans{};
- DevFmtType FmtType{};
- ALboolean IsHeadphones{AL_FALSE};
- ALsizei mAmbiOrder{0};
- /* For DevFmtAmbi* output only, specifies the channel order and
- * normalization.
- */
- AmbiLayout mAmbiLayout{AmbiLayout::Default};
- AmbiNorm mAmbiScale{AmbiNorm::Default};
-
- ALCenum LimiterState{ALC_DONT_CARE_SOFT};
-
- std::string DeviceName;
-
- // Device flags
- al::bitfield<DeviceFlagsCount> Flags{};
-
- std::string HrtfName;
- al::vector<EnumeratedHrtf> HrtfList;
- ALCenum HrtfStatus{ALC_FALSE};
-
- std::atomic<ALCenum> LastError{ALC_NO_ERROR};
-
- // Maximum number of sources that can be created
- ALuint SourcesMax{};
- // Maximum number of slots that can be created
- ALuint AuxiliaryEffectSlotMax{};
-
- ALCuint NumMonoSources{};
- ALCuint NumStereoSources{};
- ALsizei NumAuxSends{};
-
- // Map of Buffers for this device
- std::mutex BufferLock;
- al::vector<BufferSubList> BufferList;
-
- // Map of Effects for this device
- std::mutex EffectLock;
- al::vector<EffectSubList> EffectList;
-
- // Map of Filters for this device
- std::mutex FilterLock;
- al::vector<FilterSubList> FilterList;
-
- /* Rendering mode. */
- RenderMode mRenderMode{NormalRender};
-
- /* The average speaker distance as determined by the ambdec configuration,
- * HRTF data set, or the NFC-HOA reference delay. Only used for NFC.
- */
- ALfloat AvgSpeakerDist{0.0f};
-
- ALuint SamplesDone{0u};
- std::chrono::nanoseconds ClockBase{0};
- std::chrono::nanoseconds FixedLatency{0};
-
- /* Temp storage used for mixer processing. */
- alignas(16) ALfloat SourceData[BUFFERSIZE + MAX_RESAMPLE_PADDING*2];
- alignas(16) ALfloat ResampledData[BUFFERSIZE];
- alignas(16) ALfloat FilteredData[BUFFERSIZE];
- union {
- alignas(16) ALfloat HrtfSourceData[BUFFERSIZE + HRTF_HISTORY_LENGTH];
- alignas(16) ALfloat NfcSampleData[BUFFERSIZE];
- };
- alignas(16) float2 HrtfAccumData[BUFFERSIZE + HRIR_LENGTH];
-
- /* Mixing buffer used by the Dry mix and Real output. */
- al::vector<FloatBufferLine, 16> MixBuffer;
-
- /* The "dry" path corresponds to the main output. */
- MixParams Dry;
- ALuint NumChannelsPerOrder[MAX_AMBI_ORDER+1]{};
-
- /* "Real" output, which will be written to the device buffer. May alias the
- * dry buffer.
- */
- RealMixParams RealOut;
-
- /* HRTF state and info */
- std::unique_ptr<DirectHrtfState> mHrtfState;
- HrtfEntry *mHrtf{nullptr};
-
- /* Ambisonic-to-UHJ encoder */
- std::unique_ptr<Uhj2Encoder> Uhj_Encoder;
-
- /* Ambisonic decoder for speakers */
- std::unique_ptr<BFormatDec> AmbiDecoder;
-
- /* Stereo-to-binaural filter */
- std::unique_ptr<bs2b> Bs2b;
-
- POSTPROCESS PostProcess{};
-
- std::unique_ptr<FrontStablizer> Stablizer;
-
- std::unique_ptr<Compressor> Limiter;
-
- /* Delay buffers used to compensate for speaker distances. */
- DistanceComp ChannelDelay;
-
- /* Dithering control. */
- ALfloat DitherDepth{0.0f};
- ALuint DitherSeed{0u};
-
- /* Running count of the mixer invocations, in 31.1 fixed point. This
- * actually increments *twice* when mixing, first at the start and then at
- * the end, so the bottom bit indicates if the device is currently mixing
- * and the upper bits indicates how many mixes have been done.
- */
- RefCount MixCount{0u};
-
- // Contexts created on this device
- std::atomic<al::FlexArray<ALCcontext*>*> mContexts{nullptr};
-
- /* This lock protects the device state (format, update size, etc) from
- * being from being changed in multiple threads, or being accessed while
- * being changed. It's also used to serialize calls to the backend.
- */
- std::mutex StateLock;
- std::unique_ptr<BackendBase> Backend;
-
-
- ALCdevice(DeviceType type);
- ALCdevice(const ALCdevice&) = delete;
- ALCdevice& operator=(const ALCdevice&) = delete;
- ~ALCdevice();
-
- ALsizei bytesFromFmt() const noexcept { return BytesFromDevFmt(FmtType); }
- ALsizei channelsFromFmt() const noexcept { return ChannelsFromDevFmt(FmtChans, mAmbiOrder); }
- ALsizei frameSizeFromFmt() const noexcept { return bytesFromFmt() * channelsFromFmt(); }
-
- DEF_NEWDEL(ALCdevice)
-};
-
-/* Must be less than 15 characters (16 including terminating null) for
- * compatibility with pthread_setname_np limitations. */
-#define MIXER_THREAD_NAME "alsoft-mixer"
-
-#define RECORD_THREAD_NAME "alsoft-record"
-
-
-enum {
- /* End event thread processing. */
- EventType_KillThread = 0,
-
- /* User event types. */
- EventType_SourceStateChange = 1<<0,
- EventType_BufferCompleted = 1<<1,
- EventType_Error = 1<<2,
- EventType_Performance = 1<<3,
- EventType_Deprecated = 1<<4,
- EventType_Disconnected = 1<<5,
-
- /* Internal events. */
- EventType_ReleaseEffectState = 65536,
-};
-
-struct AsyncEvent {
- unsigned int EnumType{0u};
- union {
- char dummy;
- struct {
- ALuint id;
- ALenum state;
- } srcstate;
- struct {
- ALuint id;
- ALsizei count;
- } bufcomp;
- struct {
- ALenum type;
- ALuint id;
- ALuint param;
- ALchar msg[1008];
- } user;
- EffectState *mEffectState;
- } u{};
-
- AsyncEvent() noexcept = default;
- constexpr AsyncEvent(unsigned int type) noexcept : EnumType{type} { }
-};
-
-
-void AllocateVoices(ALCcontext *context, size_t num_voices);
-
-
-extern ALint RTPrioLevel;
-void SetRTPriority(void);
-
-void SetDefaultChannelOrder(ALCdevice *device);
-void SetDefaultWFXChannelOrder(ALCdevice *device);
-
-const ALCchar *DevFmtTypeString(DevFmtType type) noexcept;
-const ALCchar *DevFmtChannelsString(DevFmtChannels chans) noexcept;
-
-/**
- * GetChannelIdxByName
- *
- * Returns the index for the given channel name (e.g. FrontCenter), or -1 if it
- * doesn't exist.
- */
-inline ALint GetChannelIdxByName(const RealMixParams &real, Channel chan) noexcept
-{ return real.ChannelIndex[chan]; }
-
-
-void StartEventThrd(ALCcontext *ctx);
-void StopEventThrd(ALCcontext *ctx);
-
-
-al::vector<std::string> SearchDataFiles(const char *match, const char *subdir);
-
-#endif
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index 0343a943..330bb9f4 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -3,7 +3,7 @@
#include <array>
-#include "alMain.h"
+#include "alcmain.h"
#include "alu.h"
#include "hrtf.h"
#include "almalloc.h"
diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h
deleted file mode 100644
index 841e5c03..00000000
--- a/OpenAL32/Include/alu.h
+++ /dev/null
@@ -1,466 +0,0 @@
-#ifndef _ALU_H_
-#define _ALU_H_
-
-#include <array>
-#include <atomic>
-#include <cmath>
-#include <cstddef>
-
-#include "AL/al.h"
-#include "AL/alc.h"
-#include "AL/alext.h"
-
-#include "alBuffer.h"
-#include "alMain.h"
-#include "almalloc.h"
-#include "alspan.h"
-#include "ambidefs.h"
-#include "filters/biquad.h"
-#include "filters/nfc.h"
-#include "filters/splitter.h"
-#include "hrtf.h"
-#include "logging.h"
-
-struct ALbufferlistitem;
-struct ALeffectslot;
-struct BSincTable;
-
-
-enum class DistanceModel;
-
-#define MAX_PITCH 255
-#define MAX_SENDS 16
-
-
-#define DITHER_RNG_SEED 22222
-
-
-enum SpatializeMode {
- SpatializeOff = AL_FALSE,
- SpatializeOn = AL_TRUE,
- SpatializeAuto = AL_AUTO_SOFT
-};
-
-enum Resampler {
- PointResampler,
- LinearResampler,
- FIR4Resampler,
- BSinc12Resampler,
- BSinc24Resampler,
-
- ResamplerMax = BSinc24Resampler
-};
-extern Resampler ResamplerDefault;
-
-/* The number of distinct scale and phase intervals within the bsinc filter
- * table.
- */
-#define BSINC_SCALE_BITS 4
-#define BSINC_SCALE_COUNT (1<<BSINC_SCALE_BITS)
-#define BSINC_PHASE_BITS 4
-#define BSINC_PHASE_COUNT (1<<BSINC_PHASE_BITS)
-
-/* Interpolator state. Kind of a misnomer since the interpolator itself is
- * stateless. This just keeps it from having to recompute scale-related
- * mappings for every sample.
- */
-struct BsincState {
- ALfloat sf; /* Scale interpolation factor. */
- ALsizei m; /* Coefficient count. */
- ALsizei l; /* Left coefficient offset. */
- /* Filter coefficients, followed by the scale, phase, and scale-phase
- * delta coefficients. Starting at phase index 0, each subsequent phase
- * index follows contiguously.
- */
- const ALfloat *filter;
-};
-
-union InterpState {
- BsincState bsinc;
-};
-
-using ResamplerFunc = const ALfloat*(*)(const InterpState *state,
- const ALfloat *RESTRICT src, ALsizei frac, ALint increment,
- ALfloat *RESTRICT dst, ALsizei dstlen);
-
-void BsincPrepare(const ALuint increment, BsincState *state, const BSincTable *table);
-
-extern const BSincTable bsinc12;
-extern const BSincTable bsinc24;
-
-
-enum {
- AF_None = 0,
- AF_LowPass = 1,
- AF_HighPass = 2,
- AF_BandPass = AF_LowPass | AF_HighPass
-};
-
-
-struct MixHrtfFilter {
- const HrirArray<ALfloat> *Coeffs;
- ALsizei Delay[2];
- ALfloat Gain;
- ALfloat GainStep;
-};
-
-
-struct DirectParams {
- BiquadFilter LowPass;
- BiquadFilter HighPass;
-
- NfcFilter NFCtrlFilter;
-
- struct {
- HrtfFilter Old;
- HrtfFilter Target;
- HrtfState State;
- } Hrtf;
-
- struct {
- ALfloat Current[MAX_OUTPUT_CHANNELS];
- ALfloat Target[MAX_OUTPUT_CHANNELS];
- } Gains;
-};
-
-struct SendParams {
- BiquadFilter LowPass;
- BiquadFilter HighPass;
-
- struct {
- ALfloat Current[MAX_OUTPUT_CHANNELS];
- ALfloat Target[MAX_OUTPUT_CHANNELS];
- } Gains;
-};
-
-
-struct ALvoicePropsBase {
- ALfloat Pitch;
- ALfloat Gain;
- ALfloat OuterGain;
- ALfloat MinGain;
- ALfloat MaxGain;
- ALfloat InnerAngle;
- ALfloat OuterAngle;
- ALfloat RefDistance;
- ALfloat MaxDistance;
- ALfloat RolloffFactor;
- std::array<ALfloat,3> Position;
- std::array<ALfloat,3> Velocity;
- std::array<ALfloat,3> Direction;
- std::array<ALfloat,3> OrientAt;
- std::array<ALfloat,3> OrientUp;
- ALboolean HeadRelative;
- DistanceModel mDistanceModel;
- Resampler mResampler;
- ALboolean DirectChannels;
- SpatializeMode mSpatializeMode;
-
- ALboolean DryGainHFAuto;
- ALboolean WetGainAuto;
- ALboolean WetGainHFAuto;
- ALfloat OuterGainHF;
-
- ALfloat AirAbsorptionFactor;
- ALfloat RoomRolloffFactor;
- ALfloat DopplerFactor;
-
- std::array<ALfloat,2> StereoPan;
-
- ALfloat Radius;
-
- /** Direct filter and auxiliary send info. */
- struct {
- ALfloat Gain;
- ALfloat GainHF;
- ALfloat HFReference;
- ALfloat GainLF;
- ALfloat LFReference;
- } Direct;
- struct SendData {
- ALeffectslot *Slot;
- ALfloat Gain;
- ALfloat GainHF;
- ALfloat HFReference;
- ALfloat GainLF;
- ALfloat LFReference;
- } Send[MAX_SENDS];
-};
-
-struct ALvoiceProps : public ALvoicePropsBase {
- std::atomic<ALvoiceProps*> next{nullptr};
-
- DEF_NEWDEL(ALvoiceProps)
-};
-
-#define VOICE_IS_STATIC (1u<<0)
-#define VOICE_IS_FADING (1u<<1) /* Fading sources use gain stepping for smooth transitions. */
-#define VOICE_IS_AMBISONIC (1u<<2) /* Voice needs HF scaling for ambisonic upsampling. */
-#define VOICE_HAS_HRTF (1u<<3)
-#define VOICE_HAS_NFC (1u<<4)
-
-struct ALvoice {
- enum State {
- Stopped = 0,
- Playing = 1,
- Stopping = 2
- };
-
- std::atomic<ALvoiceProps*> mUpdate{nullptr};
-
- std::atomic<ALuint> mSourceID{0u};
- std::atomic<State> mPlayState{Stopped};
-
- ALvoicePropsBase mProps;
-
- /**
- * Source offset in samples, relative to the currently playing buffer, NOT
- * the whole queue.
- */
- std::atomic<ALuint> mPosition;
- /** Fractional (fixed-point) offset to the next sample. */
- std::atomic<ALsizei> mPositionFrac;
-
- /* Current buffer queue item being played. */
- std::atomic<ALbufferlistitem*> mCurrentBuffer;
-
- /* Buffer queue item to loop to at end of queue (will be NULL for non-
- * looping voices).
- */
- std::atomic<ALbufferlistitem*> mLoopBuffer;
-
- /* Properties for the attached buffer(s). */
- FmtChannels mFmtChannels;
- ALuint mFrequency;
- ALsizei mNumChannels;
- ALsizei mSampleSize;
-
- /** Current target parameters used for mixing. */
- ALint mStep;
-
- ResamplerFunc mResampler;
-
- InterpState mResampleState;
-
- ALuint mFlags;
-
- struct DirectData {
- int FilterType;
- al::span<FloatBufferLine> Buffer;
- };
- DirectData mDirect;
-
- struct SendData {
- int FilterType;
- al::span<FloatBufferLine> Buffer;
- };
- std::array<SendData,MAX_SENDS> mSend;
-
- struct ChannelData {
- alignas(16) std::array<ALfloat,MAX_RESAMPLE_PADDING*2> mPrevSamples;
-
- ALfloat mAmbiScale;
- BandSplitter mAmbiSplitter;
-
- DirectParams mDryParams;
- std::array<SendParams,MAX_SENDS> mWetParams;
- };
- std::array<ChannelData,MAX_INPUT_CHANNELS> mChans;
-
- ALvoice() = default;
- ALvoice(const ALvoice&) = delete;
- ~ALvoice() { delete mUpdate.exchange(nullptr, std::memory_order_acq_rel); }
- ALvoice& operator=(const ALvoice&) = delete;
- ALvoice& operator=(ALvoice&& rhs) noexcept
- {
- ALvoiceProps *old_update{mUpdate.load(std::memory_order_relaxed)};
- mUpdate.store(rhs.mUpdate.exchange(old_update, std::memory_order_relaxed),
- std::memory_order_relaxed);
-
- mSourceID.store(rhs.mSourceID.load(std::memory_order_relaxed), std::memory_order_relaxed);
- mPlayState.store(rhs.mPlayState.load(std::memory_order_relaxed),
- std::memory_order_relaxed);
-
- mProps = rhs.mProps;
-
- mPosition.store(rhs.mPosition.load(std::memory_order_relaxed), std::memory_order_relaxed);
- mPositionFrac.store(rhs.mPositionFrac.load(std::memory_order_relaxed),
- std::memory_order_relaxed);
-
- mCurrentBuffer.store(rhs.mCurrentBuffer.load(std::memory_order_relaxed),
- std::memory_order_relaxed);
- mLoopBuffer.store(rhs.mLoopBuffer.load(std::memory_order_relaxed),
- std::memory_order_relaxed);
-
- mFmtChannels = rhs.mFmtChannels;
- mFrequency = rhs.mFrequency;
- mNumChannels = rhs.mNumChannels;
- mSampleSize = rhs.mSampleSize;
-
- mStep = rhs.mStep;
- mResampler = rhs.mResampler;
-
- mResampleState = rhs.mResampleState;
-
- mFlags = rhs.mFlags;
-
- mDirect = rhs.mDirect;
- mSend = rhs.mSend;
- mChans = rhs.mChans;
-
- return *this;
- }
-};
-
-
-using MixerFunc = void(*)(const ALfloat *data, const al::span<FloatBufferLine> OutBuffer,
- ALfloat *CurrentGains, const ALfloat *TargetGains, const ALsizei Counter, const ALsizei OutPos,
- const ALsizei BufferSize);
-using RowMixerFunc = void(*)(FloatBufferLine &OutBuffer, const ALfloat *gains,
- const al::span<const FloatBufferLine> InSamples, const ALsizei InPos,
- const ALsizei BufferSize);
-using HrtfMixerFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut,
- const ALfloat *InSamples, float2 *AccumSamples, const ALsizei OutPos, const ALsizei IrSize,
- MixHrtfFilter *hrtfparams, const ALsizei BufferSize);
-using HrtfMixerBlendFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut,
- const ALfloat *InSamples, float2 *AccumSamples, const ALsizei OutPos, const ALsizei IrSize,
- const HrtfFilter *oldparams, MixHrtfFilter *newparams, const ALsizei BufferSize);
-using HrtfDirectMixerFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut,
- const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State,
- const ALsizei BufferSize);
-
-
-#define GAIN_MIX_MAX (1000.0f) /* +60dB */
-
-#define GAIN_SILENCE_THRESHOLD (0.00001f) /* -100dB */
-
-#define SPEEDOFSOUNDMETRESPERSEC (343.3f)
-#define AIRABSORBGAINHF (0.99426f) /* -0.05dB */
-
-/* Target gain for the reverb decay feedback reaching the decay time. */
-#define REVERB_DECAY_GAIN (0.001f) /* -60 dB */
-
-#define FRACTIONBITS (12)
-#define FRACTIONONE (1<<FRACTIONBITS)
-#define FRACTIONMASK (FRACTIONONE-1)
-
-
-inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) noexcept
-{ return val1 + (val2-val1)*mu; }
-inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu) noexcept
-{
- ALfloat mu2 = mu*mu, mu3 = mu2*mu;
- ALfloat a0 = -0.5f*mu3 + mu2 + -0.5f*mu;
- ALfloat a1 = 1.5f*mu3 + -2.5f*mu2 + 1.0f;
- ALfloat a2 = -1.5f*mu3 + 2.0f*mu2 + 0.5f*mu;
- ALfloat a3 = 0.5f*mu3 + -0.5f*mu2;
- return val1*a0 + val2*a1 + val3*a2 + val4*a3;
-}
-
-
-enum HrtfRequestMode {
- Hrtf_Default = 0,
- Hrtf_Enable = 1,
- Hrtf_Disable = 2,
-};
-
-void aluInit(void);
-
-void aluInitMixer(void);
-
-ResamplerFunc SelectResampler(Resampler resampler);
-
-/* aluInitRenderer
- *
- * Set up the appropriate panning method and mixing method given the device
- * properties.
- */
-void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq);
-
-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
- * spread is the angular width of the sound (0...tau).
- *
- * NOTE: The components use ambisonic coordinates. As a result:
- *
- * Ambisonic Y = OpenAL -X
- * Ambisonic Z = OpenAL Y
- * Ambisonic X = OpenAL -Z
- *
- * The components are ordered such that OpenAL's X, Y, and Z are the first,
- * second, and third parameters respectively -- simply negate X and Z.
- */
-void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALfloat spread,
- ALfloat (&coeffs)[MAX_AMBI_CHANNELS]);
-
-/**
- * CalcDirectionCoeffs
- *
- * Calculates ambisonic coefficients based on an OpenAL direction vector. The
- * vector must be normalized (unit length), and the spread is the angular width
- * of the sound (0...tau).
- */
-inline void CalcDirectionCoeffs(const ALfloat (&dir)[3], ALfloat spread, ALfloat (&coeffs)[MAX_AMBI_CHANNELS])
-{
- /* Convert from OpenAL coords to Ambisonics. */
- CalcAmbiCoeffs(-dir[0], dir[1], -dir[2], spread, coeffs);
-}
-
-/**
- * CalcAngleCoeffs
- *
- * Calculates ambisonic coefficients based on azimuth and elevation. The
- * azimuth and elevation parameters are in radians, going right and up
- * respectively.
- */
-inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat (&coeffs)[MAX_AMBI_CHANNELS])
-{
- ALfloat x = -std::sin(azimuth) * std::cos(elevation);
- ALfloat y = std::sin(elevation);
- ALfloat z = std::cos(azimuth) * std::cos(elevation);
-
- CalcAmbiCoeffs(x, y, z, spread, coeffs);
-}
-
-
-/**
- * ComputePanGains
- *
- * Computes panning gains using the given channel decoder coefficients and the
- * pre-calculated direction or angle coefficients. For B-Format sources, the
- * coeffs are a 'slice' of a transform matrix for the input channel, used to
- * scale and orient the sound samples.
- */
-void ComputePanGains(const MixParams *mix, const ALfloat*RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS]);
-
-
-inline std::array<ALfloat,MAX_AMBI_CHANNELS> GetAmbiIdentityRow(size_t i) noexcept
-{
- std::array<ALfloat,MAX_AMBI_CHANNELS> ret{};
- ret[i] = 1.0f;
- return ret;
-}
-
-
-void MixVoice(ALvoice *voice, ALvoice::State vstate, const ALuint SourceID, ALCcontext *Context, const ALsizei SamplesToDo);
-
-void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples);
-/* Caller must lock the device state, and the mixer must not be running. */
-void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) DECL_FORMAT(printf, 2, 3);
-
-extern MixerFunc MixSamples;
-extern RowMixerFunc MixRowSamples;
-
-extern const ALfloat ConeScale;
-extern const ALfloat ZScale;
-extern const ALboolean OverrideReverbSpeedOfSound;
-
-#endif
diff --git a/OpenAL32/alAuxEffectSlot.cpp b/OpenAL32/alAuxEffectSlot.cpp
index 55fbc622..cc2893c3 100644
--- a/OpenAL32/alAuxEffectSlot.cpp
+++ b/OpenAL32/alAuxEffectSlot.cpp
@@ -29,7 +29,7 @@
#include "AL/al.h"
#include "AL/alc.h"
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alAuxEffectSlot.h"
#include "alError.h"
diff --git a/OpenAL32/alBuffer.cpp b/OpenAL32/alBuffer.cpp
index c9a9d9f6..597f98cb 100644
--- a/OpenAL32/alBuffer.cpp
+++ b/OpenAL32/alBuffer.cpp
@@ -40,8 +40,8 @@
#include "AL/alc.h"
#include "AL/alext.h"
+#include "alcmain.h"
#include "alError.h"
-#include "alMain.h"
#include "albyte.h"
#include "alcontext.h"
#include "alexcpt.h"
diff --git a/OpenAL32/alEffect.cpp b/OpenAL32/alEffect.cpp
index 2de61019..14353d1c 100644
--- a/OpenAL32/alEffect.cpp
+++ b/OpenAL32/alEffect.cpp
@@ -37,8 +37,8 @@
#include "AL/efx-presets.h"
#include "AL/efx.h"
+#include "alcmain.h"
#include "alError.h"
-#include "alMain.h"
#include "alcontext.h"
#include "alexcpt.h"
#include "almalloc.h"
diff --git a/OpenAL32/alError.cpp b/OpenAL32/alError.cpp
index 5f98ae1d..782e10ec 100644
--- a/OpenAL32/alError.cpp
+++ b/OpenAL32/alError.cpp
@@ -37,7 +37,7 @@
#include "AL/al.h"
#include "AL/alc.h"
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alexcpt.h"
#include "almalloc.h"
diff --git a/OpenAL32/alExtension.cpp b/OpenAL32/alExtension.cpp
index dda2a628..5abcf1cf 100644
--- a/OpenAL32/alExtension.cpp
+++ b/OpenAL32/alExtension.cpp
@@ -27,7 +27,7 @@
#include "AL/al.h"
#include "AL/alc.h"
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alError.h"
#include "alexcpt.h"
diff --git a/OpenAL32/alFilter.cpp b/OpenAL32/alFilter.cpp
index 209ddc87..cac12581 100644
--- a/OpenAL32/alFilter.cpp
+++ b/OpenAL32/alFilter.cpp
@@ -24,7 +24,7 @@
#include <algorithm>
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alu.h"
#include "alFilter.h"
diff --git a/OpenAL32/alListener.cpp b/OpenAL32/alListener.cpp
index 419e38ad..067c0f55 100644
--- a/OpenAL32/alListener.cpp
+++ b/OpenAL32/alListener.cpp
@@ -22,7 +22,7 @@
#include <cmath>
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alu.h"
#include "alError.h"
diff --git a/OpenAL32/alSource.cpp b/OpenAL32/alSource.cpp
index 22c9e2d2..b080f874 100644
--- a/OpenAL32/alSource.cpp
+++ b/OpenAL32/alSource.cpp
@@ -51,7 +51,7 @@
#include "alBuffer.h"
#include "alError.h"
#include "alFilter.h"
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alexcpt.h"
#include "almalloc.h"
diff --git a/OpenAL32/alState.cpp b/OpenAL32/alState.cpp
index f2c38bb2..ee8d3a1c 100644
--- a/OpenAL32/alState.cpp
+++ b/OpenAL32/alState.cpp
@@ -33,7 +33,7 @@
#include "AL/alext.h"
#include "alError.h"
-#include "alMain.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alexcpt.h"
#include "almalloc.h"
diff --git a/OpenAL32/event.cpp b/OpenAL32/event.cpp
index dfffea9f..d50cef2e 100644
--- a/OpenAL32/event.cpp
+++ b/OpenAL32/event.cpp
@@ -15,8 +15,8 @@
#include "AL/alc.h"
#include "alError.h"
-#include "alMain.h"
#include "albyte.h"
+#include "alcmain.h"
#include "alcontext.h"
#include "alexcpt.h"
#include "almalloc.h"