aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/alc.cpp28
-rw-r--r--alc/alcmain.h4
-rw-r--r--alc/alu.cpp6
-rw-r--r--alc/backends/wave.cpp4
-rw-r--r--alc/buffer_storage.h40
-rw-r--r--alc/devformat.h4
-rw-r--r--alc/panning.cpp10
-rw-r--r--alc/voice.cpp36
-rw-r--r--alc/voice.h3
9 files changed, 89 insertions, 46 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp
index 40bef38d..3ad3569c 100644
--- a/alc/alc.cpp
+++ b/alc/alc.cpp
@@ -1834,8 +1834,8 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
if(schans == ALC_BFORMAT3D_SOFT)
{
device->mAmbiOrder = aorder;
- device->mAmbiLayout = static_cast<AmbiLayout>(alayout);
- device->mAmbiScale = static_cast<AmbiNorm>(ascale);
+ device->mAmbiLayout = static_cast<DevAmbiLayout>(alayout);
+ device->mAmbiScale = static_cast<DevAmbiScaling>(ascale);
}
}
@@ -2101,8 +2101,9 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
if(ALbuffer *buffer{slot->Buffer})
{
slot->Effect.Buffer = nullptr;
- slot->Effect.Buffer.reset(state->createBuffer(device, buffer->mData.data(),
- buffer->Frequency, buffer->mFmtType, buffer->mFmtChannels, buffer->SampleLen));
+ slot->Effect.Buffer.reset(state->createBuffer(device, buffer->mBuffer.mData.data(),
+ buffer->mBuffer.mSampleRate, buffer->mBuffer.mType, buffer->mBuffer.mChannels,
+ buffer->mBuffer.mSampleLen));
}
slot->updateProps(context);
}
@@ -2128,9 +2129,10 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
if(ALbuffer *buffer{slot->Buffer})
{
slot->Effect.Buffer = nullptr;
- slot->Effect.Buffer.reset(state->createBuffer(device, buffer->mData.data(),
- buffer->Frequency, buffer->mFmtType, buffer->mFmtChannels,
- buffer->SampleLen));
+ slot->Effect.Buffer.reset(state->createBuffer(device,
+ buffer->mBuffer.mData.data(), buffer->mBuffer.mSampleRate,
+ buffer->mBuffer.mType, buffer->mBuffer.mChannels,
+ buffer->mBuffer.mSampleLen));
}
slot->updateProps(context);
}
@@ -3634,19 +3636,19 @@ START_API_FUNC
((device->mAmbiOrder%10) == 3) ? "rd" : "th");
else
{
- device->mAmbiLayout = AmbiLayout::FuMa;
- device->mAmbiScale = AmbiNorm::FuMa;
+ device->mAmbiLayout = DevAmbiLayout::FuMa;
+ device->mAmbiScale = DevAmbiScaling::FuMa;
}
}
else if(al::strcasecmp(fmt, "ambix") == 0 || al::strcasecmp(fmt, "acn+sn3d") == 0)
{
- device->mAmbiLayout = AmbiLayout::ACN;
- device->mAmbiScale = AmbiNorm::SN3D;
+ device->mAmbiLayout = DevAmbiLayout::ACN;
+ device->mAmbiScale = DevAmbiScaling::SN3D;
}
else if(al::strcasecmp(fmt, "acn+n3d") == 0)
{
- device->mAmbiLayout = AmbiLayout::ACN;
- device->mAmbiScale = AmbiNorm::N3D;
+ device->mAmbiLayout = DevAmbiLayout::ACN;
+ device->mAmbiScale = DevAmbiScaling::N3D;
}
else
ERR("Unsupported ambi-format: %s\n", fmt);
diff --git a/alc/alcmain.h b/alc/alcmain.h
index 9e6dd35c..b53e5f8d 100644
--- a/alc/alcmain.h
+++ b/alc/alcmain.h
@@ -210,8 +210,8 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice> {
/* For DevFmtAmbi* output only, specifies the channel order and
* normalization.
*/
- AmbiLayout mAmbiLayout{AmbiLayout::Default};
- AmbiNorm mAmbiScale{AmbiNorm::Default};
+ DevAmbiLayout mAmbiLayout{DevAmbiLayout::Default};
+ DevAmbiScaling mAmbiScale{DevAmbiScaling::Default};
ALCenum LimiterState{ALC_DONT_CARE_SOFT};
diff --git a/alc/alu.cpp b/alc/alu.cpp
index ca47c6eb..d8368d04 100644
--- a/alc/alu.cpp
+++ b/alc/alu.cpp
@@ -342,10 +342,10 @@ inline ALuint dither_rng(ALuint *seed) noexcept
}
-auto GetAmbiScales(AmbiNorm scaletype) noexcept -> const std::array<float,MAX_AMBI_CHANNELS>&
+auto GetAmbiScales(AmbiScaling scaletype) noexcept -> const std::array<float,MAX_AMBI_CHANNELS>&
{
- if(scaletype == AmbiNorm::FuMa) return AmbiScale::FromFuMa;
- if(scaletype == AmbiNorm::SN3D) return AmbiScale::FromSN3D;
+ if(scaletype == AmbiScaling::FuMa) return AmbiScale::FromFuMa;
+ if(scaletype == AmbiScaling::SN3D) return AmbiScale::FromSN3D;
return AmbiScale::FromN3D;
}
diff --git a/alc/backends/wave.cpp b/alc/backends/wave.cpp
index c452379e..473d0314 100644
--- a/alc/backends/wave.cpp
+++ b/alc/backends/wave.cpp
@@ -271,8 +271,8 @@ bool WaveBackend::reset()
case DevFmtAmbi3D:
/* .amb output requires FuMa */
mDevice->mAmbiOrder = minu(mDevice->mAmbiOrder, 3);
- mDevice->mAmbiLayout = AmbiLayout::FuMa;
- mDevice->mAmbiScale = AmbiNorm::FuMa;
+ mDevice->mAmbiLayout = DevAmbiLayout::FuMa;
+ mDevice->mAmbiScale = DevAmbiScaling::FuMa;
isbformat = 1;
chanmask = 0;
break;
diff --git a/alc/buffer_storage.h b/alc/buffer_storage.h
index b10cea4c..4a5b8b5c 100644
--- a/alc/buffer_storage.h
+++ b/alc/buffer_storage.h
@@ -2,6 +2,11 @@
#define ALC_BUFFER_FORMATS_H
#include "AL/al.h"
+#include "AL/alext.h"
+
+#include "albyte.h"
+#include "inprogext.h"
+#include "vector.h"
/* Storable formats */
@@ -25,9 +30,44 @@ enum FmtChannels : unsigned char {
FmtBFormat3D,
};
+enum class AmbiLayout : unsigned char {
+ FuMa = AL_FUMA_SOFT,
+ ACN = AL_ACN_SOFT,
+};
+enum class AmbiScaling : unsigned char {
+ FuMa = AL_FUMA_SOFT,
+ SN3D = AL_SN3D_SOFT,
+ N3D = AL_N3D_SOFT,
+};
+
ALuint BytesFromFmt(FmtType type) noexcept;
ALuint ChannelsFromFmt(FmtChannels chans, ALuint ambiorder) noexcept;
inline ALuint FrameSizeFromFmt(FmtChannels chans, FmtType type, ALuint ambiorder) noexcept
{ return ChannelsFromFmt(chans, ambiorder) * BytesFromFmt(type); }
+
+struct BufferStorage {
+ al::vector<al::byte,16> mData;
+
+ LPALBUFFERCALLBACKTYPESOFT mCallback{nullptr};
+ void *mUserData{nullptr};
+
+ ALuint mSampleRate{0u};
+ FmtChannels mChannels{};
+ FmtType mType{};
+ ALuint mSampleLen{0u};
+
+ AmbiLayout mAmbiLayout{AmbiLayout::FuMa};
+ AmbiScaling mAmbiScaling{AmbiScaling::FuMa};
+ ALuint mAmbiOrder{0u};
+
+ inline ALuint bytesFromFmt() const noexcept { return BytesFromFmt(mType); }
+ inline ALuint channelsFromFmt() const noexcept
+ { return ChannelsFromFmt(mChannels, mAmbiOrder); }
+ inline ALuint frameSizeFromFmt() const noexcept { return channelsFromFmt() * bytesFromFmt(); }
+
+ inline bool isBFormat() const noexcept
+ { return mChannels == FmtBFormat2D || mChannels == FmtBFormat3D; }
+};
+
#endif /* ALC_BUFFER_FORMATS_H */
diff --git a/alc/devformat.h b/alc/devformat.h
index 4e4b9a53..698ae72d 100644
--- a/alc/devformat.h
+++ b/alc/devformat.h
@@ -85,14 +85,14 @@ ALuint ChannelsFromDevFmt(DevFmtChannels chans, ALuint ambiorder) noexcept;
inline ALuint FrameSizeFromDevFmt(DevFmtChannels chans, DevFmtType type, ALuint ambiorder) noexcept
{ return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); }
-enum class AmbiLayout {
+enum class DevAmbiLayout : ALenum {
FuMa = ALC_FUMA_SOFT, /* FuMa channel order */
ACN = ALC_ACN_SOFT, /* ACN channel order */
Default = ACN
};
-enum class AmbiNorm {
+enum class DevAmbiScaling : ALenum {
FuMa = ALC_FUMA_SOFT, /* FuMa normalization */
SN3D = ALC_SN3D_SOFT, /* SN3D normalization */
N3D = ALC_N3D_SOFT, /* N3D normalization */
diff --git a/alc/panning.cpp b/alc/panning.cpp
index 28202fa3..9df866d4 100644
--- a/alc/panning.cpp
+++ b/alc/panning.cpp
@@ -303,16 +303,16 @@ void InitDistanceComp(ALCdevice *device, const AmbDecConf *conf,
}
-auto GetAmbiScales(AmbiNorm scaletype) noexcept -> const std::array<float,MAX_AMBI_CHANNELS>&
+auto GetAmbiScales(DevAmbiScaling scaletype) noexcept -> const std::array<float,MAX_AMBI_CHANNELS>&
{
- if(scaletype == AmbiNorm::FuMa) return AmbiScale::FromFuMa;
- if(scaletype == AmbiNorm::SN3D) return AmbiScale::FromSN3D;
+ if(scaletype == DevAmbiScaling::FuMa) return AmbiScale::FromFuMa;
+ if(scaletype == DevAmbiScaling::SN3D) return AmbiScale::FromSN3D;
return AmbiScale::FromN3D;
}
-auto GetAmbiLayout(AmbiLayout layouttype) noexcept -> const std::array<uint8_t,MAX_AMBI_CHANNELS>&
+auto GetAmbiLayout(DevAmbiLayout layouttype) noexcept -> const std::array<uint8_t,MAX_AMBI_CHANNELS>&
{
- if(layouttype == AmbiLayout::FuMa) return AmbiIndex::FromFuMa;
+ if(layouttype == DevAmbiLayout::FuMa) return AmbiIndex::FromFuMa;
return AmbiIndex::FromACN;
}
diff --git a/alc/voice.cpp b/alc/voice.cpp
index 612c611d..70f49489 100644
--- a/alc/voice.cpp
+++ b/alc/voice.cpp
@@ -255,12 +255,12 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
BufferLoopItem = nullptr;
/* Load what's left to play from the buffer */
- const size_t DataRem{minz(SrcBuffer.size(), Buffer->SampleLen-DataPosInt)};
+ const size_t DataRem{minz(SrcBuffer.size(), Buffer->mBuffer.mSampleLen-DataPosInt)};
- const al::byte *Data{Buffer->mData.data()};
+ const al::byte *Data{Buffer->mBuffer.mData.data()};
Data += (DataPosInt*NumChannels + chan)*SampleSize;
- LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataRem);
+ LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
}
else
@@ -268,10 +268,10 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
/* Load what's left of this loop iteration */
const size_t DataRem{minz(SrcBuffer.size(), LoopEnd-DataPosInt)};
- const al::byte *Data{Buffer->mData.data()};
+ const al::byte *Data{Buffer->mBuffer.mData.data()};
Data += (DataPosInt*NumChannels + chan)*SampleSize;
- LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataRem);
+ LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
/* Load any repeats of the loop we can to fill the buffer. */
@@ -280,9 +280,9 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
{
const size_t DataSize{minz(SrcBuffer.size(), LoopSize)};
- Data = Buffer->mData.data() + (LoopStart*NumChannels + chan)*SampleSize;
+ Data = Buffer->mBuffer.mData.data() + (LoopStart*NumChannels + chan)*SampleSize;
- LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataSize);
+ LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataSize);
SrcBuffer = SrcBuffer.subspan(DataSize);
}
}
@@ -298,9 +298,9 @@ float *LoadBufferCallback(ALbufferlistitem *BufferListItem, const size_t NumChan
/* Load what's left to play from the buffer */
const size_t DataRem{minz(SrcBuffer.size(), NumCallbackSamples)};
- const al::byte *Data{Buffer->mData.data() + chan*SampleSize};
+ const al::byte *Data{Buffer->mBuffer.mData.data() + chan*SampleSize};
- LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataRem);
+ LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
return SrcBuffer.begin();
@@ -314,20 +314,20 @@ float *LoadBufferQueue(ALbufferlistitem *BufferListItem, ALbufferlistitem *Buffe
while(BufferListItem && !SrcBuffer.empty())
{
ALbuffer *Buffer{BufferListItem->mBuffer};
- if(!(Buffer && DataPosInt < Buffer->SampleLen))
+ if(!(Buffer && DataPosInt < Buffer->mBuffer.mSampleLen))
{
- if(Buffer) DataPosInt -= Buffer->SampleLen;
+ if(Buffer) DataPosInt -= Buffer->mBuffer.mSampleLen;
BufferListItem = BufferListItem->mNext.load(std::memory_order_acquire);
if(!BufferListItem) BufferListItem = BufferLoopItem;
continue;
}
- const size_t DataSize{minz(SrcBuffer.size(), Buffer->SampleLen-DataPosInt)};
+ const size_t DataSize{minz(SrcBuffer.size(), Buffer->mBuffer.mSampleLen-DataPosInt)};
- const al::byte *Data{Buffer->mData.data()};
+ const al::byte *Data{Buffer->mBuffer.mData.data()};
Data += (DataPosInt*NumChannels + chan)*SampleSize;
- LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataSize);
+ LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataSize);
SrcBuffer = SrcBuffer.subspan(DataSize);
if(SrcBuffer.empty()) break;
@@ -564,8 +564,8 @@ void Voice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToD
const size_t byteOffset{mNumCallbackSamples*FrameSize};
const size_t needBytes{toLoad*FrameSize - byteOffset};
- const ALsizei gotBytes{buffer->Callback(buffer->UserData,
- &buffer->mData[byteOffset], static_cast<ALsizei>(needBytes))};
+ const ALsizei gotBytes{buffer->mBuffer.mCallback(buffer->mBuffer.mUserData,
+ &buffer->mBuffer.mData[byteOffset], static_cast<ALsizei>(needBytes))};
if(gotBytes < 1)
mFlags |= VOICE_CALLBACK_STOPPED;
else if(static_cast<ALuint>(gotBytes) < needBytes)
@@ -727,8 +727,8 @@ void Voice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToD
{
const size_t byteOffset{SrcSamplesDone*FrameSize};
const size_t byteEnd{mNumCallbackSamples*FrameSize};
- std::copy(buffer->mData.data()+byteOffset, buffer->mData.data()+byteEnd,
- buffer->mData.data());
+ al::byte *data{buffer->mBuffer.mData.data()};
+ std::copy(data+byteOffset, data+byteEnd, data);
mNumCallbackSamples -= SrcSamplesDone;
}
else
diff --git a/alc/voice.h b/alc/voice.h
index c87244fc..29ca0484 100644
--- a/alc/voice.h
+++ b/alc/voice.h
@@ -10,6 +10,7 @@
#include "almalloc.h"
#include "alspan.h"
#include "alu.h"
+#include "buffer_storage.h"
#include "devformat.h"
#include "filters/biquad.h"
#include "filters/nfc.h"
@@ -221,7 +222,7 @@ struct Voice {
ALuint mFrequency;
ALuint mSampleSize;
AmbiLayout mAmbiLayout;
- AmbiNorm mAmbiScaling;
+ AmbiScaling mAmbiScaling;
ALuint mAmbiOrder;
/** Current target parameters used for mixing. */