1 //============================================================================ 2 // 3 // SSSS tt lll lll 4 // SS SS tt ll ll 5 // SS tttttt eeee ll ll aaaa 6 // SSSS tt ee ee ll ll aa 7 // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" 8 // SS SS tt ee ll ll aa aa 9 // SSSS ttt eeeee llll llll aaaaa 10 // 11 // Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony 12 // and the Stella Team 13 // 14 // See the file "License.txt" for information on usage and redistribution of 15 // this file, and for a DISCLAIMER OF ALL WARRANTIES. 16 //============================================================================ 17 18 #ifndef LANCZOS_RESAMPLER_HXX 19 #define LANCZOS_RESAMPLER_HXX 20 21 #include "bspf.hxx" 22 #include "Resampler.hxx" 23 #include "ConvolutionBuffer.hxx" 24 #include "HighPass.hxx" 25 26 class LanczosResampler : public Resampler 27 { 28 public: 29 LanczosResampler( 30 Resampler::Format formatFrom, 31 Resampler::Format formatTo, 32 const Resampler::NextFragmentCallback& nextFragmentCallback, 33 uInt32 kernelParameter 34 ); 35 36 void fillFragment(float* fragment, uInt32 length) override; 37 38 private: 39 40 void precomputeKernels(); 41 42 void shiftSamples(uInt32 samplesToShift); 43 44 private: 45 46 uInt32 myPrecomputedKernelCount{0}; 47 uInt32 myKernelSize{0}; 48 uInt32 myCurrentKernelIndex{0}; 49 unique_ptr<float[]> myPrecomputedKernels; 50 51 uInt32 myKernelParameter{0}; 52 53 unique_ptr<ConvolutionBuffer> myBuffer; 54 unique_ptr<ConvolutionBuffer> myBufferL; 55 unique_ptr<ConvolutionBuffer> myBufferR; 56 57 Int16* myCurrentFragment{nullptr}; 58 uInt32 myFragmentIndex{0}; 59 bool myIsUnderrun{true}; 60 61 HighPass myHighPassL; 62 HighPass myHighPassR; 63 HighPass myHighPass; 64 65 uInt32 myTimeIndex{0}; 66 }; 67 68 #endif // LANCZOS_RESAMPLER_HXX 69