blob: 609cf54fb583b0b018f35a353ea1f16dbd606385 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#ifndef ENGINEBUFFERSCALE_H
#define ENGINEBUFFERSCALE_H
#include <QObject>
#include "util/audiosignal.h"
// MAX_SEEK_SPEED needs to be good and high to allow room for the very high
// instantaneous velocities of advanced scratching (Uzi) and spin-backs.
// (Yes, I can actually spin the SCS.1d faster than 15x nominal.
// Why do we even have this parameter? -- Sean)
#define MAX_SEEK_SPEED 100.0
#define MIN_SEEK_SPEED 0.010
// I'll hurt you if you change MIN_SEEK_SPEED. SoundTouch freaks out and
// just gives us stuttering if you set the speed to be lower than this.
// This took me ages to figure out.
// -- Albert July 17, 2010.
/**
*@author Tue & Ken Haste Andersen
*/
class EngineBufferScale : public QObject {
Q_OBJECT
public:
EngineBufferScale();
virtual ~EngineBufferScale();
// Sets the scaling parameters.
// * The base rate (ratio of track sample rate to output sample rate).
// * The tempoRatio describes the tempo change in fraction of
// original tempo. Put another way, it is the ratio of track seconds to
// real second. For example, a tempo of 1.0 is no change. A
// tempo of 2 is a 2x speedup (2 track seconds pass for every 1
// real second).
// * The pitchRatio describes the pitch adjustment in fraction of
// the original pitch. For example, a pitch adjustment of 1.0 is no change and a
// pitch adjustment of 2.0 is a full octave shift up.
//
// If parameter settings are outside of acceptable limits, each setting will
// be set to the value it was clamped to.
virtual void setScaleParameters(double base_rate,
double* pTempoRatio,
double* pPitchRatio) {
m_dBaseRate = base_rate;
m_dTempoRatio = *pTempoRatio;
m_dPitchRatio = *pPitchRatio;
}
// Set the desired output sample rate.
virtual void setSampleRate(SINT iSampleRate);
const mixxx::AudioSignal& getAudioSignal() const {
return m_audioSignal;
}
// Called from EngineBuffer when seeking, to ensure the buffers are flushed */
virtual void clear() = 0;
// Scale buffer
// Returns the number of frames that have bean read from the unscaled
// input buffer The number of frames copied to the output buffer is always
// an integer value, while the number of frames read from the unscaled
// input buffer might be partial number!
// The size of the output buffer is given in samples, i.e. twice the number
// of frames for an interleaved stereo signal.
virtual double scaleBuffer(
CSAMPLE* pOutputBuffer,
SINT iOutputBufferSize) = 0;
private:
mixxx::AudioSignal m_audioSignal;
protected:
double m_dBaseRate;
bool m_bSpeedAffectsPitch;
double m_dTempoRatio;
double m_dPitchRatio;
};
#endif
|