-
-void
-Editor::add_mouse_speed (double speed, double dir)
-{
- size_t index;
-
- mouse_direction = dir;
-
- index = mouse_speed_entries;
-
- if (++index >= mouse_speed_size) {
- index = 0;
- have_full_mouse_speed = true;
- }
-
- mouse_speed[index] = speed;
- mouse_speed_entries = index;
-}
-
-double
-Editor::compute_mouse_speed ()
-{
- double total = 0;
-
- if (!have_full_mouse_speed) {
-
- /* partial speed buffer, just use whatever we have so far */
-
- if (mouse_speed_entries == 0 ) {
- return 0.0;
- }
-
- for (size_t n = 0; n < mouse_speed_entries; ++n) {
- total += mouse_speed[n];
- }
-
- return mouse_direction * total/mouse_speed_entries;
- }
-
- /* compute the average (effectively low-pass filtering) mouse speed
- across the entire buffer.
- */
-
- for (size_t n = 0; n < mouse_speed_size; ++n) {
- total += mouse_speed[n];
- }
-
-
- return mouse_direction * total/mouse_speed_size;
-}
-
-bool
-Editor::update_mouse_speed ()
-{
- double speed;
-
- if (!_scrubbing) {
- session->request_transport_speed (0.0);
- mouse_speed_update = -1;
- return false;
- }
-
- speed = compute_mouse_speed ();
-
- struct timeval tmnow;
-
- gettimeofday (&tmnow, 0);
- double now = (tmnow.tv_sec * 1000000.0) + tmnow.tv_usec;
-
- if (now - last_scrub_time > 250000) {
-
- // 0.25 seconds since last mouse motion, start to brake
-
- if (fabs (speed) < 0.1) {
- /* don't asymptotically approach zero */
- memset (mouse_speed, 0, sizeof (double) * mouse_speed_size);
- speed = 0.0;
- } else if (fabs (speed) < 0.25) {
- add_mouse_speed (fabs (speed * 0.2), mouse_direction);
- } else {
- add_mouse_speed (fabs (speed * 0.6), mouse_direction);
- }
- }
-
- session->request_transport_speed (speed);
- return _scrubbing;
-}