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