aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/bformatdec.cpp16
-rw-r--r--core/bformatdec.h6
-rw-r--r--core/buffer_storage.h10
-rw-r--r--core/context.cpp2
-rw-r--r--core/context.h4
-rw-r--r--core/devformat.h3
-rw-r--r--core/device.h34
-rw-r--r--core/filters/biquad.h4
-rw-r--r--core/filters/nfc.h9
-rw-r--r--core/fmt_traits.cpp8
-rw-r--r--core/fmt_traits.h5
-rw-r--r--core/mixer/defs.h3
-rw-r--r--core/mixer/mixer_neon.cpp2
-rw-r--r--core/mixer/mixer_sse2.cpp2
-rw-r--r--core/mixer/mixer_sse41.cpp2
-rw-r--r--core/uhjfilter.h2
-rw-r--r--core/voice.cpp79
-rw-r--r--core/voice.h13
18 files changed, 106 insertions, 98 deletions
diff --git a/core/bformatdec.cpp b/core/bformatdec.cpp
index a308e185..d6a44799 100644
--- a/core/bformatdec.cpp
+++ b/core/bformatdec.cpp
@@ -36,7 +36,7 @@ BFormatDec::BFormatDec(const size_t inchans, const al::span<const ChannelDec> co
auto &decoder = mChannelDec.emplace<std::vector<ChannelDecoderSingle>>(inchans);
for(size_t j{0};j < decoder.size();++j)
{
- float *outcoeffs{decoder[j].mGains};
+ float *outcoeffs{decoder[j].mGains.data()};
for(const ChannelDec &incoeffs : coeffs)
*(outcoeffs++) = incoeffs[j];
}
@@ -50,11 +50,11 @@ BFormatDec::BFormatDec(const size_t inchans, const al::span<const ChannelDec> co
for(size_t j{0};j < decoder.size();++j)
{
- float *outcoeffs{decoder[j].mGains[sHFBand]};
+ float *outcoeffs{decoder[j].mGains[sHFBand].data()};
for(const ChannelDec &incoeffs : coeffs)
*(outcoeffs++) = incoeffs[j];
- outcoeffs = decoder[j].mGains[sLFBand];
+ outcoeffs = decoder[j].mGains[sLFBand].data();
for(const ChannelDec &incoeffs : coeffslf)
*(outcoeffs++) = incoeffs[j];
}
@@ -76,8 +76,10 @@ void BFormatDec::process(const al::span<FloatBufferLine> OutBuffer,
{
chandec.mXOver.process({input->data(), SamplesToDo}, hfSamples.data(),
lfSamples.data());
- MixSamples(hfSamples, OutBuffer, chandec.mGains[sHFBand], chandec.mGains[sHFBand],0,0);
- MixSamples(lfSamples, OutBuffer, chandec.mGains[sLFBand], chandec.mGains[sLFBand],0,0);
+ MixSamples(hfSamples, OutBuffer, chandec.mGains[sHFBand].data(),
+ chandec.mGains[sHFBand].data(), 0, 0);
+ MixSamples(lfSamples, OutBuffer, chandec.mGains[sLFBand].data(),
+ chandec.mGains[sLFBand].data(), 0, 0);
++input;
}
};
@@ -86,8 +88,8 @@ void BFormatDec::process(const al::span<FloatBufferLine> OutBuffer,
auto *input = InSamples;
for(auto &chandec : decoder)
{
- MixSamples({input->data(), SamplesToDo}, OutBuffer, chandec.mGains, chandec.mGains,
- 0, 0);
+ MixSamples({input->data(), SamplesToDo}, OutBuffer, chandec.mGains.data(),
+ chandec.mGains.data(), 0, 0);
++input;
}
};
diff --git a/core/bformatdec.h b/core/bformatdec.h
index 3bb7f544..97e7c9e4 100644
--- a/core/bformatdec.h
+++ b/core/bformatdec.h
@@ -25,12 +25,12 @@ class BFormatDec {
static constexpr size_t sNumBands{2};
struct ChannelDecoderSingle {
- float mGains[MAX_OUTPUT_CHANNELS];
+ std::array<float,MaxOutputChannels> mGains;
};
struct ChannelDecoderDual {
BandSplitter mXOver;
- float mGains[sNumBands][MAX_OUTPUT_CHANNELS];
+ std::array<std::array<float,MaxOutputChannels>,sNumBands> mGains;
};
alignas(16) std::array<FloatBufferLine,2> mSamples;
@@ -44,7 +44,7 @@ public:
const al::span<const ChannelDec> coeffslf, const float xover_f0norm,
std::unique_ptr<FrontStablizer> stablizer);
- bool hasStablizer() const noexcept { return mStablizer != nullptr; }
+ [[nodiscard]] auto hasStablizer() const noexcept -> bool { return mStablizer != nullptr; }
/* Decodes the ambisonic input to the given output channels. */
void process(const al::span<FloatBufferLine> OutBuffer, const FloatBufferLine *InSamples,
diff --git a/core/buffer_storage.h b/core/buffer_storage.h
index 3b581b5e..dec774bf 100644
--- a/core/buffer_storage.h
+++ b/core/buffer_storage.h
@@ -98,19 +98,19 @@ struct BufferStorage {
AmbiScaling mAmbiScaling{AmbiScaling::FuMa};
uint mAmbiOrder{0u};
- inline uint bytesFromFmt() const noexcept { return BytesFromFmt(mType); }
- inline uint channelsFromFmt() const noexcept
+ [[nodiscard]] auto bytesFromFmt() const noexcept -> uint { return BytesFromFmt(mType); }
+ [[nodiscard]] auto channelsFromFmt() const noexcept -> uint
{ return ChannelsFromFmt(mChannels, mAmbiOrder); }
- inline uint frameSizeFromFmt() const noexcept { return channelsFromFmt() * bytesFromFmt(); }
+ [[nodiscard]] auto frameSizeFromFmt() const noexcept -> uint { return channelsFromFmt() * bytesFromFmt(); }
- inline uint blockSizeFromFmt() const noexcept
+ [[nodiscard]] auto blockSizeFromFmt() const noexcept -> uint
{
if(mType == FmtIMA4) return ((mBlockAlign-1)/2 + 4) * channelsFromFmt();
if(mType == FmtMSADPCM) return ((mBlockAlign-2)/2 + 7) * channelsFromFmt();
return frameSizeFromFmt();
};
- inline bool isBFormat() const noexcept { return IsBFormat(mChannels); }
+ [[nodiscard]] auto isBFormat() const noexcept -> bool { return IsBFormat(mChannels); }
};
#endif /* CORE_BUFFER_STORAGE_H */
diff --git a/core/context.cpp b/core/context.cpp
index 2ebbc7b1..bd7bb006 100644
--- a/core/context.cpp
+++ b/core/context.cpp
@@ -142,7 +142,7 @@ void ContextBase::allocVoices(size_t addcount)
if(auto *oldvoices = mVoices.exchange(newarray.release(), std::memory_order_acq_rel))
{
- mDevice->waitForMix();
+ std::ignore = mDevice->waitForMix();
delete oldvoices;
}
}
diff --git a/core/context.h b/core/context.h
index 6f65663f..fded0902 100644
--- a/core/context.h
+++ b/core/context.h
@@ -117,12 +117,12 @@ struct ContextBase {
std::atomic<size_t> mActiveVoiceCount{};
void allocVoices(size_t addcount);
- al::span<Voice*> getVoicesSpan() const noexcept
+ [[nodiscard]] auto getVoicesSpan() const noexcept -> al::span<Voice*>
{
return {mVoices.load(std::memory_order_relaxed)->data(),
mActiveVoiceCount.load(std::memory_order_relaxed)};
}
- al::span<Voice*> getVoicesSpanAcquired() const noexcept
+ [[nodiscard]] auto getVoicesSpanAcquired() const noexcept -> al::span<Voice*>
{
return {mVoices.load(std::memory_order_acquire)->data(),
mActiveVoiceCount.load(std::memory_order_acquire)};
diff --git a/core/devformat.h b/core/devformat.h
index 485826a3..d918e531 100644
--- a/core/devformat.h
+++ b/core/devformat.h
@@ -2,6 +2,7 @@
#define CORE_DEVFORMAT_H
#include <cstdint>
+#include <cstddef>
using uint = unsigned int;
@@ -71,7 +72,7 @@ enum DevFmtChannels : unsigned char {
DevFmtChannelsDefault = DevFmtStereo
};
-#define MAX_OUTPUT_CHANNELS 16
+inline constexpr size_t MaxOutputChannels{16};
/* DevFmtType traits, providing the type, etc given a DevFmtType. */
template<DevFmtType T>
diff --git a/core/device.h b/core/device.h
index 1ac01ba6..8cc15310 100644
--- a/core/device.h
+++ b/core/device.h
@@ -34,12 +34,12 @@ struct HrtfStore;
using uint = unsigned int;
-#define MIN_OUTPUT_RATE 8000
-#define MAX_OUTPUT_RATE 192000
-#define DEFAULT_OUTPUT_RATE 48000
+inline constexpr size_t MinOutputRate{8000};
+inline constexpr size_t MaxOutputRate{192000};
+inline constexpr size_t DefaultOutputRate{48000};
-#define DEFAULT_UPDATE_SIZE 960 /* 20ms */
-#define DEFAULT_NUM_UPDATES 3
+inline constexpr size_t DefaultUpdateSize{960}; /* 20ms */
+inline constexpr size_t DefaultNumUpdates{3};
enum class DeviceType : uint8_t {
@@ -82,7 +82,7 @@ struct DistanceComp {
float *Buffer{nullptr};
};
- std::array<ChanData,MAX_OUTPUT_CHANNELS> mChannels;
+ std::array<ChanData,MaxOutputChannels> mChannels;
al::FlexArray<float,16> mSamples;
DistanceComp(size_t count) : mSamples{count} { }
@@ -232,21 +232,21 @@ struct DeviceBase {
alignas(16) std::array<MixerBufferLine,MixerChannelsMax> mSampleData;
alignas(16) std::array<float,MixerLineSize+MaxResamplerPadding> mResampleData;
- alignas(16) float FilteredData[BufferLineSize];
+ alignas(16) std::array<float,BufferLineSize> FilteredData;
union {
- alignas(16) float HrtfSourceData[BufferLineSize + HrtfHistoryLength];
- alignas(16) float NfcSampleData[BufferLineSize];
+ alignas(16) std::array<float,BufferLineSize+HrtfHistoryLength> HrtfSourceData;
+ alignas(16) std::array<float,BufferLineSize> NfcSampleData;
};
/* Persistent storage for HRTF mixing. */
- alignas(16) float2 HrtfAccumData[BufferLineSize + HrirLength];
+ alignas(16) std::array<float2,BufferLineSize+HrirLength> HrtfAccumData;
/* 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;
- uint NumChannelsPerOrder[MaxAmbiOrder+1]{};
+ std::array<uint,MaxAmbiOrder+1> NumChannelsPerOrder{};
/* "Real" output, which will be written to the device buffer. May alias the
* dry buffer.
@@ -295,9 +295,9 @@ struct DeviceBase {
DeviceBase& operator=(const DeviceBase&) = delete;
~DeviceBase();
- uint bytesFromFmt() const noexcept { return BytesFromDevFmt(FmtType); }
- uint channelsFromFmt() const noexcept { return ChannelsFromDevFmt(FmtChans, mAmbiOrder); }
- uint frameSizeFromFmt() const noexcept { return bytesFromFmt() * channelsFromFmt(); }
+ [[nodiscard]] auto bytesFromFmt() const noexcept -> uint { return BytesFromDevFmt(FmtType); }
+ [[nodiscard]] auto channelsFromFmt() const noexcept -> uint { return ChannelsFromDevFmt(FmtChans, mAmbiOrder); }
+ [[nodiscard]] auto frameSizeFromFmt() const noexcept -> uint { return bytesFromFmt() * channelsFromFmt(); }
struct MixLock {
std::atomic<uint> &mCount;
@@ -323,7 +323,7 @@ struct DeviceBase {
}
/** Waits for the mixer to not be mixing or updating the clock. */
- uint waitForMix() const noexcept
+ [[nodiscard]] auto waitForMix() const noexcept -> uint
{
uint refcount;
while((refcount=mMixCount.load(std::memory_order_acquire))&1) {
@@ -336,7 +336,7 @@ struct DeviceBase {
* SamplesDone converted from the sample rate. Should only be called while
* watching the MixCount.
*/
- std::chrono::nanoseconds getClockTime() const noexcept
+ [[nodiscard]] auto getClockTime() const noexcept -> std::chrono::nanoseconds
{
using std::chrono::seconds;
using std::chrono::nanoseconds;
@@ -369,7 +369,7 @@ struct DeviceBase {
* Returns the index for the given channel name (e.g. FrontCenter), or
* InvalidChannelIndex if it doesn't exist.
*/
- uint8_t channelIdxByName(Channel chan) const noexcept
+ [[nodiscard]] auto channelIdxByName(Channel chan) const noexcept -> uint8_t
{ return RealOut.ChannelIndex[chan]; }
DISABLE_ALLOC()
diff --git a/core/filters/biquad.h b/core/filters/biquad.h
index 75a4009b..e176caae 100644
--- a/core/filters/biquad.h
+++ b/core/filters/biquad.h
@@ -119,9 +119,9 @@ public:
void dualProcess(BiquadFilterR &other, const al::span<const Real> src, Real *dst);
/* Rather hacky. It's just here to support "manual" processing. */
- std::pair<Real,Real> getComponents() const noexcept { return {mZ1, mZ2}; }
+ [[nodiscard]] auto getComponents() const noexcept -> std::pair<Real,Real> { return {mZ1, mZ2}; }
void setComponents(Real z1, Real z2) noexcept { mZ1 = z1; mZ2 = z2; }
- Real processOne(const Real in, Real &z1, Real &z2) const noexcept
+ [[nodiscard]] auto processOne(const Real in, Real &z1, Real &z2) const noexcept -> Real
{
const Real out{in*mB0 + z1};
z1 = in*mB1 - out*mA1 + z2;
diff --git a/core/filters/nfc.h b/core/filters/nfc.h
index 4b8e68b5..7d0a7488 100644
--- a/core/filters/nfc.h
+++ b/core/filters/nfc.h
@@ -1,6 +1,7 @@
#ifndef CORE_FILTERS_NFC_H
#define CORE_FILTERS_NFC_H
+#include <array>
#include <cstddef>
#include "alspan.h"
@@ -9,22 +10,22 @@
struct NfcFilter1 {
float base_gain, gain;
float b1, a1;
- float z[1];
+ std::array<float,1> z;
};
struct NfcFilter2 {
float base_gain, gain;
float b1, b2, a1, a2;
- float z[2];
+ std::array<float,2> z;
};
struct NfcFilter3 {
float base_gain, gain;
float b1, b2, b3, a1, a2, a3;
- float z[3];
+ std::array<float,3> z;
};
struct NfcFilter4 {
float base_gain, gain;
float b1, b2, b3, b4, a1, a2, a3, a4;
- float z[4];
+ std::array<float,4> z;
};
class NfcFilter {
diff --git a/core/fmt_traits.cpp b/core/fmt_traits.cpp
index 054d8766..9d79287d 100644
--- a/core/fmt_traits.cpp
+++ b/core/fmt_traits.cpp
@@ -6,7 +6,7 @@
namespace al {
-const int16_t muLawDecompressionTable[256] = {
+const std::array<int16_t,256> muLawDecompressionTable{{
-32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956,
-23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764,
-15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412,
@@ -39,9 +39,9 @@ const int16_t muLawDecompressionTable[256] = {
244, 228, 212, 196, 180, 164, 148, 132,
120, 112, 104, 96, 88, 80, 72, 64,
56, 48, 40, 32, 24, 16, 8, 0
-};
+}};
-const int16_t aLawDecompressionTable[256] = {
+const std::array<int16_t,256> aLawDecompressionTable{{
-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
-7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
-2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
@@ -74,6 +74,6 @@ const int16_t aLawDecompressionTable[256] = {
1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
688, 656, 752, 720, 560, 528, 624, 592,
944, 912, 1008, 976, 816, 784, 880, 848
-};
+}};
} // namespace al
diff --git a/core/fmt_traits.h b/core/fmt_traits.h
index 02473014..101e20b6 100644
--- a/core/fmt_traits.h
+++ b/core/fmt_traits.h
@@ -1,6 +1,7 @@
#ifndef CORE_FMT_TRAITS_H
#define CORE_FMT_TRAITS_H
+#include <array>
#include <cstddef>
#include <stdint.h>
@@ -9,8 +10,8 @@
namespace al {
-extern const int16_t muLawDecompressionTable[256];
-extern const int16_t aLawDecompressionTable[256];
+extern const std::array<int16_t,256> muLawDecompressionTable;
+extern const std::array<int16_t,256> aLawDecompressionTable;
template<FmtType T>
diff --git a/core/mixer/defs.h b/core/mixer/defs.h
index 48daca9b..6e68978c 100644
--- a/core/mixer/defs.h
+++ b/core/mixer/defs.h
@@ -94,7 +94,8 @@ void MixDirectHrtf_(const FloatBufferSpan LeftOut, const FloatBufferSpan RightOu
/* Vectorized resampler helpers */
template<size_t N>
-inline void InitPosArrays(uint frac, uint increment, uint (&frac_arr)[N], uint (&pos_arr)[N])
+inline void InitPosArrays(uint frac, uint increment, const al::span<uint,N> frac_arr,
+ const al::span<uint,N> pos_arr)
{
pos_arr[0] = 0;
frac_arr[0] = frac;
diff --git a/core/mixer/mixer_neon.cpp b/core/mixer/mixer_neon.cpp
index ead775af..f838b20d 100644
--- a/core/mixer/mixer_neon.cpp
+++ b/core/mixer/mixer_neon.cpp
@@ -149,7 +149,7 @@ void Resample_<LerpTag,NEONTag>(const InterpState*, const float *RESTRICT src, u
alignas(16) uint pos_[4], frac_[4];
int32x4_t pos4, frac4;
- InitPosArrays(frac, increment, frac_, pos_);
+ InitPosArrays(frac, increment, al::span{frac_}, al::span{pos_});
frac4 = vld1q_s32(reinterpret_cast<int*>(frac_));
pos4 = vld1q_s32(reinterpret_cast<int*>(pos_));
diff --git a/core/mixer/mixer_sse2.cpp b/core/mixer/mixer_sse2.cpp
index edaaf7a1..aa99250e 100644
--- a/core/mixer/mixer_sse2.cpp
+++ b/core/mixer/mixer_sse2.cpp
@@ -45,7 +45,7 @@ void Resample_<LerpTag,SSE2Tag>(const InterpState*, const float *RESTRICT src, u
const __m128i fracMask4{_mm_set1_epi32(MixerFracMask)};
alignas(16) uint pos_[4], frac_[4];
- InitPosArrays(frac, increment, frac_, pos_);
+ InitPosArrays(frac, increment, al::span{frac_}, al::span{pos_});
__m128i frac4{_mm_setr_epi32(static_cast<int>(frac_[0]), static_cast<int>(frac_[1]),
static_cast<int>(frac_[2]), static_cast<int>(frac_[3]))};
__m128i pos4{_mm_setr_epi32(static_cast<int>(pos_[0]), static_cast<int>(pos_[1]),
diff --git a/core/mixer/mixer_sse41.cpp b/core/mixer/mixer_sse41.cpp
index 8ccd9fd3..4e4605df 100644
--- a/core/mixer/mixer_sse41.cpp
+++ b/core/mixer/mixer_sse41.cpp
@@ -46,7 +46,7 @@ void Resample_<LerpTag,SSE4Tag>(const InterpState*, const float *RESTRICT src, u
const __m128i fracMask4{_mm_set1_epi32(MixerFracMask)};
alignas(16) uint pos_[4], frac_[4];
- InitPosArrays(frac, increment, frac_, pos_);
+ InitPosArrays(frac, increment, al::span{frac_}, al::span{pos_});
__m128i frac4{_mm_setr_epi32(static_cast<int>(frac_[0]), static_cast<int>(frac_[1]),
static_cast<int>(frac_[2]), static_cast<int>(frac_[3]))};
__m128i pos4{_mm_setr_epi32(static_cast<int>(pos_[0]), static_cast<int>(pos_[1]),
diff --git a/core/uhjfilter.h b/core/uhjfilter.h
index 348dc7e1..29838410 100644
--- a/core/uhjfilter.h
+++ b/core/uhjfilter.h
@@ -25,7 +25,7 @@ extern UhjQualityType UhjEncodeQuality;
struct UhjAllPassFilter {
struct AllPassState {
/* Last two delayed components for direct form II. */
- float z[2];
+ std::array<float,2> z;
};
std::array<AllPassState,4> mState;
diff --git a/core/voice.cpp b/core/voice.cpp
index 3889c42d..d2645b7f 100644
--- a/core/voice.cpp
+++ b/core/voice.cpp
@@ -9,11 +9,11 @@
#include <cassert>
#include <climits>
#include <cstdint>
+#include <cstdlib>
#include <iterator>
#include <memory>
#include <new>
#include <optional>
-#include <stdlib.h>
#include <utility>
#include <vector>
@@ -133,18 +133,18 @@ void Voice::InitMixer(std::optional<std::string> resampler)
if(resampler)
{
struct ResamplerEntry {
- const char name[16];
+ const char *name;
const Resampler resampler;
};
- constexpr ResamplerEntry ResamplerList[]{
- { "none", Resampler::Point },
- { "point", Resampler::Point },
- { "linear", Resampler::Linear },
- { "cubic", Resampler::Cubic },
- { "bsinc12", Resampler::BSinc12 },
- { "fast_bsinc12", Resampler::FastBSinc12 },
- { "bsinc24", Resampler::BSinc24 },
- { "fast_bsinc24", Resampler::FastBSinc24 },
+ constexpr std::array ResamplerList{
+ ResamplerEntry{"none", Resampler::Point},
+ ResamplerEntry{"point", Resampler::Point},
+ ResamplerEntry{"linear", Resampler::Linear},
+ ResamplerEntry{"cubic", Resampler::Cubic},
+ ResamplerEntry{"bsinc12", Resampler::BSinc12},
+ ResamplerEntry{"fast_bsinc12", Resampler::FastBSinc12},
+ ResamplerEntry{"bsinc24", Resampler::BSinc24},
+ ResamplerEntry{"fast_bsinc24", Resampler::FastBSinc24},
};
const char *str{resampler->c_str()};
@@ -159,10 +159,10 @@ void Voice::InitMixer(std::optional<std::string> resampler)
str = "cubic";
}
- auto iter = std::find_if(std::begin(ResamplerList), std::end(ResamplerList),
+ auto iter = std::find_if(ResamplerList.begin(), ResamplerList.end(),
[str](const ResamplerEntry &entry) -> bool
{ return al::strcasecmp(str, entry.name) == 0; });
- if(iter == std::end(ResamplerList))
+ if(iter == ResamplerList.end())
ERR("Invalid resampler: %s\n", str);
else
ResamplerDefault = iter->resampler;
@@ -178,7 +178,7 @@ void Voice::InitMixer(std::optional<std::string> resampler)
namespace {
/* IMA ADPCM Stepsize table */
-constexpr int IMAStep_size[89] = {
+constexpr std::array<int,89> IMAStep_size{{
7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19,
21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55,
60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157,
@@ -188,35 +188,35 @@ constexpr int IMAStep_size[89] = {
4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442,
11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794,
32767
-};
+}};
/* IMA4 ADPCM Codeword decode table */
-constexpr int IMA4Codeword[16] = {
+constexpr std::array<int,16> IMA4Codeword{{
1, 3, 5, 7, 9, 11, 13, 15,
-1,-3,-5,-7,-9,-11,-13,-15,
-};
+}};
/* IMA4 ADPCM Step index adjust decode table */
-constexpr int IMA4Index_adjust[16] = {
+constexpr std::array<int,16>IMA4Index_adjust{{
-1,-1,-1,-1, 2, 4, 6, 8,
-1,-1,-1,-1, 2, 4, 6, 8
-};
+}};
/* MSADPCM Adaption table */
-constexpr int MSADPCMAdaption[16] = {
+constexpr std::array<int,16> MSADPCMAdaption{{
230, 230, 230, 230, 307, 409, 512, 614,
768, 614, 512, 409, 307, 230, 230, 230
-};
+}};
/* MSADPCM Adaption Coefficient tables */
-constexpr int MSADPCMAdaptionCoeff[7][2] = {
- { 256, 0 },
- { 512, -256 },
- { 0, 0 },
- { 192, 64 },
- { 240, 0 },
- { 460, -208 },
- { 392, -232 }
+constexpr std::array MSADPCMAdaptionCoeff{
+ std::array{256, 0},
+ std::array{512, -256},
+ std::array{ 0, 0},
+ std::array{192, 64},
+ std::array{240, 0},
+ std::array{460, -208},
+ std::array{392, -232}
};
@@ -307,7 +307,7 @@ inline void LoadSamples<FmtIMA4>(float *RESTRICT dstSamples, const std::byte *sr
auto decode_sample = [&sample,&index](const uint nibble)
{
- sample += IMA4Codeword[nibble] * IMAStep_size[index] / 8;
+ sample += IMA4Codeword[nibble] * IMAStep_size[static_cast<uint>(index)] / 8;
sample = clampi(sample, -32768, 32767);
index += IMA4Index_adjust[nibble];
@@ -382,7 +382,7 @@ inline void LoadSamples<FmtMSADPCM>(float *RESTRICT dstSamples, const std::byte
int delta{int(input[2*srcChan + 0]) | (int(input[2*srcChan + 1]) << 8)};
input += srcStep*2;
- int sampleHistory[2]{};
+ std::array<int,2> sampleHistory{};
sampleHistory[0] = int(input[2*srcChan + 0]) | (int(input[2*srcChan + 1])<<8);
input += srcStep*2;
sampleHistory[1] = int(input[2*srcChan + 0]) | (int(input[2*srcChan + 1])<<8);
@@ -421,7 +421,7 @@ inline void LoadSamples<FmtMSADPCM>(float *RESTRICT dstSamples, const std::byte
sampleHistory[1] = sampleHistory[0];
sampleHistory[0] = pred;
- delta = (MSADPCMAdaption[nibble] * delta) / 256;
+ delta = (MSADPCMAdaption[static_cast<uint>(nibble)] * delta) / 256;
delta = maxi(16, delta);
return pred;
@@ -630,8 +630,8 @@ void DoHrtfMix(const float *samples, const uint DstBufferSize, DirectParams &par
parms.Hrtf.Target.Coeffs,
parms.Hrtf.Target.Delay,
0.0f, gain / static_cast<float>(fademix)};
- MixHrtfBlendSamples(HrtfSamples, AccumSamples+OutPos, IrSize, &parms.Hrtf.Old, &hrtfparams,
- fademix);
+ MixHrtfBlendSamples(HrtfSamples.data(), AccumSamples.data()+OutPos, IrSize,
+ &parms.Hrtf.Old, &hrtfparams, fademix);
/* Update the old parameters with the result. */
parms.Hrtf.Old = parms.Hrtf.Target;
@@ -658,7 +658,8 @@ void DoHrtfMix(const float *samples, const uint DstBufferSize, DirectParams &par
parms.Hrtf.Target.Delay,
parms.Hrtf.Old.Gain,
(gain - parms.Hrtf.Old.Gain) / static_cast<float>(todo)};
- MixHrtfSamples(HrtfSamples+fademix, AccumSamples+OutPos, IrSize, &hrtfparams, todo);
+ MixHrtfSamples(HrtfSamples.data()+fademix, AccumSamples.data()+OutPos, IrSize, &hrtfparams,
+ todo);
/* Store the now-current gain for next time. */
parms.Hrtf.Old.Gain = gain;
@@ -669,8 +670,8 @@ void DoNfcMix(const al::span<const float> samples, FloatBufferLine *OutBuffer, D
const float *TargetGains, const uint Counter, const uint OutPos, DeviceBase *Device)
{
using FilterProc = void (NfcFilter::*)(const al::span<const float>, float*);
- static constexpr FilterProc NfcProcess[MaxAmbiOrder+1]{
- nullptr, &NfcFilter::process1, &NfcFilter::process2, &NfcFilter::process3};
+ static constexpr std::array<FilterProc,MaxAmbiOrder+1> NfcProcess{{
+ nullptr, &NfcFilter::process1, &NfcFilter::process2, &NfcFilter::process3}};
float *CurrentGains{parms.Gains.Current.data()};
MixSamples(samples, {OutBuffer, 1u}, CurrentGains, TargetGains, Counter, OutPos);
@@ -678,7 +679,7 @@ void DoNfcMix(const al::span<const float> samples, FloatBufferLine *OutBuffer, D
++CurrentGains;
++TargetGains;
- const al::span<float> nfcsamples{Device->NfcSampleData, samples.size()};
+ const al::span<float> nfcsamples{Device->NfcSampleData.data(), samples.size()};
size_t order{1};
while(const size_t chancount{Device->NumChannelsPerOrder[order]})
{
@@ -697,7 +698,7 @@ void DoNfcMix(const al::span<const float> samples, FloatBufferLine *OutBuffer, D
void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds deviceTime,
const uint SamplesToDo)
{
- static constexpr std::array<float,MAX_OUTPUT_CHANNELS> SilentTarget{};
+ static constexpr std::array<float,MaxOutputChannels> SilentTarget{};
ASSUME(SamplesToDo > 0);
diff --git a/core/voice.h b/core/voice.h
index a599eda8..6c953804 100644
--- a/core/voice.h
+++ b/core/voice.h
@@ -32,7 +32,7 @@ enum class DistanceModel : unsigned char;
using uint = unsigned int;
-#define MAX_SENDS 6
+inline constexpr size_t MaxSendCount{6};
enum class SpatializeMode : unsigned char {
@@ -72,8 +72,8 @@ struct DirectParams {
} Hrtf;
struct {
- std::array<float,MAX_OUTPUT_CHANNELS> Current;
- std::array<float,MAX_OUTPUT_CHANNELS> Target;
+ std::array<float,MaxOutputChannels> Current;
+ std::array<float,MaxOutputChannels> Target;
} Gains;
};
@@ -154,7 +154,8 @@ struct VoiceProps {
float HFReference;
float GainLF;
float LFReference;
- } Send[MAX_SENDS];
+ };
+ std::array<SendData,MaxSendCount> Send;
};
struct VoicePropsItem : public VoiceProps {
@@ -239,7 +240,7 @@ struct Voice {
al::span<FloatBufferLine> Buffer;
};
TargetData mDirect;
- std::array<TargetData,MAX_SENDS> mSend;
+ std::array<TargetData,MaxSendCount> mSend;
/* The first MaxResamplerPadding/2 elements are the sample history from the
* previous mix, with an additional MaxResamplerPadding/2 elements that are
@@ -254,7 +255,7 @@ struct Voice {
BandSplitter mAmbiSplitter;
DirectParams mDryParams;
- std::array<SendParams,MAX_SENDS> mWetParams;
+ std::array<SendParams,MaxSendCount> mWetParams;
};
al::vector<ChannelData> mChans{2};