diff options
Diffstat (limited to 'alc')
-rw-r--r-- | alc/alc.cpp | 28 | ||||
-rw-r--r-- | alc/alcmain.h | 4 | ||||
-rw-r--r-- | alc/alu.cpp | 6 | ||||
-rw-r--r-- | alc/backends/wave.cpp | 4 | ||||
-rw-r--r-- | alc/buffer_storage.h | 40 | ||||
-rw-r--r-- | alc/devformat.h | 4 | ||||
-rw-r--r-- | alc/panning.cpp | 10 | ||||
-rw-r--r-- | alc/voice.cpp | 36 | ||||
-rw-r--r-- | alc/voice.h | 3 |
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. */ |