DSP load calculation: favor peak over average.

This commit is contained in:
Robin Gareus 2015-04-29 21:27:03 +02:00
parent 729bc00f13
commit e3cd57ecb6
3 changed files with 28 additions and 8 deletions

View File

@ -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)) {

View File

@ -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;

View File

@ -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
}