pay some attention to the special guest of the night: KDE window stacking
[ardour.git] / gtk2_ardour / audio_clock.cc
index 7e490b4fdcec6f936a051a3f0d301d1b897e111d..a453b80d16c9a06679d1edd01eff271b067a0118 100644 (file)
@@ -670,7 +670,7 @@ AudioClock::end_edit (bool modify)
 
                        case BBT:
                                if (is_duration) {
-                                       pos = frame_duration_from_bbt_string (0, edit_string);
+                                       pos = frame_duration_from_bbt_string (bbt_reference_time, edit_string);
                                } else {
                                        pos = frames_from_bbt_string (0, edit_string);
                                }
@@ -1228,7 +1228,7 @@ AudioClock::set_timecode (framepos_t when, bool /*force*/)
 void
 AudioClock::set_bbt (framepos_t when, framecnt_t offset, bool /*force*/)
 {
-       char buf[16];
+       char buf[64];
        Timecode::BBT_Time BBT;
        bool negative = false;
 
@@ -1254,56 +1254,41 @@ AudioClock::set_bbt (framepos_t when, framecnt_t offset, bool /*force*/)
                        BBT.ticks = 0;
                } else {
                        TempoMap& tmap (_session->tempo_map());
+
+                       if (offset == 0) {
+                               offset = bbt_reference_time;
+                       }
+
                        const double divisions = tmap.meter_section_at_frame (offset).divisions_per_bar();
+                       Timecode::BBT_Time sub_bbt;
 
                        if (negative) {
                                BBT = tmap.bbt_at_beat (tmap.beat_at_frame (offset));
-                               Timecode::BBT_Time when_bbt = tmap.bbt_at_frame (offset - when);
-
-                               BBT.bars -= when_bbt.bars;
-
-                               if (BBT.ticks < when_bbt.ticks) {
-                                       if (BBT.beats == 1) {
-                                               BBT.bars--;
-                                               BBT.beats = divisions;
-                                       } else {
-                                               BBT.beats--;
-                                       }
-                                       BBT.ticks = Timecode::BBT_Time::ticks_per_beat - (when_bbt.ticks - BBT.ticks);
-                               } else {
-                                       BBT.ticks -= when_bbt.ticks;
-                               }
-
-                               if (BBT.beats < when_bbt.beats) {
-                                       BBT.bars--;
-                                       BBT.beats = divisions - (when_bbt.beats - BBT.beats);
-                               } else {
-                                       BBT.beats -= when_bbt.beats;
-                               }
+                               sub_bbt = tmap.bbt_at_frame (offset - when);
                        } else {
                                BBT = tmap.bbt_at_beat (tmap.beat_at_frame (when + offset));
-                               Timecode::BBT_Time when_bbt = tmap.bbt_at_frame (offset);
+                               sub_bbt = tmap.bbt_at_frame (offset);
+                       }
 
-                               BBT.bars -= when_bbt.bars;
+                       BBT.bars -= sub_bbt.bars;
 
-                               if (BBT.ticks < when_bbt.ticks) {
-                                       if (BBT.beats == 1) {
-                                               BBT.bars--;
-                                               BBT.beats = divisions;
-                                       } else {
-                                               BBT.beats--;
-                                       }
-                                       BBT.ticks = Timecode::BBT_Time::ticks_per_beat - (when_bbt.ticks - BBT.ticks);
-                               } else {
-                                       BBT.ticks -= when_bbt.ticks;
-                               }
-
-                               if (BBT.beats < when_bbt.beats) {
+                       if (BBT.ticks < sub_bbt.ticks) {
+                               if (BBT.beats == 1) {
                                        BBT.bars--;
-                                       BBT.beats = divisions - (when_bbt.beats - BBT.beats);
+                                       BBT.beats = divisions;
                                } else {
-                                       BBT.beats -= when_bbt.beats;
+                                       BBT.beats--;
                                }
+                               BBT.ticks = Timecode::BBT_Time::ticks_per_beat - (sub_bbt.ticks - BBT.ticks);
+                       } else {
+                               BBT.ticks -= sub_bbt.ticks;
+                       }
+
+                       if (BBT.beats < sub_bbt.beats) {
+                               BBT.bars--;
+                               BBT.beats = divisions - (sub_bbt.beats - BBT.beats);
+                       } else {
+                               BBT.beats -= sub_bbt.beats;
                        }
                }
        } else {
@@ -1331,11 +1316,12 @@ AudioClock::set_bbt (framepos_t when, framecnt_t offset, bool /*force*/)
 
                TempoMetric m (_session->tempo_map().metric_at (pos));
 
-               sprintf (buf, "%-5.3f", _session->tempo_map().tempo_at_frame (pos).beats_per_minute());
+               snprintf (buf, sizeof(buf), "%-5.3f/%f", _session->tempo_map().tempo_at_frame (pos).note_types_per_minute(), m.tempo().note_type());
+               /* XXX this doesn't fit inside the container. */
                _left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
                                                          INFO_FONT_SIZE, buf, _("Tempo")));
 
-               sprintf (buf, "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor());
+               snprintf (buf, sizeof(buf), "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor());
                _right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
                                                           INFO_FONT_SIZE, buf, _("Meter")));
        }