From b286b45ea849b544107e7f03916519b7b00114c3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 27 Nov 2012 22:48:59 +0000 Subject: [PATCH] adjust the way we use a pair of iterators into the tempo map so that the iterators are always local to the scope where they are used, which fixes at least one tempo-map related crash; also fix correct setting of join-object-range parameter, where the property wasn't actually used git-svn-id: svn://localhost/ardour2/branches/3.0@13559 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 33 +++++++++++++------ gtk2_ardour/editor.h | 18 +++++++---- gtk2_ardour/editor_rulers.cc | 52 +++++++++++++++++------------- gtk2_ardour/editor_tempodisplay.cc | 36 +++++++++++++++------ 4 files changed, 90 insertions(+), 49 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index dcb0dcc835..00a2e8b900 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2107,10 +2107,17 @@ Editor::set_snap_to (SnapType st) case SnapToBeatDiv5: case SnapToBeatDiv4: case SnapToBeatDiv3: - case SnapToBeatDiv2: - compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_frames()); - update_tempo_based_rulers (); + case SnapToBeatDiv2: { + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), + current_bbt_points_begin, current_bbt_points_end); + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_frames(), + current_bbt_points_begin, current_bbt_points_end); + update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); break; + } case SnapToRegionStart: case SnapToRegionEnd: @@ -2317,6 +2324,7 @@ Editor::set_state (const XMLNode& node, int /*version*/) if ((prop = node.property ("join-object-range"))) { RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object-range")); + bool yn = string_is_affirmative (prop->value()); if (act) { RefPtr tact = RefPtr::cast_dynamic(act); tact->set_active (!yn); @@ -3653,9 +3661,10 @@ Editor::set_show_measures (bool yn) hide_measures (); if ((_show_measures = yn) == true) { - if (tempo_lines) + if (tempo_lines) { tempo_lines->show(); - draw_measures (); + } + (void) redraw_measures (); } instant_save (); } @@ -4261,9 +4270,15 @@ Editor::idle_visual_changer () set_frames_per_unit (pending_visual_change.frames_per_unit); compute_fixed_ruler_scale (); - compute_current_bbt_points(pending_visual_change.time_origin, pending_visual_change.time_origin + current_page_frames()); - compute_bbt_ruler_scale (pending_visual_change.time_origin, pending_visual_change.time_origin + current_page_frames()); - update_tempo_based_rulers (); + + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; + + compute_current_bbt_points (pending_visual_change.time_origin, pending_visual_change.time_origin + current_page_frames(), + current_bbt_points_begin, current_bbt_points_end); + compute_bbt_ruler_scale (pending_visual_change.time_origin, pending_visual_change.time_origin + current_page_frames(), + current_bbt_points_begin, current_bbt_points_end); + update_tempo_based_rulers (current_bbt_points_end, current_bbt_points_begin); } if (p & VisualChange::TimeOrigin) { set_horizontal_position (pending_visual_change.time_origin / frames_per_unit); @@ -5300,8 +5315,6 @@ Editor::session_going_away () stop_step_editing (); - current_bbt_points_begin = current_bbt_points_end; - /* get rid of any existing editor mixer strip */ WindowTitle title(Glib::get_application_name()); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 113ddcf377..086b5ed5b8 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -809,7 +809,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void update_just_timecode (); void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers void update_fixed_rulers (); - void update_tempo_based_rulers (); + void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end); void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem); void update_ruler_visibility (); void set_ruler_visible (RulerType, bool); @@ -873,7 +874,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD gint bbt_nmarks; uint32_t bbt_bar_helper_on; uint32_t bbt_accent_modulo; - void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper); + void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper, + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin, + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end); gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint); gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); @@ -1478,15 +1481,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /// true if we are in fullscreen mode bool _maximised; - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - TempoLines* tempo_lines; ArdourCanvas::Group* time_line_group; void hide_measures (); - void draw_measures (); + void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end); bool redraw_measures (); void new_tempo_section (); @@ -1551,7 +1552,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void remove_metric_marks (); void draw_metric_marks (const ARDOUR::Metrics& metrics); - void compute_current_bbt_points (framepos_t left, framepos_t right); + void compute_current_bbt_points (framepos_t left, framepos_t right, + ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end); + void tempo_map_changed (const PBD::PropertyChange&); void redisplay_tempo (bool immediate_redraw); diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 8cc7b20416..0cfbcdfaa4 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -847,7 +847,8 @@ Editor::update_fixed_rulers () } void -Editor::update_tempo_based_rulers () +Editor::update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { if (_session == 0) { return; @@ -1146,7 +1147,9 @@ Editor::metric_get_timecode (GtkCustomRulerMark **marks, gdouble lower, gdouble void -Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) +Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper, + ARDOUR::TempoMap::BBTPointList::const_iterator begin, + ARDOUR::TempoMap::BBTPointList::const_iterator end) { if (_session == 0) { return; @@ -1237,18 +1240,18 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) break; } - if (distance (current_bbt_points_begin, current_bbt_points_end) == 0) { + if (distance (begin, end) == 0) { return; } - i = current_bbt_points_end; + i = end; i--; - if ((*i).beat >= (*current_bbt_points_begin).beat) { - bbt_bars = (*i).bar - (*current_bbt_points_begin).bar; + if ((*i).beat >= (*begin).beat) { + bbt_bars = (*i).bar - (*begin).bar; } else { - bbt_bars = (*i).bar - (*current_bbt_points_begin).bar - 1; + bbt_bars = (*i).bar - (*begin).bar - 1; } - beats = distance (current_bbt_points_begin, current_bbt_points_end) - bbt_bars; + beats = distance (begin, end) - bbt_bars; /* Only show the bar helper if there aren't many bars on the screen */ if ((bbt_bars < 2) || (beats < 5)) { @@ -1279,7 +1282,7 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) } gint -Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upper*/, gint /*maxchars*/) +Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint /*maxchars*/) { if (_session == 0) { return 0; @@ -1304,14 +1307,19 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp bool i_am_accented = false; bool helper_active = false; - if (distance (current_bbt_points_begin, current_bbt_points_end) == 0) { + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (lower, upper, begin, end); + + if (distance (begin, end) == 0) { return 0; } switch (bbt_ruler_scale) { case bbt_show_beats: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = beats + 2; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); @@ -1320,7 +1328,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1347,7 +1355,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1357,7 +1365,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1437,7 +1445,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks_detail: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1447,7 +1455,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1532,7 +1540,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks_super_detail: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1542,7 +1550,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1639,7 +1647,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_64: bbt_nmarks = (gint) (bbt_bars / 64) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 64 == 1) { if ((*i).bar % 256 == 1) { @@ -1664,7 +1672,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_16: bbt_nmarks = (bbt_bars / 16) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 16 == 1) { if ((*i).bar % 64 == 1) { @@ -1689,7 +1697,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_4: bbt_nmarks = (bbt_bars / 4) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; ++i) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; ++i) { if ((*i).is_bar()) { if ((*i).bar % 4 == 1) { if ((*i).bar % 16 == 1) { @@ -1715,7 +1723,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp // default: bbt_nmarks = bbt_bars + 2; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks ); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 4 == 1) { snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar); diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 005e7ff6fd..97f1d2e2d3 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -114,10 +114,13 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/) tempo_lines->tempo_map_changed(); } - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames()); + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), begin, end); _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers redraw_measures (); - update_tempo_based_rulers (); + update_tempo_based_rulers (begin, end); } void @@ -127,7 +130,12 @@ Editor::redisplay_tempo (bool immediate_redraw) return; } - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames()); // redraw rulers and measures + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), + current_bbt_points_begin, current_bbt_points_begin); + if (immediate_redraw) { redraw_measures (); @@ -138,11 +146,13 @@ Editor::redisplay_tempo (bool immediate_redraw) Glib::signal_idle().connect (sigc::mem_fun (*this, &Editor::redraw_measures)); #endif } - update_tempo_based_rulers (); // redraw rulers and measures + update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); // redraw rulers and measures } void -Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost) +Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost, + ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { if (!_session) { return; @@ -151,7 +161,7 @@ Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost) /* prevent negative values of leftmost from creeping into tempomap */ - _session->tempo_map().get_grid (current_bbt_points_begin, current_bbt_points_end, max (leftmost, (framepos_t) 0), rightmost); + _session->tempo_map().get_grid (begin, end, max (leftmost, (framepos_t) 0), rightmost); } void @@ -164,14 +174,20 @@ Editor::hide_measures () bool Editor::redraw_measures () { - draw_measures (); + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), begin, end); + draw_measures (begin, end); + return false; } void -Editor::draw_measures () +Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { - if (_session == 0 || _show_measures == false || distance (current_bbt_points_begin, current_bbt_points_end) == 0) { + if (_session == 0 || _show_measures == false || distance (begin, end) == 0) { return; } @@ -179,7 +195,7 @@ Editor::draw_measures () tempo_lines = new TempoLines(*track_canvas, time_line_group, physical_screen_height(get_window())); } - tempo_lines->draw (current_bbt_points_begin, current_bbt_points_end, frames_per_unit); + tempo_lines->draw (begin, end, frames_per_unit); } void