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