summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-09-24 18:46:54 +0200
committerRobin Gareus <robin@gareus.org>2014-09-24 18:46:54 +0200
commit186493687b839eef7a9b02084ad6cc545317abf0 (patch)
tree85cf7ed966a297b8732a9f2c5c95d8875d60e47d /libs/backends
parent6dfb8c5c8ab9c18e40b4e5a39d8d12bd6809ab1e (diff)
DummyBackend: symmetric freq sweep: up/down
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 5e9602c1da..a9f5145b1c 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -1414,18 +1414,20 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
case SineSweepSwell:
{
_gen_period = 5 * samplerate + randi() % (int)(samplerate * 10.f);
- _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ _gen_period &= ~1;
_gen_perio2 = 1 | (int)ceilf (_gen_period * .89f); // Volume Swell period
const double f_min = 20.;
const double f_max = samplerate * .5;
+ const double g_p2 = _gen_period * .5;
#ifdef LINEAR_SWEEP
- const double b = (f_max - f_min) / (2. * samplerate * _gen_period);
+ const double b = (f_max - f_min) / (2. * samplerate * g_p2);
const double a = f_min / samplerate;
#else
- const double b = log (f_max / f_min) / _gen_period;
+ const double b = log (f_max / f_min) / g_p2;
const double a = f_min / (b * samplerate);
#endif
- for (uint32_t i = 0 ; i < _gen_period; ++i) {
+ _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ for (uint32_t i = 0 ; i < g_p2; ++i) {
#ifdef LINEAR_SWEEP
const double phase = i * (a + b * i);
#else
@@ -1433,6 +1435,15 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
#endif
_wavetable[i] = (float)sin (2. * M_PI * (phase - floor (phase)));
}
+ for (uint32_t i = g_p2; i < _gen_period; ++i) {
+ const uint32_t j = _gen_period - i;
+#ifdef LINEAR_SWEEP
+ const double phase = j * (a + b * j);
+#else
+ const double phase = a * exp (b * j) - a;
+#endif
+ _wavetable[i] = (float)sin (2. * M_PI * (phase - floor (phase)));
+ }
}
break;
}