diff options
Diffstat (limited to 'alc/converter.h')
-rw-r--r-- | alc/converter.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/alc/converter.h b/alc/converter.h new file mode 100644 index 00000000..033e4d3f --- /dev/null +++ b/alc/converter.h @@ -0,0 +1,70 @@ +#ifndef CONVERTER_H +#define CONVERTER_H + +#include <memory> + +#include "alcmain.h" +#include "alu.h" +#include "almalloc.h" + +struct SampleConverter { + DevFmtType mSrcType{}; + DevFmtType mDstType{}; + ALsizei mSrcTypeSize{}; + ALsizei mDstTypeSize{}; + + ALint mSrcPrepCount{}; + + ALsizei mFracOffset{}; + ALsizei mIncrement{}; + InterpState mState{}; + ResamplerFunc mResample{}; + + alignas(16) ALfloat mSrcSamples[BUFFERSIZE]{}; + alignas(16) ALfloat mDstSamples[BUFFERSIZE]{}; + + struct ChanSamples { + alignas(16) ALfloat PrevSamples[MAX_RESAMPLE_PADDING*2]; + }; + al::FlexArray<ChanSamples> mChan; + + SampleConverter(size_t numchans) : mChan{numchans} { } + SampleConverter(const SampleConverter&) = delete; + SampleConverter& operator=(const SampleConverter&) = delete; + + ALsizei convert(const ALvoid **src, ALsizei *srcframes, ALvoid *dst, ALsizei dstframes); + ALsizei availableOut(ALsizei srcframes) const; + + static constexpr size_t Sizeof(size_t length) noexcept + { + return maxz(sizeof(SampleConverter), + al::FlexArray<ChanSamples>::Sizeof(length, offsetof(SampleConverter, mChan))); + } + + DEF_PLACE_NEWDEL() +}; +using SampleConverterPtr = std::unique_ptr<SampleConverter>; + +SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, ALsizei numchans, + ALsizei srcRate, ALsizei dstRate, Resampler resampler); + + +struct ChannelConverter { + DevFmtType mSrcType; + DevFmtChannels mSrcChans; + DevFmtChannels mDstChans; + + ChannelConverter(DevFmtType srctype, DevFmtChannels srcchans, DevFmtChannels dstchans) + : mSrcType(srctype), mSrcChans(srcchans), mDstChans(dstchans) + { } + + void convert(const ALvoid *src, ALfloat *dst, ALsizei frames) const; + + DEF_NEWDEL(ChannelConverter) +}; +using ChannelConverterPtr = std::unique_ptr<ChannelConverter>; + +ChannelConverterPtr CreateChannelConverter(DevFmtType srcType, DevFmtChannels srcChans, + DevFmtChannels dstChans); + +#endif /* CONVERTER_H */ |