fixes from carl for #1158 and #1554, plus better behaviour when building the region...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 10 Apr 2007 14:42:11 +0000 (14:42 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 10 Apr 2007 14:42:11 +0000 (14:42 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1694 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui2.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/redirect_box.cc
libs/ardour/ardour/route.h
libs/ardour/route.cc

index 1e038e3ac7322bbe275904d914d062ae34b68057..0dab2657be4f0c3c07b42c7c203f4d55997a4232 100644 (file)
@@ -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);
index f80ec708ebee70178fc003a5c0493ab44989ce7c..c478f47bde0435b19a017c2b92db3d13d6f596fc 100644 (file)
@@ -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) {
index 2ab3b7af4af423c174f3ebeae99282368c45aed0..d3e616eb0bb5f9c3f6b9a5bc99f4b10b744cbc04 100644 (file)
@@ -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<string> choices;
 
        if (boost::dynamic_pointer_cast<AudioTrack>(_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);
        }
 }
 
index f3436ca8ea0b9532206f9aa786c22e3c86b46742..442c006e9b7c05ae209024a5753f9c65049e9117 100644 (file)
@@ -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; }
index edb7adfee0948f3ba888cfc6be77bccc8a42a210..091ff549adcf2f93c451a83ebf938237b4428b15 100644 (file)
@@ -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);
+               }
        }
 }