From a588b517e8625f758bedc66d6a7da12e8f6169c9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 10 Apr 2007 14:42:11 +0000 Subject: [PATCH] fixes from carl for #1158 and #1554, plus better behaviour when building the region boundary cache git-svn-id: svn://localhost/ardour2/trunk@1694 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui2.cc | 2 +- gtk2_ardour/editor_ops.cc | 9 --------- gtk2_ardour/redirect_box.cc | 24 +++++++++++++++++------- libs/ardour/ardour/route.h | 4 ++-- libs/ardour/route.cc | 37 ++++++++++++++++++++++++++++--------- 5 files changed, 48 insertions(+), 28 deletions(-) diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 1e038e3ac7..0dab2657be 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -606,7 +606,7 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev) shuttle_grabbed = false; shuttle_box.remove_modal_grab (); if (Config->get_shuttle_behaviour() == Sprung) { - if (Config->get_auto_play() || roll_button.get_state()) { + if (Config->get_auto_play() || session->transport_rolling()) { shuttle_fract = SHUTTLE_FRACT_SPEED1; session->request_transport_speed (1.0); stop_button.set_visual_state (0); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index f80ec708eb..c478f47bde 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -500,15 +500,6 @@ Editor::build_region_boundary_cache () break; } - } else if (clicked_trackview) { - - TrackViewList t; - t.push_back (clicked_trackview); - - if ((r = find_next_region (pos, point, 1, t, &ontrack)) == 0) { - break; - } - } else { if ((r = find_next_region (pos, point, 1, track_views, &ontrack)) == 0) { diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 2ab3b7af4a..d3e616eb0b 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -957,21 +957,31 @@ could not match the configuration of this track."); void RedirectBox::all_redirects_active (bool state) { - _route->all_redirects_active (state); + _route->all_redirects_active (_placement, state); } void -RedirectBox::clear_redirects() +RedirectBox::clear_redirects () { string prompt; vector choices; if (boost::dynamic_pointer_cast(_route) != 0) { - prompt = _("Do you really want to remove all redirects from this track?\n" - "(this cannot be undone)"); + if (_placement == PreFader) { + prompt = _("Do you really want to remove all pre-fader redirects from this track?\n" + "(this cannot be undone)"); + } else { + prompt = _("Do you really want to remove all post-fader redirects from this track?\n" + "(this cannot be undone)"); + } } else { - prompt = _("Do you really want to remove all redirects from this bus?\n" - "(this cannot be undone)"); + if (_placement == PreFader) { + prompt = _("Do you really want to remove all pre-fader redirects from this bus?\n" + "(this cannot be undone)"); + } else { + prompt = _("Do you really want to remove all post-fader redirects from this bus?\n" + "(this cannot be undone)"); + } } choices.push_back (_("Cancel")); @@ -980,7 +990,7 @@ RedirectBox::clear_redirects() Gtkmm2ext::Choice prompter (prompt, choices); if (prompter.run () == 1) { - _route->clear_redirects (this); + _route->clear_redirects (_placement, this); } } diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index f3436ca8ea..442c006e9b 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -169,9 +169,9 @@ class Route : public IO int copy_redirects (const Route&, Placement, uint32_t* err_streams = 0); int sort_redirects (uint32_t* err_streams = 0); - void clear_redirects (void *src); + void clear_redirects (Placement, void *src); void all_redirects_flip(); - void all_redirects_active (bool state); + void all_redirects_active (Placement, bool state); virtual nframes_t update_total_latency(); nframes_t signal_latency() const { return _own_latency; } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index edb7adfee0..091ff549ad 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -112,7 +112,8 @@ Route::init () Route::~Route () { - clear_redirects (this); + clear_redirects (PreFader, this); + clear_redirects (PostFader, this); for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) { free ((void*)(i->first)); @@ -924,10 +925,13 @@ Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_strea return 0; } +/** Remove redirects with a given placement. + * @param p Placement of redirects to remove. + */ void -Route::clear_redirects (void *src) +Route::clear_redirects (Placement p, void *src) { - uint32_t old_rmo = redirect_max_outs; + const uint32_t old_rmo = redirect_max_outs; if (!_session.engine().connected()) { return; @@ -935,13 +939,22 @@ Route::clear_redirects (void *src) { Glib::RWLock::WriterLock lm (redirect_lock); - RedirectList::iterator i; - for (i = _redirects.begin(); i != _redirects.end(); ++i) { - (*i)->drop_references (); + RedirectList new_list; + + for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { + if ((*i)->placement() == p) { + /* it's the placement we want to get rid of */ + (*i)->drop_references (); + } else { + /* it's a different placement, so keep it */ + new_list.push_back (*i); + } } - _redirects.clear (); + + _redirects = new_list; } + /* FIXME: can't see how this test can ever fire */ if (redirect_max_outs != old_rmo) { reset_panner (); } @@ -1309,8 +1322,12 @@ Route::all_redirects_flip () } } +/** Set all redirects with a given placement to a given active state. + * @param p Placement of redirects to change. + * @param state New active state for those redirects. + */ void -Route::all_redirects_active (bool state) +Route::all_redirects_active (Placement p, bool state) { Glib::RWLock::ReaderLock lm (redirect_lock); @@ -1319,7 +1336,9 @@ Route::all_redirects_active (bool state) } for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { - (*i)->set_active (state, this); + if ((*i)->placement() == p) { + (*i)->set_active (state, this); + } } }