Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/nall/dsp/resample/hermite.hpp
2 views
1
#ifdef NALL_DSP_INTERNAL_HPP
2
3
struct ResampleHermite : Resampler {
4
inline void setFrequency();
5
inline void clear();
6
inline void sample();
7
ResampleHermite(DSP &dsp) : Resampler(dsp) {}
8
9
real fraction;
10
real step;
11
};
12
13
void ResampleHermite::setFrequency() {
14
fraction = 0.0;
15
step = dsp.settings.frequency / frequency;
16
}
17
18
void ResampleHermite::clear() {
19
fraction = 0.0;
20
}
21
22
void ResampleHermite::sample() {
23
while(fraction <= 1.0) {
24
real *channel = (real*)alloca(dsp.settings.channels * sizeof(real));
25
26
for(unsigned n = 0; n < dsp.settings.channels; n++) {
27
real a = dsp.buffer.read(n, -3);
28
real b = dsp.buffer.read(n, -2);
29
real c = dsp.buffer.read(n, -1);
30
real d = dsp.buffer.read(n, -0);
31
32
const real tension = 0.0; //-1 = low, 0 = normal, +1 = high
33
const real bias = 0.0; //-1 = left, 0 = even, +1 = right
34
35
real mu1, mu2, mu3, m0, m1, a0, a1, a2, a3;
36
37
mu1 = fraction;
38
mu2 = mu1 * mu1;
39
mu3 = mu2 * mu1;
40
41
m0 = (b - a) * (1.0 + bias) * (1.0 - tension) / 2.0;
42
m0 += (c - b) * (1.0 - bias) * (1.0 - tension) / 2.0;
43
m1 = (c - b) * (1.0 + bias) * (1.0 - tension) / 2.0;
44
m1 += (d - c) * (1.0 - bias) * (1.0 - tension) / 2.0;
45
46
a0 = +2 * mu3 - 3 * mu2 + 1;
47
a1 = mu3 - 2 * mu2 + mu1;
48
a2 = mu3 - mu2;
49
a3 = -2 * mu3 + 3 * mu2;
50
51
channel[n] = (a0 * b) + (a1 * m0) + (a2 * m1) + (a3 * c);
52
}
53
54
dsp.write(channel);
55
fraction += step;
56
}
57
58
dsp.buffer.rdoffset++;
59
fraction -= 1.0;
60
}
61
62
#endif
63
64