summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-09-24 17:24:25 +0200
committerRobin Gareus <robin@gareus.org>2014-09-24 17:24:25 +0200
commit6dfb8c5c8ab9c18e40b4e5a39d8d12bd6809ab1e (patch)
tree5c46f9a9eda8dd1e5aca44416130e0f61a30a00c /libs
parent86672a5c5cd6e502c7fbd93080e3749fbdba143a (diff)
DummyBackend: add sine-sweep generators
Diffstat (limited to 'libs')
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc84
-rw-r--r--libs/backends/dummy/dummy_audiobackend.h8
2 files changed, 70 insertions, 22 deletions
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 01a50ee679..5e9602c1da 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -86,11 +86,13 @@ DummyAudioBackend::enumerate_devices () const
_device_status.push_back (DeviceStatus (_("Silence"), true));
_device_status.push_back (DeviceStatus (_("Sine Wave"), true));
_device_status.push_back (DeviceStatus (_("Square Wave"), true));
- _device_status.push_back (DeviceStatus (_("Kroneker Delta"), true));
+ _device_status.push_back (DeviceStatus (_("Impulses"), true));
_device_status.push_back (DeviceStatus (_("Uniform White Noise"), true));
_device_status.push_back (DeviceStatus (_("Gaussian White Noise"), true));
_device_status.push_back (DeviceStatus (_("Pink Noise"), true));
_device_status.push_back (DeviceStatus (_("Pink Noise (low CPU)"), true));
+ _device_status.push_back (DeviceStatus (_("Sine Sweep"), true));
+ _device_status.push_back (DeviceStatus (_("Sine Sweep Swell"), true));
}
return _device_status;
}
@@ -680,8 +682,12 @@ DummyAudioBackend::register_system_ports()
gt = DummyAudioPort::SineWave;
} else if (_device == _("Square Wave")) {
gt = DummyAudioPort::SquareWave;
- } else if (_device == _("Kroneker Delta")) {
+ } else if (_device == _("Impulses")) {
gt = DummyAudioPort::KronekerDelta;
+ } else if (_device == _("Sine Sweep")) {
+ gt = DummyAudioPort::SineSweep;
+ } else if (_device == _("Sine Sweep Swell")) {
+ gt = DummyAudioPort::SineSweepSwell;
} else {
gt = DummyAudioPort::Silence;
}
@@ -1364,8 +1370,10 @@ DummyAudioPort::DummyAudioPort (DummyAudioBackend &b, const std::string& name, P
, _b5 (0)
, _b6 (0)
, _wavetable (0)
- , _tbl_length (0)
- , _tbl_offset (0)
+ , _gen_period (0)
+ , _gen_offset (0)
+ , _gen_perio2 (0)
+ , _gen_count2 (0)
, _pass (false)
, _rn1 (0)
{
@@ -1390,17 +1398,40 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
case Silence:
break;
case KronekerDelta:
- _tbl_length = (5 + randi() % (int)(samplerate / 20.f));
+ _gen_period = (5 + randi() % (int)(samplerate / 20.f));
break;
case SquareWave:
- _tbl_length = (5 + randi() % (int)(samplerate / 20.f)) & ~1;
+ _gen_period = (5 + randi() % (int)(samplerate / 20.f)) & ~1;
break;
case SineWave:
+ _gen_period = 5 + randi() % (int)(samplerate / 20.f);
+ _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ for (uint32_t i = 0 ; i < _gen_period; ++i) {
+ _wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)i / (float)_gen_period); // -18dBFS
+ }
+ break;
+ case SineSweep:
+ case SineSweepSwell:
{
- _tbl_length = 5 + randi() % (int)(samplerate / 20.f);
- _wavetable = (Sample*) malloc( _tbl_length * sizeof(Sample));
- for (uint32_t i = 0 ; i < _tbl_length; ++i) {
- _wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)i / (float)_tbl_length); // -18dBFS
+ _gen_period = 5 * samplerate + randi() % (int)(samplerate * 10.f);
+ _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ _gen_perio2 = 1 | (int)ceilf (_gen_period * .89f); // Volume Swell period
+ const double f_min = 20.;
+ const double f_max = samplerate * .5;
+#ifdef LINEAR_SWEEP
+ const double b = (f_max - f_min) / (2. * samplerate * _gen_period);
+ const double a = f_min / samplerate;
+#else
+ const double b = log (f_max / f_min) / _gen_period;
+ const double a = f_min / (b * samplerate);
+#endif
+ for (uint32_t i = 0 ; i < _gen_period; ++i) {
+#ifdef LINEAR_SWEEP
+ const double phase = i * (a + b * i);
+#else
+ const double phase = a * exp (b * i) - a;
+#endif
+ _wavetable[i] = (float)sin (2. * M_PI * (phase - floor (phase)));
}
}
break;
@@ -1443,38 +1474,51 @@ void DummyAudioPort::generate (const pframes_t n_samples)
memset (_buffer, 0, n_samples * sizeof (Sample));
break;
case SquareWave:
- assert(_tbl_length > 0);
+ assert(_gen_period > 0);
for (pframes_t i = 0 ; i < n_samples; ++i) {
- if (_tbl_offset < _tbl_length * .5f) {
+ if (_gen_offset < _gen_period * .5f) {
_buffer[i] = .40709f; // -6dBFS
} else {
_buffer[i] = -.40709f;
}
- _tbl_offset = (_tbl_offset + 1) % _tbl_length;
+ _gen_offset = (_gen_offset + 1) % _gen_period;
}
break;
case KronekerDelta:
- assert(_tbl_length > 0);
+ assert(_gen_period > 0);
memset (_buffer, 0, n_samples * sizeof (Sample));
for (pframes_t i = 0; i < n_samples; ++i) {
- if (_tbl_offset == 0) {
+ if (_gen_offset == 0) {
_buffer[i] = 1.0f;
}
- _tbl_offset = (_tbl_offset + 1) % _tbl_length;
+ _gen_offset = (_gen_offset + 1) % _gen_period;
+ }
+ break;
+ case SineSweepSwell:
+ assert(_wavetable && _gen_period > 0);
+ {
+ const float vols = 2.f / (float)_gen_perio2;
+ for (pframes_t i = 0; i < n_samples; ++i) {
+ const float g = fabsf (_gen_count2 * vols - 1.0);
+ _buffer[i] = g * _wavetable[_gen_offset];
+ _gen_offset = (_gen_offset + 1) % _gen_period;
+ _gen_count2 = (_gen_count2 + 1) % _gen_perio2;
+ }
}
break;
case SineWave:
- assert(_wavetable && _tbl_length > 0);
+ case SineSweep:
+ assert(_wavetable && _gen_period > 0);
{
pframes_t written = 0;
while (written < n_samples) {
const uint32_t remain = n_samples - written;
- const uint32_t to_copy = std::min(remain, _tbl_length - _tbl_offset);
+ const uint32_t to_copy = std::min(remain, _gen_period - _gen_offset);
memcpy((void*)&_buffer[written],
- (void*)&_wavetable[_tbl_offset],
+ (void*)&_wavetable[_gen_offset],
to_copy * sizeof(Sample));
written += to_copy;
- _tbl_offset = (_tbl_offset + to_copy) % _tbl_length;
+ _gen_offset = (_gen_offset + to_copy) % _gen_period;
}
}
break;
diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h
index 8a7e346bc9..d5cbaec1ce 100644
--- a/libs/backends/dummy/dummy_audiobackend.h
+++ b/libs/backends/dummy/dummy_audiobackend.h
@@ -153,6 +153,8 @@ class DummyAudioPort : public DummyPort {
SineWave,
SquareWave,
KronekerDelta,
+ SineSweep,
+ SineSweepSwell,
};
void setup_generator (GeneratorType const, float const);
@@ -168,8 +170,10 @@ class DummyAudioPort : public DummyPort {
float _b0, _b1, _b2, _b3, _b4, _b5, _b6;
// generated sinf() samples
Sample * _wavetable;
- uint32_t _tbl_length;
- uint32_t _tbl_offset;
+ uint32_t _gen_period;
+ uint32_t _gen_offset;
+ uint32_t _gen_perio2;
+ uint32_t _gen_count2;
// gaussian noise generator
float grandf ();