mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 16:24:57 +01:00
DSP load calculation: favor peak over average.
This commit is contained in:
parent
729bc00f13
commit
e3cd57ecb6
3 changed files with 28 additions and 8 deletions
|
|
@ -1433,7 +1433,7 @@ AlsaAudioBackend::main_process_thread ()
|
||||||
_pcmi->pcm_start ();
|
_pcmi->pcm_start ();
|
||||||
int no_proc_errors = 0;
|
int no_proc_errors = 0;
|
||||||
const int bailout = 2 * _samplerate / _samples_per_period;
|
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.registration_callback();
|
||||||
manager.graph_order_callback();
|
manager.graph_order_callback();
|
||||||
|
|
@ -1539,7 +1539,14 @@ AlsaAudioBackend::main_process_thread ()
|
||||||
/* calculate DSP load */
|
/* calculate DSP load */
|
||||||
clock2 = g_get_monotonic_time();
|
clock2 = g_get_monotonic_time();
|
||||||
const int64_t elapsed_time = clock2 - clock1;
|
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)) {
|
if (xrun && (_pcmi->capt_xrun() > 0 || _pcmi->play_xrun() > 0)) {
|
||||||
|
|
|
||||||
|
|
@ -1584,7 +1584,14 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos
|
||||||
/* calc DSP load. */
|
/* calc DSP load. */
|
||||||
clock2 = g_get_monotonic_time();
|
clock2 = g_get_monotonic_time();
|
||||||
const int64_t elapsed_time = clock2 - clock1;
|
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);
|
pthread_mutex_unlock (&_process_callback_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -1224,7 +1224,7 @@ DummyAudioBackend::main_process_thread ()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_freewheel) {
|
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();
|
clock2 = _x_get_monotonic_usec();
|
||||||
#ifdef PLATFORM_WINDOWS
|
#ifdef PLATFORM_WINDOWS
|
||||||
bool win_timers_ok = true;
|
bool win_timers_ok = true;
|
||||||
|
|
@ -1234,7 +1234,7 @@ DummyAudioBackend::main_process_thread ()
|
||||||
* (4 * nominal cycle time) and simply ignore cases where the
|
* (4 * nominal cycle time) and simply ignore cases where the
|
||||||
* execution switches cores.
|
* 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;
|
clock2 = clock1 = 0;
|
||||||
win_timers_ok = false;
|
win_timers_ok = false;
|
||||||
}
|
}
|
||||||
|
|
@ -1244,11 +1244,17 @@ DummyAudioBackend::main_process_thread ()
|
||||||
if (win_timers_ok)
|
if (win_timers_ok)
|
||||||
#endif
|
#endif
|
||||||
{ // low pass filter
|
{ // 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) {
|
if (elapsed_time < nominal_time) {
|
||||||
Glib::usleep (nomial_time - elapsed_time);
|
Glib::usleep (nominal_time - elapsed_time);
|
||||||
} else {
|
} else {
|
||||||
Glib::usleep (100); // don't hog cpu
|
Glib::usleep (100); // don't hog cpu
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue