diff options
author | Ben Loftis <ben@harrisonconsoles.com> | 2015-04-21 08:35:20 -0500 |
---|---|---|
committer | Ben Loftis <ben@harrisonconsoles.com> | 2015-04-21 08:35:20 -0500 |
commit | 91fac4c96dc6210dcc056da70dc608700d7eb570 (patch) | |
tree | 93c24f138224d39975e6da4abaa4b36a521b970b /gtk2_ardour/tempo_dialog.cc | |
parent | f44e2e55fdd6e4d265f3eff715b071a27da8b5eb (diff) | |
parent | d3d7428a189d031739f901472f016b2907752640 (diff) |
merge fix for tempo branch
Diffstat (limited to 'gtk2_ardour/tempo_dialog.cc')
-rw-r--r-- | gtk2_ardour/tempo_dialog.cc | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index a16d224354..d430f22523 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -181,7 +181,10 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, when_beat_entry.signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TempoDialog::response), RESPONSE_ACCEPT)); when_beat_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TempoDialog::entry_key_release), false); pulse_selector.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::pulse_change)); - tap_tempo_button.signal_clicked().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo)); + tap_tempo_button.signal_button_press_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_button_press), false); + tap_tempo_button.signal_focus_out_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_focus_out)); + + tapped = false; } bool @@ -261,37 +264,51 @@ TempoDialog::pulse_change () set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid()); } -void -TempoDialog::tap_tempo () +bool +TempoDialog::tap_tempo_button_press (GdkEventButton *ev) { gint64 now; now = g_get_monotonic_time (); // microseconds - if (last_tap > 0) { + if (tapped) { double interval, bpm; static const double decay = 0.5; interval = (now - last_tap) * 1.0e-6; if (interval <= 6.0) { - // >= 10 bpm, say + // <= 6 seconds (say): >= 10 bpm if (average_interval > 0) { + if (average_interval > interval / 1.2 && average_interval < interval * 1.2) { average_interval = interval * decay + average_interval * (1.0-decay); + } else { + average_interval = 0; + } } else { average_interval = interval; } - bpm = 60.0 / average_interval; - bpm_spinner.set_value (bpm); + if (average_interval > 0) { + bpm = 60.0 / average_interval; + bpm_spinner.set_value (bpm); + } } else { average_interval = 0; } } else { average_interval = 0; + tapped = true; } last_tap = now; } +bool +TempoDialog::tap_tempo_focus_out (GdkEventFocus* ) +{ + tapped = false; + return false; +} + MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&) : ArdourDialog (_("New Meter")) { |