provide config parameter to allow non-quarter note pulses; off by default; no GUI...
[ardour.git] / gtk2_ardour / editor_tempodisplay.cc
index 048c0d2ccb86c43fa02c4c94a045124cf8fc4398..5f9293d4e249078bc95b52ebd2604b38a2a9f603 100644 (file)
 
 */
 
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
 #include <cstdio> // for sprintf, grrr
 #include <cstdlib>
 #include <cmath>
@@ -80,11 +84,15 @@ Editor::draw_metric_marks (const Metrics& metrics)
        for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
 
                if ((ms = dynamic_cast<const MeterSection*>(*i)) != 0) {
-                       snprintf (buf, sizeof(buf), "%g/%g", ms->beats_per_bar(), ms->note_divisor ());
+                       snprintf (buf, sizeof(buf), "%g/%g", ms->divisions_per_bar(), ms->note_divisor ());
                        metric_marks.push_back (new MeterMarker (*this, *meter_group, ARDOUR_UI::config()->canvasvar_MeterMarker.get(), buf,
                                                                 *(const_cast<MeterSection*>(ms))));
                } else if ((ts = dynamic_cast<const TempoSection*>(*i)) != 0) {
-                       snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute());
+                       if (Config->get_allow_non_quarter_pulse()) {
+                               snprintf (buf, sizeof (buf), "%.2f/%.0f", ts->beats_per_minute(), ts->note_type());
+                       } else {
+                               snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute());
+                       }
                        metric_marks.push_back (new TempoMarker (*this, *tempo_group, ARDOUR_UI::config()->canvasvar_TempoMarker.get(), buf,
                                                                 *(const_cast<TempoSection*>(ts))));
                }
@@ -94,7 +102,7 @@ Editor::draw_metric_marks (const Metrics& metrics)
 }
 
 void
-Editor::tempo_map_changed (const PropertyChange& ignored)
+Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
 {
        if (!_session) {
                return;
@@ -109,6 +117,7 @@ Editor::tempo_map_changed (const PropertyChange& ignored)
        compute_current_bbt_points(leftmost_frame, leftmost_frame + current_page_frames());
        _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
        redraw_measures ();
+       update_tempo_based_rulers ();
 }
 
 void
@@ -120,7 +129,6 @@ Editor::redisplay_tempo (bool immediate_redraw)
 
        compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames()); // redraw rulers and measures
 
-       compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames());
        if (immediate_redraw) {
                redraw_measures ();
        } else {
@@ -134,13 +142,13 @@ Editor::redisplay_tempo (bool immediate_redraw)
 }
 
 void
-Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost)
+Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost)
 {
        if (!_session) {
                return;
        }
 
-       BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
+       Timecode::BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
 
        _session->bbt_time(leftmost, previous_beat);
        _session->bbt_time(rightmost, next_beat);
@@ -153,7 +161,7 @@ Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost)
        }
        previous_beat.ticks = 0;
 
-       if (_session->tempo_map().meter_at(rightmost).beats_per_bar () > next_beat.beats + 1) {
+       if (_session->tempo_map().meter_at(rightmost).divisions_per_bar () > next_beat.beats + 1) {
                next_beat.beats += 1;
        } else {
                next_beat.bars += 1;
@@ -197,7 +205,7 @@ Editor::draw_measures ()
 }
 
 void
-Editor::mouse_add_new_tempo_event (nframes64_t frame)
+Editor::mouse_add_new_tempo_event (framepos_t frame)
 {
        if (_session == 0) {
                return;
@@ -220,7 +228,7 @@ Editor::mouse_add_new_tempo_event (nframes64_t frame)
        }
 
        double bpm = 0;
-       BBT_Time requested;
+       Timecode::BBT_Time requested;
 
        bpm = tempo_dialog.get_bpm ();
        double nt = tempo_dialog.get_note_type();
@@ -239,7 +247,7 @@ Editor::mouse_add_new_tempo_event (nframes64_t frame)
 }
 
 void
-Editor::mouse_add_new_meter_event (nframes64_t frame)
+Editor::mouse_add_new_meter_event (framepos_t frame)
 {
        if (_session == 0) {
                return;
@@ -267,7 +275,7 @@ Editor::mouse_add_new_meter_event (nframes64_t frame)
        bpb = max (1.0, bpb); // XXX is this a reasonable limit?
 
        double note_type = meter_dialog.get_note_type ();
-       BBT_Time requested;
+       Timecode::BBT_Time requested;
 
        meter_dialog.get_bbt_time (requested);
 
@@ -348,7 +356,7 @@ Editor::edit_tempo_section (TempoSection* section)
 
        double bpm = tempo_dialog.get_bpm ();
        double nt = tempo_dialog.get_note_type ();
-       BBT_Time when;
+       Timecode::BBT_Time when;
        tempo_dialog.get_bbt_time(when);
        bpm = max (0.01, bpm);