summaryrefslogtreecommitdiff
path: root/gtk2_ardour/tempo_dialog.cc
diff options
context:
space:
mode:
authorColin Fletcher <colin.m.fletcher@googlemail.com>2015-03-19 19:44:20 +0000
committerColin Fletcher <colin.m.fletcher@googlemail.com>2015-03-21 12:19:25 +0000
commitee959e73fd02c5eefc56a27d23e9ce847b0fab55 (patch)
tree93096a8630b97f0f06e8016128fd1ca7391def48 /gtk2_ardour/tempo_dialog.cc
parent37b0e8ac90aae8d5359f67a7a32bfe78ad6422af (diff)
tap-tempo: try to make it work properly from the very first click
Diffstat (limited to 'gtk2_ardour/tempo_dialog.cc')
-rw-r--r--gtk2_ardour/tempo_dialog.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc
index e11644131b..2a353d4b7d 100644
--- a/gtk2_ardour/tempo_dialog.cc
+++ b/gtk2_ardour/tempo_dialog.cc
@@ -179,6 +179,9 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
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_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
@@ -262,17 +265,17 @@ TempoDialog::pulse_change ()
bool
TempoDialog::tap_tempo_button_press (GdkEventButton *ev)
{
- gint64 now;
+ guint32 now;
now = ev->time; // milliseconds
- if (last_tap > 0) {
+ if (tapped) {
double interval, bpm;
static const double decay = 0.5;
interval = (now - last_tap) * 1.0e-3;
if (interval <= 6.0) {
- // >= 10 bpm, say
- if (average_interval > 0) {
+ // <= 6 seconds (say): >= 10 bpm
+ if (average_interval > 0 && average_interval > interval / 1.2 && average_interval < interval * 1.2) {
average_interval = interval * decay
+ average_interval * (1.0-decay);
} else {
@@ -286,11 +289,19 @@ TempoDialog::tap_tempo_button_press (GdkEventButton *ev)
}
} else {
average_interval = 0;
+ tapped = true;
}
last_tap = now;
return false;
}
+bool
+TempoDialog::tap_tempo_focus_out (GdkEventFocus* )
+{
+ tapped = false;
+ return false;
+}
+
MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&)
: ArdourDialog (_("New Meter"))
{