#ifndef ALU_H #define ALU_H #include #include #include #include "AL/al.h" #include "alcmain.h" #include "alspan.h" #include "logging.h" struct ALbufferlistitem; struct ALeffectslot; #define MAX_PITCH 255 #define MAX_SENDS 6 using MixerFunc = void(*)(const al::span InSamples, const al::span OutBuffer, float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos); using RowMixerFunc = void(*)(const al::span OutBuffer, const al::span Gains, const float *InSamples, const size_t InStride); using HrtfDirectMixerFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, const size_t BufferSize); extern MixerFunc MixSamples; extern RowMixerFunc MixRowSamples; #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< coeffs); /** * 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 float (&dir)[3], const float spread, const al::span coeffs) { /* 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(const float azimuth, const float elevation, const float spread, const al::span coeffs) { const float x{-std::sin(azimuth) * std::cos(elevation)}; const float y{ std::sin(elevation)}; const float 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 float*RESTRICT coeffs, const float ingain, const al::span gains); inline std::array GetAmbiIdentityRow(size_t i) noexcept { std::array ret{}; ret[i] = 1.0f; return ret; } void aluMixData(ALCdevice *device, void *OutBuffer, const ALuint NumSamples, const size_t FrameStep); /* 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 const ALfloat ConeScale; extern const ALfloat ZScale; #endif