ALSA: fix thinko in sample time calc.
authorRobin Gareus <robin@gareus.org>
Mon, 9 Mar 2015 16:02:05 +0000 (17:02 +0100)
committerRobin Gareus <robin@gareus.org>
Mon, 9 Mar 2015 16:17:50 +0000 (17:17 +0100)
libs/backends/alsa/alsa_audiobackend.cc
libs/backends/alsa/alsa_audiobackend.h

index 8befb9219cadbe91ca4319d31ece8699e2dc21c7..cc0054bd682cc1c19e67ce4767df17ada26b5ccd 100644 (file)
@@ -51,7 +51,6 @@ AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
        , _freewheeling (false)
        , _measure_latency (false)
        , _last_process_start (0)
-       , _process_speed_samples_per_ms (0)
        , _audio_device("")
        , _midi_driver_option(_("None"))
        , _device_reservation(0)
@@ -510,7 +509,6 @@ AlsaAudioBackend::_start (bool for_latency_measurement)
        _freewheeling = false;
        _freewheel = false;
        _last_process_start = 0;
-       _process_speed_samples_per_ms = 0;
 
        release_device();
 
@@ -711,21 +709,12 @@ AlsaAudioBackend::samples_since_cycle_start ()
        if (!_active || !_run || _freewheeling || _freewheel) {
                return 0;
        }
-       if (_last_process_start == 0 || _process_speed_samples_per_ms) {
+       if (_last_process_start == 0) {
                return 0;
        }
 
-       const int64_t elapsed_time_us = _last_process_start - g_get_monotonic_time();
-
-       assert(elapsed_time_us >=0);
-
-       /* linear extrapolation, using [low pass] filtered process-speed. */
-       const pframes_t processed_samples = elapsed_time_us * _process_speed_samples_per_ms * 1e-3;
-
-       if (processed_samples >= _samples_per_period) {
-               return _samples_per_period;
-       }
-       return processed_samples;
+       const int64_t elapsed_time_us = g_get_monotonic_time() - _last_process_start;
+       return std::max((pframes_t)0, (pframes_t)rint(1e-6 * elapsed_time_us * _samplerate));
 }
 
 
@@ -1551,12 +1540,6 @@ AlsaAudioBackend::main_process_thread ()
                                clock2 = g_get_monotonic_time();
                                const int64_t elapsed_time = clock2 - clock1;
                                _dsp_load = elapsed_time / (float) nomial_time;
-
-                               const double ps = 1e3 * _samples_per_period / elapsed_time;
-                               // low pass filter, The time-constant should really be
-                               // 1.0 - e^(-2.0 * π * v / SR);
-                               // with v = _samples_per_period / N, and SR = _samples_per_period;
-                               _process_speed_samples_per_ms  = _process_speed_samples_per_ms + .05 * (ps - _process_speed_samples_per_ms) + 1e-12;
                        }
 
                        if (xrun && (_pcmi->capt_xrun() > 0 || _pcmi->play_xrun() > 0)) {
index 270d1da044e45420dbf731b2fef02e4126caf786..6c47b6215be4404bf838d6689366d83e1c9ca9ed 100644 (file)
@@ -306,7 +306,6 @@ class AlsaAudioBackend : public AudioBackend {
                bool  _measure_latency;
 
                uint64_t _last_process_start;
-               double   _process_speed_samples_per_ms;
 
                static std::vector<std::string> _midi_options;
                static std::vector<AudioBackend::DeviceStatus> _audio_device_status;