libsidplayfp  0.3.5
ZeroOrderResampler.h
1 #ifndef ZEROORDER_RESAMPLER_H
2 #define ZEROORDER_RESAMPLER_H
3 
4 #include "Resampler.h"
5 
6 namespace reSIDfp
7 {
8 
14 class ZeroOrderResampler : public Resampler {
15 
16 private:
17  int cachedSample;
18 
19  const int cyclesPerSample;
20  int sampleOffset;
21  int outputValue;
22 
23 public:
24  ZeroOrderResampler(const double clockFrequency, const double samplingFrequency) :
25  cachedSample(0),
26  cyclesPerSample((int) (clockFrequency / samplingFrequency * 1024.f)),
27  sampleOffset(0),
28  outputValue(0) {}
29 
30  bool input(const int sample) {
31  bool ready = false;
32 
33  if (sampleOffset < 1024) {
34  outputValue = cachedSample + (sampleOffset * (sample - cachedSample) >> 10);
35  ready = true;
36  sampleOffset += cyclesPerSample;
37  }
38  sampleOffset -= 1024;
39 
40  cachedSample = sample;
41 
42  return ready;
43  }
44 
45  int output() const { return outputValue; }
46 
47  void reset() {
48  sampleOffset = 0;
49  cachedSample = 0;
50  }
51 };
52 
53 } // namespace reSIDfp
54 
55 #endif