converter.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef CORE_CONVERTER_H
  2. #define CORE_CONVERTER_H
  3. #include <chrono>
  4. #include <cstddef>
  5. #include <memory>
  6. #include "almalloc.h"
  7. #include "devformat.h"
  8. #include "flexarray.h"
  9. #include "mixer/defs.h"
  10. #include "resampler_limits.h"
  11. using uint = unsigned int;
  12. struct SampleConverter {
  13. DevFmtType mSrcType{};
  14. DevFmtType mDstType{};
  15. uint mSrcTypeSize{};
  16. uint mDstTypeSize{};
  17. uint mSrcPrepCount{};
  18. uint mFracOffset{};
  19. uint mIncrement{};
  20. InterpState mState{};
  21. ResamplerFunc mResample{};
  22. alignas(16) FloatBufferLine mSrcSamples{};
  23. alignas(16) FloatBufferLine mDstSamples{};
  24. struct ChanSamples {
  25. alignas(16) std::array<float,MaxResamplerPadding> PrevSamples;
  26. };
  27. al::FlexArray<ChanSamples> mChan;
  28. SampleConverter(size_t numchans) : mChan{numchans} { }
  29. [[nodiscard]] auto convert(const void **src, uint *srcframes, void *dst, uint dstframes) -> uint;
  30. [[nodiscard]] auto convertPlanar(const void **src, uint *srcframes, void *const*dst, uint dstframes) -> uint;
  31. [[nodiscard]] auto availableOut(uint srcframes) const -> uint;
  32. using SampleOffset = std::chrono::duration<int64_t, std::ratio<1,MixerFracOne>>;
  33. [[nodiscard]] auto currentInputDelay() const noexcept -> SampleOffset
  34. {
  35. const int64_t prep{int64_t{mSrcPrepCount} - MaxResamplerEdge};
  36. return SampleOffset{(prep<<MixerFracBits) + mFracOffset};
  37. }
  38. static std::unique_ptr<SampleConverter> Create(DevFmtType srcType, DevFmtType dstType,
  39. size_t numchans, uint srcRate, uint dstRate, Resampler resampler);
  40. DEF_FAM_NEWDEL(SampleConverter, mChan)
  41. };
  42. using SampleConverterPtr = std::unique_ptr<SampleConverter>;
  43. struct ChannelConverter {
  44. DevFmtType mSrcType{};
  45. uint mSrcStep{};
  46. uint mChanMask{};
  47. DevFmtChannels mDstChans{};
  48. [[nodiscard]] auto is_active() const noexcept -> bool { return mChanMask != 0; }
  49. void convert(const void *src, float *dst, uint frames) const;
  50. };
  51. #endif /* CORE_CONVERTER_H */