From 93e60919c8f387c36c267ca9faa1ac653254aea6 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 28 Jul 2019 18:33:29 -0700 Subject: Rename alMain.h to alcmain.h And move it and alu.h to Alc/. --- Alc/alc.cpp | 2 +- Alc/alcmain.h | 534 +++++++++++++++++++++++++++++++++++++ Alc/alconfig.cpp | 5 +- Alc/alu.cpp | 2 +- Alc/alu.h | 466 ++++++++++++++++++++++++++++++++ Alc/backends/alsa.cpp | 2 +- Alc/backends/base.cpp | 2 +- Alc/backends/base.h | 2 +- Alc/backends/coreaudio.cpp | 2 +- Alc/backends/dsound.cpp | 2 +- Alc/backends/jack.cpp | 2 +- Alc/backends/loopback.cpp | 2 +- Alc/backends/null.cpp | 2 +- Alc/backends/opensl.cpp | 2 +- Alc/backends/oss.cpp | 2 +- Alc/backends/portaudio.cpp | 2 +- Alc/backends/pulseaudio.cpp | 2 +- Alc/backends/qsa.cpp | 2 +- Alc/backends/sdl2.cpp | 2 +- Alc/backends/sndio.cpp | 2 +- Alc/backends/solaris.cpp | 2 +- Alc/backends/wasapi.cpp | 2 +- Alc/backends/wave.cpp | 2 +- Alc/backends/winmm.cpp | 2 +- Alc/bformatdec.h | 2 +- Alc/converter.h | 2 +- Alc/effects/autowah.cpp | 2 +- Alc/effects/base.h | 3 +- Alc/effects/chorus.cpp | 2 +- Alc/effects/compressor.cpp | 2 +- Alc/effects/dedicated.cpp | 2 +- Alc/effects/distortion.cpp | 2 +- Alc/effects/echo.cpp | 2 +- Alc/effects/equalizer.cpp | 2 +- Alc/effects/fshifter.cpp | 2 +- Alc/effects/modulator.cpp | 2 +- Alc/effects/null.cpp | 2 +- Alc/effects/pshifter.cpp | 2 +- Alc/effects/reverb.cpp | 2 +- Alc/effects/vmorpher.cpp | 2 +- Alc/filters/nfc.cpp | 2 +- Alc/filters/splitter.h | 2 +- Alc/helpers.cpp | 2 +- Alc/hrtf.cpp | 2 +- Alc/mastering.h | 2 +- Alc/mixer/defs.h | 4 +- Alc/mixer/mixer_c.cpp | 2 +- Alc/mixer/mixer_neon.cpp | 2 +- Alc/mixer/mixer_sse.cpp | 2 +- Alc/mixvoice.cpp | 2 +- Alc/panning.cpp | 2 +- Alc/uhjfilter.h | 2 +- CMakeLists.txt | 5 +- OpenAL32/Include/alAuxEffectSlot.h | 2 +- OpenAL32/Include/alEffect.h | 2 +- OpenAL32/Include/alError.h | 2 +- OpenAL32/Include/alMain.h | 534 ------------------------------------- OpenAL32/Include/alSource.h | 2 +- OpenAL32/Include/alu.h | 466 -------------------------------- OpenAL32/alAuxEffectSlot.cpp | 2 +- OpenAL32/alBuffer.cpp | 2 +- OpenAL32/alEffect.cpp | 2 +- OpenAL32/alError.cpp | 2 +- OpenAL32/alExtension.cpp | 2 +- OpenAL32/alFilter.cpp | 2 +- OpenAL32/alListener.cpp | 2 +- OpenAL32/alSource.cpp | 2 +- OpenAL32/alState.cpp | 2 +- OpenAL32/event.cpp | 2 +- 69 files changed, 1069 insertions(+), 1070 deletions(-) create mode 100644 Alc/alcmain.h create mode 100644 Alc/alu.h delete mode 100644 OpenAL32/Include/alMain.h delete mode 100644 OpenAL32/Include/alu.h diff --git a/Alc/alc.cpp b/Alc/alc.cpp index 0bc099b4..00f90d91 100644 --- a/Alc/alc.cpp +++ b/Alc/alc.cpp @@ -52,11 +52,11 @@ #include "AL/efx.h" #include "alAuxEffectSlot.h" +#include "alcmain.h" #include "alEffect.h" #include "alError.h" #include "alFilter.h" #include "alListener.h" -#include "alMain.h" #include "alSource.h" #include "albyte.h" #include "alconfig.h" diff --git a/Alc/alcmain.h b/Alc/alcmain.h new file mode 100644 index 00000000..a22e0e81 --- /dev/null +++ b/Alc/alcmain.h @@ -0,0 +1,534 @@ +#ifndef ALC_MAIN_H +#define ALC_MAIN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +struct DevFmtTypeTraits { }; + +template<> +struct DevFmtTypeTraits { using Type = ALbyte; }; +template<> +struct DevFmtTypeTraits { using Type = ALubyte; }; +template<> +struct DevFmtTypeTraits { using Type = ALshort; }; +template<> +struct DevFmtTypeTraits { using Type = ALushort; }; +template<> +struct DevFmtTypeTraits { using Type = ALint; }; +template<> +struct DevFmtTypeTraits { using Type = ALuint; }; +template<> +struct DevFmtTypeTraits { 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 mChannels; + al::vector 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 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; + +/* 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 AmbiMap{}; + + al::span Buffer; +}; + +struct RealMixParams { + std::array ChannelIndex{}; + + al::span 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 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 Flags{}; + + std::string HrtfName; + al::vector HrtfList; + ALCenum HrtfStatus{ALC_FALSE}; + + std::atomic 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 BufferList; + + // Map of Effects for this device + std::mutex EffectLock; + al::vector EffectList; + + // Map of Filters for this device + std::mutex FilterLock; + al::vector 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 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 mHrtfState; + HrtfEntry *mHrtf{nullptr}; + + /* Ambisonic-to-UHJ encoder */ + std::unique_ptr Uhj_Encoder; + + /* Ambisonic decoder for speakers */ + std::unique_ptr AmbiDecoder; + + /* Stereo-to-binaural filter */ + std::unique_ptr Bs2b; + + POSTPROCESS PostProcess{}; + + std::unique_ptr Stablizer; + + std::unique_ptr 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*> 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 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 SearchDataFiles(const char *match, const char *subdir); + +#endif diff --git a/Alc/alconfig.cpp b/Alc/alconfig.cpp index 5f5f9149..b246a91d 100644 --- a/Alc/alconfig.cpp +++ b/Alc/alconfig.cpp @@ -28,6 +28,8 @@ #include "config.h" +#include "alconfig.h" + #include #include #include @@ -43,8 +45,7 @@ #include #include -#include "alMain.h" -#include "alconfig.h" +#include "alcmain.h" #include "logging.h" #include "compat.h" diff --git a/Alc/alu.cpp b/Alc/alu.cpp index 666cbb27..cc1a5a98 100644 --- a/Alc/alu.cpp +++ b/Alc/alu.cpp @@ -47,9 +47,9 @@ #include "alAuxEffectSlot.h" #include "alBuffer.h" +#include "alcmain.h" #include "alEffect.h" #include "alListener.h" -#include "alMain.h" #include "alcontext.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/alu.h b/Alc/alu.h new file mode 100644 index 00000000..9acf904a --- /dev/null +++ b/Alc/alu.h @@ -0,0 +1,466 @@ +#ifndef _ALU_H_ +#define _ALU_H_ + +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "alBuffer.h" +#include "alcmain.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< *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 Position; + std::array Velocity; + std::array Direction; + std::array OrientAt; + std::array 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 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 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 mUpdate{nullptr}; + + std::atomic mSourceID{0u}; + std::atomic mPlayState{Stopped}; + + ALvoicePropsBase mProps; + + /** + * Source offset in samples, relative to the currently playing buffer, NOT + * the whole queue. + */ + std::atomic mPosition; + /** Fractional (fixed-point) offset to the next sample. */ + std::atomic mPositionFrac; + + /* Current buffer queue item being played. */ + std::atomic mCurrentBuffer; + + /* Buffer queue item to loop to at end of queue (will be NULL for non- + * looping voices). + */ + std::atomic 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 Buffer; + }; + DirectData mDirect; + + struct SendData { + int FilterType; + al::span Buffer; + }; + std::array mSend; + + struct ChannelData { + alignas(16) std::array mPrevSamples; + + ALfloat mAmbiScale; + BandSplitter mAmbiSplitter; + + DirectParams mDryParams; + std::array mWetParams; + }; + std::array 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 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 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 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< GetAmbiIdentityRow(size_t i) noexcept +{ + std::array 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/Alc/backends/alsa.cpp b/Alc/backends/alsa.cpp index 698a4088..c133df68 100644 --- a/Alc/backends/alsa.cpp +++ b/Alc/backends/alsa.cpp @@ -37,8 +37,8 @@ #include "AL/al.h" -#include "alMain.h" #include "albyte.h" +#include "alcmain.h" #include "alconfig.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/backends/base.cpp b/Alc/backends/base.cpp index 5748975e..a7d47c6d 100644 --- a/Alc/backends/base.cpp +++ b/Alc/backends/base.cpp @@ -5,7 +5,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "backends/base.h" diff --git a/Alc/backends/base.h b/Alc/backends/base.h index 7a9232a6..437e31d9 100644 --- a/Alc/backends/base.h +++ b/Alc/backends/base.h @@ -6,7 +6,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" struct ClockLatency { diff --git a/Alc/backends/coreaudio.cpp b/Alc/backends/coreaudio.cpp index c6978505..b4b46382 100644 --- a/Alc/backends/coreaudio.cpp +++ b/Alc/backends/coreaudio.cpp @@ -26,7 +26,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "ringbuffer.h" #include "converter.h" diff --git a/Alc/backends/dsound.cpp b/Alc/backends/dsound.cpp index d4c1033c..5a156d54 100644 --- a/Alc/backends/dsound.cpp +++ b/Alc/backends/dsound.cpp @@ -44,7 +44,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "ringbuffer.h" #include "compat.h" diff --git a/Alc/backends/jack.cpp b/Alc/backends/jack.cpp index 99e9019b..3f81d08c 100644 --- a/Alc/backends/jack.cpp +++ b/Alc/backends/jack.cpp @@ -29,7 +29,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alconfig.h" #include "ringbuffer.h" diff --git a/Alc/backends/loopback.cpp b/Alc/backends/loopback.cpp index 77606b89..4a1c641a 100644 --- a/Alc/backends/loopback.cpp +++ b/Alc/backends/loopback.cpp @@ -22,7 +22,7 @@ #include "backends/loopback.h" -#include "alMain.h" +#include "alcmain.h" #include "alu.h" diff --git a/Alc/backends/null.cpp b/Alc/backends/null.cpp index 00a37fda..ae58cb8b 100644 --- a/Alc/backends/null.cpp +++ b/Alc/backends/null.cpp @@ -30,7 +30,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "almalloc.h" #include "alu.h" #include "logging.h" diff --git a/Alc/backends/opensl.cpp b/Alc/backends/opensl.cpp index 452028ea..b34dc0cb 100644 --- a/Alc/backends/opensl.cpp +++ b/Alc/backends/opensl.cpp @@ -31,7 +31,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "ringbuffer.h" #include "threads.h" diff --git a/Alc/backends/oss.cpp b/Alc/backends/oss.cpp index 33075890..8cfe9e96 100644 --- a/Alc/backends/oss.cpp +++ b/Alc/backends/oss.cpp @@ -43,7 +43,7 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" #include "alconfig.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/backends/portaudio.cpp b/Alc/backends/portaudio.cpp index 10c8261b..73e972c5 100644 --- a/Alc/backends/portaudio.cpp +++ b/Alc/backends/portaudio.cpp @@ -26,7 +26,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alconfig.h" #include "ringbuffer.h" diff --git a/Alc/backends/pulseaudio.cpp b/Alc/backends/pulseaudio.cpp index 97736253..da209c8d 100644 --- a/Alc/backends/pulseaudio.cpp +++ b/Alc/backends/pulseaudio.cpp @@ -34,7 +34,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alconfig.h" #include "compat.h" diff --git a/Alc/backends/qsa.cpp b/Alc/backends/qsa.cpp index 074430ca..64ed53aa 100644 --- a/Alc/backends/qsa.cpp +++ b/Alc/backends/qsa.cpp @@ -33,7 +33,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "threads.h" diff --git a/Alc/backends/sdl2.cpp b/Alc/backends/sdl2.cpp index a7a1752e..97547959 100644 --- a/Alc/backends/sdl2.cpp +++ b/Alc/backends/sdl2.cpp @@ -27,7 +27,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "threads.h" #include "compat.h" diff --git a/Alc/backends/sndio.cpp b/Alc/backends/sndio.cpp index e696cf55..587f67bb 100644 --- a/Alc/backends/sndio.cpp +++ b/Alc/backends/sndio.cpp @@ -29,7 +29,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "threads.h" #include "vector.h" diff --git a/Alc/backends/solaris.cpp b/Alc/backends/solaris.cpp index 5c12ad72..584f6e66 100644 --- a/Alc/backends/solaris.cpp +++ b/Alc/backends/solaris.cpp @@ -38,7 +38,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alconfig.h" #include "threads.h" diff --git a/Alc/backends/wasapi.cpp b/Alc/backends/wasapi.cpp index 384aaba8..bd009463 100644 --- a/Alc/backends/wasapi.cpp +++ b/Alc/backends/wasapi.cpp @@ -54,7 +54,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "ringbuffer.h" #include "compat.h" diff --git a/Alc/backends/wave.cpp b/Alc/backends/wave.cpp index 77692686..67ed7e79 100644 --- a/Alc/backends/wave.cpp +++ b/Alc/backends/wave.cpp @@ -35,7 +35,7 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" #include "alconfig.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/backends/winmm.cpp b/Alc/backends/winmm.cpp index 57abee06..cd32e95b 100644 --- a/Alc/backends/winmm.cpp +++ b/Alc/backends/winmm.cpp @@ -37,7 +37,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "ringbuffer.h" #include "threads.h" diff --git a/Alc/bformatdec.h b/Alc/bformatdec.h index 31abc4fe..06974651 100644 --- a/Alc/bformatdec.h +++ b/Alc/bformatdec.h @@ -6,7 +6,7 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" #include "almalloc.h" #include "alspan.h" #include "ambidefs.h" diff --git a/Alc/converter.h b/Alc/converter.h index 04d94833..033e4d3f 100644 --- a/Alc/converter.h +++ b/Alc/converter.h @@ -3,7 +3,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "almalloc.h" diff --git a/Alc/effects/autowah.cpp b/Alc/effects/autowah.cpp index 8545de1f..96292636 100644 --- a/Alc/effects/autowah.cpp +++ b/Alc/effects/autowah.cpp @@ -25,7 +25,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/base.h b/Alc/effects/base.h index 2b067f11..4f48de22 100644 --- a/Alc/effects/base.h +++ b/Alc/effects/base.h @@ -1,8 +1,7 @@ #ifndef EFFECTS_BASE_H #define EFFECTS_BASE_H -#include "alMain.h" - +#include "alcmain.h" #include "almalloc.h" #include "alspan.h" #include "atomic.h" diff --git a/Alc/effects/chorus.cpp b/Alc/effects/chorus.cpp index b9bf3f4c..d475b57a 100644 --- a/Alc/effects/chorus.cpp +++ b/Alc/effects/chorus.cpp @@ -31,8 +31,8 @@ #include "AL/efx.h" #include "alAuxEffectSlot.h" +#include "alcmain.h" #include "alError.h" -#include "alMain.h" #include "alcontext.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/effects/compressor.cpp b/Alc/effects/compressor.cpp index 82f70317..4a487097 100644 --- a/Alc/effects/compressor.cpp +++ b/Alc/effects/compressor.cpp @@ -22,7 +22,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alu.h" #include "alAuxEffectSlot.h" diff --git a/Alc/effects/dedicated.cpp b/Alc/effects/dedicated.cpp index f31cc903..b31b3750 100644 --- a/Alc/effects/dedicated.cpp +++ b/Alc/effects/dedicated.cpp @@ -24,7 +24,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/distortion.cpp b/Alc/effects/distortion.cpp index 94af9e11..59557395 100644 --- a/Alc/effects/distortion.cpp +++ b/Alc/effects/distortion.cpp @@ -25,7 +25,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/echo.cpp b/Alc/effects/echo.cpp index 0211520b..c10f2eb2 100644 --- a/Alc/effects/echo.cpp +++ b/Alc/effects/echo.cpp @@ -25,7 +25,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alFilter.h" #include "alAuxEffectSlot.h" diff --git a/Alc/effects/equalizer.cpp b/Alc/effects/equalizer.cpp index 961ae8fc..69ab5021 100644 --- a/Alc/effects/equalizer.cpp +++ b/Alc/effects/equalizer.cpp @@ -26,7 +26,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/fshifter.cpp b/Alc/effects/fshifter.cpp index 68e10cba..b47aa00e 100644 --- a/Alc/effects/fshifter.cpp +++ b/Alc/effects/fshifter.cpp @@ -26,7 +26,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/modulator.cpp b/Alc/effects/modulator.cpp index 8377aefe..086482d7 100644 --- a/Alc/effects/modulator.cpp +++ b/Alc/effects/modulator.cpp @@ -26,7 +26,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/null.cpp b/Alc/effects/null.cpp index 3c27bae0..e55c8699 100644 --- a/Alc/effects/null.cpp +++ b/Alc/effects/null.cpp @@ -5,7 +5,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/Alc/effects/pshifter.cpp b/Alc/effects/pshifter.cpp index bade81e6..39d3cf1a 100644 --- a/Alc/effects/pshifter.cpp +++ b/Alc/effects/pshifter.cpp @@ -30,7 +30,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/effects/reverb.cpp b/Alc/effects/reverb.cpp index 01f5c476..ac996b3f 100644 --- a/Alc/effects/reverb.cpp +++ b/Alc/effects/reverb.cpp @@ -29,7 +29,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alu.h" #include "alAuxEffectSlot.h" diff --git a/Alc/effects/vmorpher.cpp b/Alc/effects/vmorpher.cpp index 6f7e22ae..eebba3f1 100644 --- a/Alc/effects/vmorpher.cpp +++ b/Alc/effects/vmorpher.cpp @@ -25,7 +25,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alcontext.h" #include "alAuxEffectSlot.h" #include "alError.h" diff --git a/Alc/filters/nfc.cpp b/Alc/filters/nfc.cpp index e607dd56..1a567f2c 100644 --- a/Alc/filters/nfc.cpp +++ b/Alc/filters/nfc.cpp @@ -5,7 +5,7 @@ #include -#include "alMain.h" +#include "alcmain.h" /* Near-field control filters are the basis for handling the near-field effect. diff --git a/Alc/filters/splitter.h b/Alc/filters/splitter.h index 70fddd9e..927c4d17 100644 --- a/Alc/filters/splitter.h +++ b/Alc/filters/splitter.h @@ -1,7 +1,7 @@ #ifndef FILTER_SPLITTER_H #define FILTER_SPLITTER_H -#include "alMain.h" +#include "alcmain.h" #include "almalloc.h" diff --git a/Alc/helpers.cpp b/Alc/helpers.cpp index 9f6283a3..e86af6ce 100644 --- a/Alc/helpers.cpp +++ b/Alc/helpers.cpp @@ -103,7 +103,7 @@ DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x #include #endif -#include "alMain.h" +#include "alcmain.h" #include "almalloc.h" #include "compat.h" #include "cpu_caps.h" diff --git a/Alc/hrtf.cpp b/Alc/hrtf.cpp index 73cdc24e..786c4c5d 100644 --- a/Alc/hrtf.cpp +++ b/Alc/hrtf.cpp @@ -40,7 +40,7 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" #include "alconfig.h" #include "almalloc.h" #include "alnumeric.h" diff --git a/Alc/mastering.h b/Alc/mastering.h index 1003fa6c..34dc8dcb 100644 --- a/Alc/mastering.h +++ b/Alc/mastering.h @@ -7,7 +7,7 @@ #include "almalloc.h" /* For FloatBufferLine/BUFFERSIZE. */ -#include "alMain.h" +#include "alcmain.h" struct SlidingHold; diff --git a/Alc/mixer/defs.h b/Alc/mixer/defs.h index 0e91e30e..3e5d1125 100644 --- a/Alc/mixer/defs.h +++ b/Alc/mixer/defs.h @@ -3,9 +3,9 @@ #include "AL/alc.h" #include "AL/al.h" -#include "alMain.h" -#include "alu.h" +#include "alcmain.h" +#include "alu.h" #include "alspan.h" diff --git a/Alc/mixer/mixer_c.cpp b/Alc/mixer/mixer_c.cpp index b9d51c9c..47c4a6f4 100644 --- a/Alc/mixer/mixer_c.cpp +++ b/Alc/mixer/mixer_c.cpp @@ -4,7 +4,7 @@ #include -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alSource.h" #include "alAuxEffectSlot.h" diff --git a/Alc/mixer/mixer_neon.cpp b/Alc/mixer/mixer_neon.cpp index 81d0ff67..fa487d97 100644 --- a/Alc/mixer/mixer_neon.cpp +++ b/Alc/mixer/mixer_neon.cpp @@ -6,7 +6,7 @@ #include "AL/al.h" #include "AL/alc.h" -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "hrtf.h" #include "defs.h" diff --git a/Alc/mixer/mixer_sse.cpp b/Alc/mixer/mixer_sse.cpp index f407ac14..b763fdbd 100644 --- a/Alc/mixer/mixer_sse.cpp +++ b/Alc/mixer/mixer_sse.cpp @@ -6,7 +6,7 @@ #include "AL/al.h" #include "AL/alc.h" -#include "alMain.h" +#include "alcmain.h" #include "alu.h" #include "alSource.h" diff --git a/Alc/mixvoice.cpp b/Alc/mixvoice.cpp index 1020cc74..be872f6d 100644 --- a/Alc/mixvoice.cpp +++ b/Alc/mixvoice.cpp @@ -40,7 +40,7 @@ #include "AL/alc.h" #include "alBuffer.h" -#include "alMain.h" +#include "alcmain.h" #include "alSource.h" #include "albyte.h" #include "alconfig.h" diff --git a/Alc/panning.cpp b/Alc/panning.cpp index e8f80069..3a67e33a 100644 --- a/Alc/panning.cpp +++ b/Alc/panning.cpp @@ -32,7 +32,7 @@ #include #include -#include "alMain.h" +#include "alcmain.h" #include "alAuxEffectSlot.h" #include "alu.h" #include "alconfig.h" diff --git a/Alc/uhjfilter.h b/Alc/uhjfilter.h index 181e036a..53e4f89e 100644 --- a/Alc/uhjfilter.h +++ b/Alc/uhjfilter.h @@ -3,7 +3,7 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" #include "almalloc.h" diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a9d04ea..0bedc4f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -619,9 +619,6 @@ SET(COMMON_OBJS common/vecmat.h ) SET(OPENAL_OBJS - OpenAL32/Include/alMain.h - OpenAL32/Include/alu.h - OpenAL32/Include/alAuxEffectSlot.h OpenAL32/alAuxEffectSlot.cpp OpenAL32/Include/alBuffer.h @@ -642,7 +639,9 @@ SET(OPENAL_OBJS ) SET(ALC_OBJS Alc/alc.cpp + Alc/alcmain.h Alc/alu.cpp + Alc/alu.h Alc/alconfig.cpp Alc/alconfig.h Alc/alcontext.h 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 -#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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 -struct DevFmtTypeTraits { }; - -template<> -struct DevFmtTypeTraits { using Type = ALbyte; }; -template<> -struct DevFmtTypeTraits { using Type = ALubyte; }; -template<> -struct DevFmtTypeTraits { using Type = ALshort; }; -template<> -struct DevFmtTypeTraits { using Type = ALushort; }; -template<> -struct DevFmtTypeTraits { using Type = ALint; }; -template<> -struct DevFmtTypeTraits { using Type = ALuint; }; -template<> -struct DevFmtTypeTraits { 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 mChannels; - al::vector 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 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; - -/* 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 AmbiMap{}; - - al::span Buffer; -}; - -struct RealMixParams { - std::array ChannelIndex{}; - - al::span 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 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 Flags{}; - - std::string HrtfName; - al::vector HrtfList; - ALCenum HrtfStatus{ALC_FALSE}; - - std::atomic 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 BufferList; - - // Map of Effects for this device - std::mutex EffectLock; - al::vector EffectList; - - // Map of Filters for this device - std::mutex FilterLock; - al::vector 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 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 mHrtfState; - HrtfEntry *mHrtf{nullptr}; - - /* Ambisonic-to-UHJ encoder */ - std::unique_ptr Uhj_Encoder; - - /* Ambisonic decoder for speakers */ - std::unique_ptr AmbiDecoder; - - /* Stereo-to-binaural filter */ - std::unique_ptr Bs2b; - - POSTPROCESS PostProcess{}; - - std::unique_ptr Stablizer; - - std::unique_ptr 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*> 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 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 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 -#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 -#include -#include -#include - -#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< *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 Position; - std::array Velocity; - std::array Direction; - std::array OrientAt; - std::array 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 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 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 mUpdate{nullptr}; - - std::atomic mSourceID{0u}; - std::atomic mPlayState{Stopped}; - - ALvoicePropsBase mProps; - - /** - * Source offset in samples, relative to the currently playing buffer, NOT - * the whole queue. - */ - std::atomic mPosition; - /** Fractional (fixed-point) offset to the next sample. */ - std::atomic mPositionFrac; - - /* Current buffer queue item being played. */ - std::atomic mCurrentBuffer; - - /* Buffer queue item to loop to at end of queue (will be NULL for non- - * looping voices). - */ - std::atomic 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 Buffer; - }; - DirectData mDirect; - - struct SendData { - int FilterType; - al::span Buffer; - }; - std::array mSend; - - struct ChannelData { - alignas(16) std::array mPrevSamples; - - ALfloat mAmbiScale; - BandSplitter mAmbiSplitter; - - DirectParams mDryParams; - std::array mWetParams; - }; - std::array 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 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 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 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< GetAmbiIdentityRow(size_t i) noexcept -{ - std::array 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 -#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 -#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" -- cgit v1.2.3