summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-10-31 22:51:47 +0100
committerRobin Gareus <robin@gareus.org>2014-10-31 22:51:47 +0100
commit8d4cbc4cc1950d8bc49b02c178305aa0aadce4ce (patch)
treed3d783d52c3a67f212344332a9337b6615921ed1 /libs
parentf02610b47ce8971e0184e4a217279395e24f1234 (diff)
fix Dummy DSP load on win32 & low-pass filter load
g_get_monotonic_time() has millisecond granularity, use performance Counter if available
Diffstat (limited to 'libs')
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc33
1 files changed, 29 insertions, 4 deletions
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index fa512d96bf..9b99bf811e 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -37,6 +37,23 @@ size_t DummyAudioBackend::_max_buffer_size = 8192;
std::vector<std::string> DummyAudioBackend::_midi_options;
std::vector<AudioBackend::DeviceStatus> DummyAudioBackend::_device_status;
+#ifdef PLATFORM_WINDOWS
+static double _win_pc_rate = 0; // usec per tick
+#endif
+
+static int64_t _x_get_monotonic_usec() {
+#ifdef PLATFORM_WINDOWS
+ if (_win_pc_rate > 0) {
+ LARGE_INTEGER Count;
+ // not very reliable, but the only realistic way for sub milli-seconds
+ if (QueryPerformanceCounter (&Count)) {
+ return (int64_t) (Count.QuadPart * _win_pc_rate);
+ }
+ }
+#endif
+ return g_get_monotonic_time();
+}
+
DummyAudioBackend::DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info)
: AudioBackend (e, info)
, _running (false)
@@ -1122,7 +1139,7 @@ DummyAudioBackend::main_process_thread ()
manager.graph_order_callback();
uint64_t clock1, clock2;
- clock1 = g_get_monotonic_time();
+ clock1 = _x_get_monotonic_usec();
while (_running) {
// re-set input buffers, generate on demand.
@@ -1149,10 +1166,10 @@ DummyAudioBackend::main_process_thread ()
}
if (!_freewheeling) {
- clock2 = g_get_monotonic_time();
+ clock2 = _x_get_monotonic_usec();
const int64_t elapsed_time = clock2 - clock1;
const int64_t nomial_time = 1e6 * _samples_per_period / _samplerate;
- _dsp_load = elapsed_time / (float) nomial_time;
+ _dsp_load = _dsp_load + .05 * ((elapsed_time / (float) nomial_time) - _dsp_load) + 1e-12;
if (elapsed_time < nomial_time) {
Glib::usleep (nomial_time - elapsed_time);
} else {
@@ -1162,7 +1179,7 @@ DummyAudioBackend::main_process_thread ()
_dsp_load = 1.0f;
Glib::usleep (100); // don't hog cpu
}
- clock1 = g_get_monotonic_time();
+ clock1 = _x_get_monotonic_usec();
bool connections_changed = false;
bool ports_changed = false;
@@ -1231,6 +1248,14 @@ static int
instantiate (const std::string& arg1, const std::string& /* arg2 */)
{
s_instance_name = arg1;
+#ifdef PLATFORM_WINDOWS
+ LARGE_INTEGER Frequency;
+ if (!QueryPerformanceFrequency(&Frequency) || Frequency.QuadPart < 1) {
+ _win_pc_rate = 0;
+ } else {
+ _win_pc_rate = 1000000.0 / Frequency.QuadPart;
+ }
+#endif
return 0;
}