1 #pragma once
2 
3 #include "engine/bufferscalers/enginebufferscale.h"
4 #include "util/memory.h"
5 #include "util/samplebuffer.h"
6 
7 class ReadAheadManager;
8 
9 namespace soundtouch {
10 class SoundTouch;
11 }  // namespace soundtouch
12 
13 // Uses libsoundtouch to scale audio.
14 class EngineBufferScaleST : public EngineBufferScale {
15     Q_OBJECT
16   public:
17     explicit EngineBufferScaleST(
18             ReadAheadManager* pReadAheadManager);
19     ~EngineBufferScaleST() override;
20 
21     void setScaleParameters(double base_rate,
22                             double* pTempoRatio,
23                             double* pPitchRatio) override;
24 
25     // Scale buffer.
26     double scaleBuffer(
27             CSAMPLE* pOutputBuffer,
28             SINT iOutputBufferSize) override;
29 
30     // Flush buffer.
31     void clear() override;
32 
33   private:
34     void onSampleRateChanged() override;
35 
36     // The read-ahead manager that we use to fetch samples
37     ReadAheadManager* m_pReadAheadManager;
38 
39     // SoundTouch time/pitch scaling lib
40     std::unique_ptr<soundtouch::SoundTouch> m_pSoundTouch;
41 
42     // Temporary buffer for reading from the RAMAN.
43     mixxx::SampleBuffer buffer_back;
44 
45     // Holds the playback direction.
46     bool m_bBackwards;
47 };
48