summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-04-29 21:27:03 +0200
committerRobin Gareus <robin@gareus.org>2015-04-29 21:27:37 +0200
commite3cd57ecb634af33a6a86eb1ed57e270eddb1421 (patch)
treec9cc28b8bb63085d330604310b532a42e83e1ea6 /libs
parent729bc00f13fcad4ed986c3e5cf4565fd4ce0dead (diff)
DSP load calculation: favor peak over average.
Diffstat (limited to 'libs')
-rw-r--r--libs/backends/alsa/alsa_audiobackend.cc11
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.cc9
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc16
3 files changed, 28 insertions, 8 deletions
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index cc0054bd68..4cb4710333 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -1433,7 +1433,7 @@ AlsaAudioBackend::main_process_thread ()
_pcmi->pcm_start ();
int no_proc_errors = 0;
const int bailout = 2 * _samplerate / _samples_per_period;
- const int64_t nomial_time = 1e6 * _samples_per_period / _samplerate;
+ const int64_t nominal_time = 1e6 * _samples_per_period / _samplerate;
manager.registration_callback();
manager.graph_order_callback();
@@ -1539,7 +1539,14 @@ AlsaAudioBackend::main_process_thread ()
/* calculate DSP load */
clock2 = g_get_monotonic_time();
const int64_t elapsed_time = clock2 - clock1;
- _dsp_load = elapsed_time / (float) nomial_time;
+ // low pass filter
+ const float load = elapsed_time / (float) nominal_time;
+ if (load > _dsp_load) {
+ _dsp_load = load;
+ } else {
+ const float a = .1 * _samples_per_period / _samplerate;
+ _dsp_load = _dsp_load + a * (load - _dsp_load) + 1e-12;
+ }
}
if (xrun && (_pcmi->capt_xrun() > 0 || _pcmi->play_xrun() > 0)) {
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc
index 60835e402b..94c179ab28 100644
--- a/libs/backends/coreaudio/coreaudio_backend.cc
+++ b/libs/backends/coreaudio/coreaudio_backend.cc
@@ -1584,7 +1584,14 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos
/* calc DSP load. */
clock2 = g_get_monotonic_time();
const int64_t elapsed_time = clock2 - clock1;
- _dsp_load = elapsed_time / nominal_time;
+ // low pass filter
+ const float load = elapsed_time / (float) nominal_time;
+ if (load > _dsp_load) {
+ _dsp_load = load;
+ } else {
+ const float a = .1 * _samples_per_period / _samplerate;
+ _dsp_load = _dsp_load + a * (load - _dsp_load) + 1e-12;
+ }
pthread_mutex_unlock (&_process_callback_mutex);
return 0;
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 050e99435c..1ba91f39dd 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -1224,7 +1224,7 @@ DummyAudioBackend::main_process_thread ()
}
if (!_freewheel) {
- const int64_t nomial_time = 1e6 * _samples_per_period / _samplerate;
+ const int64_t nominal_time = 1e6 * _samples_per_period / _samplerate;
clock2 = _x_get_monotonic_usec();
#ifdef PLATFORM_WINDOWS
bool win_timers_ok = true;
@@ -1234,7 +1234,7 @@ DummyAudioBackend::main_process_thread ()
* (4 * nominal cycle time) and simply ignore cases where the
* execution switches cores.
*/
- if (clock1 < 0 || clock2 < 0 || (clock1 > clock2) || (clock2 - clock1) > 4 * nomial_time) {
+ if (clock1 < 0 || clock2 < 0 || (clock1 > clock2) || (clock2 - clock1) > 4 * nominal_time) {
clock2 = clock1 = 0;
win_timers_ok = false;
}
@@ -1244,11 +1244,17 @@ DummyAudioBackend::main_process_thread ()
if (win_timers_ok)
#endif
{ // low pass filter
- _dsp_load = _dsp_load + .05 * ((elapsed_time / (float) nomial_time) - _dsp_load) + 1e-12;
+ const float load = elapsed_time / (float) nominal_time;
+ if (load > _dsp_load) {
+ _dsp_load = load;
+ } else {
+ const float a = .1 * _samples_per_period / _samplerate;
+ _dsp_load = _dsp_load + a * (load - _dsp_load) + 1e-12;
+ }
}
- if (elapsed_time < nomial_time) {
- Glib::usleep (nomial_time - elapsed_time);
+ if (elapsed_time < nominal_time) {
+ Glib::usleep (nominal_time - elapsed_time);
} else {
Glib::usleep (100); // don't hog cpu
}