remove SoloBus solo model, add PFL and AFL. basic testing indicates it works, but...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 17 Jun 2009 19:30:54 +0000 (19:30 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 17 Jun 2009 19:30:54 +0000 (19:30 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5210 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/rc_option_editor.cc
libs/ardour/ardour/route.h
libs/ardour/ardour/session.h
libs/ardour/ardour/types.h
libs/ardour/enums.cc
libs/ardour/route.cc
libs/ardour/session.cc
libs/ardour/session_state.cc

index 390ebe92de0a4faa7badd4d7538ffa60789d899b..2f232d37c48fe8672ac06e551bb4ee4edae3e1ae 100644 (file)
@@ -1090,7 +1090,8 @@ RCOptionEditor::RCOptionEditor ()
                );
 
        sm->add (SoloInPlace, _("in place"));
-       sm->add (SoloBus, _("via bus"));
+       sm->add (SoloAFL, _("post-fader listen via monitor bus"));
+       sm->add (SoloPFL, _("pre-fader listen via monitor bus"));
 
        add_option (_("Audio"), sm);
 
index 122927ff7d9ae4d32acdfa18515e0054d732bec9..f34c4d3d2006feb93b8926e4a5bbfe922334df21 100644 (file)
@@ -197,6 +197,7 @@ class Route : public SessionObject, public AutomatableControls
        boost::shared_ptr<Send>           internal_send_for (boost::shared_ptr<const Route> target) const;
        BufferSet* get_return_buffer () const;
        void release_return_buffer () const;
+       void put_control_outs_at (Placement);
 
        /** A record of the stream configuration at some point in the processor list.
         * Used to return where and why an processor list configuration request failed.
index e970d6e9e41f510ee323889b64b33f48ba3209cc..b2486982420684db803914d60a0f910d7e16e313 100644 (file)
@@ -1465,6 +1465,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void route_solo_changed (void *src, boost::weak_ptr<Route>);
        void catch_up_on_solo ();
        void catch_up_on_solo_mute_override ();
+       void solo_model_changed ();
        void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
        void modify_solo_mute (bool, bool);
        void strip_portname_for_solo (std::string& portname);
index 874a3f7ca0ef6f4a800571fbf24678eeaf4e9d5a..306792816187c5850dbf4554326e919fa10c29ce 100644 (file)
@@ -332,7 +332,8 @@ namespace ARDOUR {
 
        enum SoloModel {
                SoloInPlace,
-               SoloBus
+               SoloAFL,
+               SoloPFL
        };
 
        enum AutoConnectOption {
index 94878bc97e5465549443e5bd09d6c2debb99d5bf..7410d8ef8cc8332181bc84d78c426cf115bcfff5 100644 (file)
@@ -229,7 +229,8 @@ setup_enum_writer ()
        REGISTER (_LayerModel);
 
        REGISTER_ENUM (SoloInPlace);
-       REGISTER_ENUM (SoloBus);
+       REGISTER_ENUM (SoloAFL);
+       REGISTER_ENUM (SoloPFL);
        REGISTER (_SoloModel);
 
        REGISTER_ENUM (AutoConnectPhysical);
index c3e586227074da558acbbeadd66309b632f08522..b2c3d27766332de12ebbd7f50b6a3414e37326bf 100644 (file)
@@ -522,7 +522,8 @@ Route::mod_solo_level (int32_t delta)
                }
                break;
 
-       case SoloBus:
+       case SoloAFL:
+       case SoloPFL:
                /* control outs are used for soloing */
                if (_control_outs) {
                        _control_outs->set_solo_level (_solo_level);
@@ -558,7 +559,8 @@ Route::set_solo_isolated (bool yn, void *src)
                                _main_outs->set_solo_isolated (false);
                        }
                        break;
-               case SoloBus:
+               case SoloAFL:
+               case SoloPFL:
                        if (_control_outs) {
                                _control_outs->set_solo_level (_solo_level);
                                _control_outs->set_solo_isolated (_solo_isolated);
@@ -2287,6 +2289,38 @@ Route::set_meter_point (MeterPoint p, void *src)
                _session.set_dirty ();
        }
 }
+void
+Route::put_control_outs_at (Placement p)
+{
+       if (!_control_outs) {
+               return;
+       }
+
+       // Move meter in the processors list
+       ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
+       _processors.erase(loc);
+
+       switch (p) {
+       case PreFader:
+               loc = find(_processors.begin(), _processors.end(), _amp);
+               if (loc != _processors.begin()) {
+                       --loc;
+               }
+               break;
+       case PostFader:
+               loc = find(_processors.begin(), _processors.end(), _amp);
+               assert (loc != _processors.end());
+               loc++;
+               break;
+       }
+
+       _processors.insert(loc, _control_outs);
+
+       cerr << _name << " moved control outs to " << enum_2_string (p) << endl;
+
+       processors_changed (); /* EMIT SIGNAL */
+       _session.set_dirty ();
+}
 
 nframes_t
 Route::update_total_latency ()
index e87f315a24ed06341483be1de929e4f5d4bcf879..23c6ce89c1c577cd7f3344af366ef36dd0e7a3f0 100644 (file)
@@ -4218,3 +4218,28 @@ Session::update_have_rec_enabled_diskstream ()
                RecordStateChanged (); /* EMIT SIGNAL */
        }
 }
+
+void
+Session::solo_model_changed ()
+{
+       Placement p;
+
+       switch (Config->get_solo_model()) {
+       case SoloInPlace:
+               return;
+               
+       case SoloAFL:
+               p = PostFader;
+               break;
+
+       case SoloPFL:
+               p = PreFader;
+               break;
+       }
+
+       boost::shared_ptr<RouteList> r = routes.reader ();
+
+       for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+               (*i)->put_control_outs_at (p);
+       }
+}
index f11342a0fd58891b8c942ffeef99f887ae23011c..3893b0a98cbe0411d8251b57c0d5fc9a0df86f23 100644 (file)
@@ -3211,6 +3211,8 @@ Session::config_changed (std::string p, bool ours)
                }
        } else if (p == "solo-mute-override") {
                // catch_up_on_solo_mute_override ();
+       } else if (p == "solo-model") {
+               solo_model_changed ();
        }
 
        set_dirty ();