1 #ifndef CONVERTER_H 2 #define CONVERTER_H 3 4 #include <cstddef> 5 #include <memory> 6 7 #include "almalloc.h" 8 #include "core/devformat.h" 9 #include "core/mixer/defs.h" 10 11 using uint = unsigned int; 12 13 14 struct SampleConverter { 15 DevFmtType mSrcType{}; 16 DevFmtType mDstType{}; 17 uint mSrcTypeSize{}; 18 uint mDstTypeSize{}; 19 20 int mSrcPrepCount{}; 21 22 uint mFracOffset{}; 23 uint mIncrement{}; 24 InterpState mState{}; 25 ResamplerFunc mResample{}; 26 27 alignas(16) float mSrcSamples[BufferLineSize]{}; 28 alignas(16) float mDstSamples[BufferLineSize]{}; 29 30 struct ChanSamples { 31 alignas(16) float PrevSamples[MaxResamplerPadding]; 32 }; 33 al::FlexArray<ChanSamples> mChan; 34 SampleConverterSampleConverter35 SampleConverter(size_t numchans) : mChan{numchans} { } 36 37 uint convert(const void **src, uint *srcframes, void *dst, uint dstframes); 38 uint availableOut(uint srcframes) const; 39 40 DEF_FAM_NEWDEL(SampleConverter, mChan) 41 }; 42 using SampleConverterPtr = std::unique_ptr<SampleConverter>; 43 44 SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, size_t numchans, 45 uint srcRate, uint dstRate, Resampler resampler); 46 47 48 struct ChannelConverter { 49 DevFmtType mSrcType{}; 50 uint mSrcStep{}; 51 uint mChanMask{}; 52 DevFmtChannels mDstChans{}; 53 is_activeChannelConverter54 bool is_active() const noexcept { return mChanMask != 0; } 55 56 void convert(const void *src, float *dst, uint frames) const; 57 }; 58 59 #endif /* CONVERTER_H */ 60