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-2019 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
26class LanczosResampler : public Resampler
27{
28 public:
29 LanczosResampler(
30 Resampler::Format formatFrom,
31 Resampler::Format formatTo,
32 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;
47 uInt32 myKernelSize;
48 uInt32 myCurrentKernelIndex;
49 unique_ptr<float[]> myPrecomputedKernels;
50
51 uInt32 myKernelParameter;
52
53 unique_ptr<ConvolutionBuffer> myBuffer;
54 unique_ptr<ConvolutionBuffer> myBufferL;
55 unique_ptr<ConvolutionBuffer> myBufferR;
56
57 Int16* myCurrentFragment;
58 uInt32 myFragmentIndex;
59 bool myIsUnderrun;
60
61 HighPass myHighPassL;
62 HighPass myHighPassR;
63 HighPass myHighPass;
64
65 uInt32 myTimeIndex;
66};
67
68#endif // LANCZOS_RESAMPLER_HXX
69