Apply panners/automation patch from torbenh (Panner is-a Processor).
[ardour.git] / gtk2_ardour / panner_ui.cc
index d65d02f92ef5fddbbe0932d912e23e660f335471..2be7be73ed43398c0fe38449d21bf05858837939 100644 (file)
@@ -85,7 +85,7 @@ PannerUI::PannerUI (boost::shared_ptr<IO> io, Session& s)
        pan_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
 
        using namespace Menu_Helpers;
-       pan_astate_menu.items().push_back (MenuElem (_("Off"), 
+       pan_astate_menu.items().push_back (MenuElem (_("Manual"), 
                                                     bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Off)));
        pan_astate_menu.items().push_back (MenuElem (_("Play"),
                                                     bind (mem_fun (_io->panner(), &Panner::set_automation_state), (AutoState) Play)));
@@ -150,6 +150,26 @@ PannerUI::PannerUI (boost::shared_ptr<IO> io, Session& s)
        update_pan_sensitive ();
        update_pan_linkage ();
        pan_automation_state_changed ();
+
+       pan_bar_packer.show();
+       panning_viewport.show();
+       panning_up.show();
+       panning_up_arrow.show();
+       panning_down.show();
+       panning_down_arrow.show();
+       pan_vbox.show();
+       panning_link_button.show();
+       panning_link_direction_button.show();
+       panning_link_box.show();
+       pan_automation_style_button.show();
+       pan_automation_state_button.show();
+       show();
+}
+
+boost::shared_ptr<PBD::Controllable>
+PannerUI::get_controllable() 
+{ 
+       return pan_bars[0]->get_controllable();
 }
 
 bool
@@ -263,7 +283,7 @@ PannerUI::update_pan_state ()
 void
 PannerUI::setup_pan ()
 {
-       uint32_t nouts = _io->n_outputs ();
+       uint32_t nouts = _io->n_outputs ().n_audio();
 
        if (nouts == 0 || nouts == 1) {
 
@@ -274,10 +294,17 @@ PannerUI::setup_pan ()
                        pan_adjustments.pop_back ();
                }
 
+               /* stick something into the panning viewport so that it redraws */
+
+               EventBox* eb = manage (new EventBox());
+               panning_viewport.remove ();
+               panning_viewport.add (*eb);
+               panning_viewport.show_all ();
+
        } else if (nouts == 2) {
 
                vector<Adjustment*>::size_type asz;
-               uint32_t npans = _io->panner().size();
+               uint32_t npans = _io->panner().npanners();
 
                while (!pan_adjustments.empty()) {
                        delete pan_bars.back();
@@ -294,7 +321,7 @@ PannerUI::setup_pan ()
                        /* initialize adjustment with 0.0 (L) or 1.0 (R) for the first and second panners,
                           which serves as a default, otherwise use current value */
 
-                       _io->panner()[asz]->get_position (rx);
+                       rx = _io->panner().pan_control( asz)->get_value();
 
                        if (npans == 1) {
                                x = 0.5;
@@ -307,13 +334,14 @@ PannerUI::setup_pan ()
                        }
 
                        pan_adjustments.push_back (new Adjustment (x, 0, 1.0, 0.05, 0.1));
-                       bc = new PannerBar (*pan_adjustments[asz], _io->panner()[asz]->control());
+                       bc = new PannerBar (*pan_adjustments[asz],
+                               boost::static_pointer_cast<PBD::Controllable>( _io->panner().pan_control( asz )) );
 
                        /* now set adjustment with current value of panner, then connect the signals */
                        pan_adjustments.back()->set_value(rx);
                        pan_adjustments.back()->signal_value_changed().connect (bind (mem_fun(*this, &PannerUI::pan_adjustment_changed), (uint32_t) asz));
 
-                       _io->panner()[asz]->Changed.connect (bind (mem_fun(*this, &PannerUI::pan_value_changed), (uint32_t) asz));
+                       _io->panner().pan_control( asz )->Changed.connect (bind (mem_fun(*this, &PannerUI::pan_value_changed), (uint32_t) asz));
 
                        
                        bc->set_name ("PanSlider");
@@ -355,7 +383,7 @@ PannerUI::setup_pan ()
                }
                
                update_pan_sensitive ();
-               panner->reset (_io->n_inputs());
+               panner->reset (_io->n_inputs().n_audio());
                panner->set_size_request (-1, 61);
 
                /* and finally, add it to the panner frame */
@@ -398,7 +426,7 @@ PannerUI::build_pan_menu (uint32_t which)
        
        /* set state first, connect second */
 
-       (dynamic_cast<CheckMenuItem*> (&items.back()))->set_active (_io->panner()[which]->muted());
+       (dynamic_cast<CheckMenuItem*> (&items.back()))->set_active (_io->panner().streampanner(which).muted());
        (dynamic_cast<CheckMenuItem*> (&items.back()))->signal_toggled().connect
                (bind (mem_fun(*this, &PannerUI::pan_mute), which));
 
@@ -418,8 +446,8 @@ PannerUI::build_pan_menu (uint32_t which)
 void
 PannerUI::pan_mute (uint32_t which)
 {
-       StreamPanner* sp = _io->panner()[which];
-       sp->set_muted (!sp->muted());
+       StreamPanner& sp = _io->panner().streampanner(which);
+       sp.set_muted (!sp.muted());
 }
 
 void
@@ -442,7 +470,7 @@ PannerUI::effective_pan_display ()
                return;
        }
 
-       switch (_io->n_outputs()) {
+       switch (_io->n_outputs().n_audio()) {
        case 0: 
        case 1:
                /* relax */
@@ -453,7 +481,7 @@ PannerUI::effective_pan_display ()
                break;
 
        default:
-                //panner->move_puck (pan_value (v, right), 0.5);
+               //panner->move_puck (pan_value (v, right), 0.5);
                break;
        }
 }
@@ -465,7 +493,7 @@ PannerUI::pan_changed (void *src)
                return;
        }
 
-       switch (_io->panner().size()) {
+       switch (_io->panner().npanners()) {
        case 0:
                panning_link_direction_button.set_sensitive (false);
                panning_link_button.set_sensitive (false);
@@ -479,7 +507,7 @@ PannerUI::pan_changed (void *src)
                panning_link_button.set_sensitive (true);
        }
 
-       uint32_t nouts = _io->n_outputs();
+       uint32_t nouts = _io->n_outputs().n_audio();
 
        switch (nouts) {
        case 0:
@@ -500,11 +528,11 @@ PannerUI::pan_changed (void *src)
 void
 PannerUI::pan_adjustment_changed (uint32_t which)
 {
-       if (!in_pan_update && which < _io->panner().size()) {
+       if (!in_pan_update && which < _io->panner().npanners()) {
 
                float xpos;
                float val = pan_adjustments[which]->get_value ();
-               _io->panner()[which]->get_position (xpos);
+               xpos = _io->panner().pan_control( which )->get_value();
 
                /* add a kinda-sorta detent for the middle */
                
@@ -521,7 +549,7 @@ PannerUI::pan_adjustment_changed (uint32_t which)
                
                if (!Panner::equivalent (val, xpos)) {
 
-                       _io->panner()[which]->set_position (val);
+                       _io->panner().streampanner(which).set_position (val);
                        /* XXX 
                           the panner objects have no access to the session,
                           so do this here. ick.
@@ -536,11 +564,11 @@ PannerUI::pan_value_changed (uint32_t which)
 {
        ENSURE_GUI_THREAD (bind (mem_fun(*this, &PannerUI::pan_value_changed), which));
                                                           
-       if (_io->n_outputs() > 1 && which < _io->panner().size()) {
+       if (_io->n_outputs().n_audio() > 1 && which < _io->panner().npanners()) {
                float xpos;
                float val = pan_adjustments[which]->get_value ();
 
-               _io->panner()[which]->get_position (xpos);
+               _io->panner().streampanner(which).get_position (xpos);
 
                if (!Panner::equivalent (val, xpos)) {
                        in_pan_update = true;
@@ -566,14 +594,14 @@ PannerUI::update_pan_bars (bool only_if_aplay)
                float xpos, val;
 
                if (only_if_aplay) {
-                       AutomationList& alist (_io->panner()[n]->automation());
+                       boost::shared_ptr<AutomationList> alist (_io->panner().streampanner(n).pan_control()->alist());
                        
-                       if (!alist.automation_playback()) {
+                       if (!alist->automation_playback()) {
                                continue;
                        }
                }
 
-               _io->panner()[n]->get_effective_position (xpos);
+               _io->panner().streampanner(n).get_effective_position (xpos);
                val = (*i)->get_value ();
                
                if (!Panner::equivalent (val, xpos)) {
@@ -606,7 +634,7 @@ PannerUI::update_pan_sensitive ()
 {
        bool sensitive = !(_io->panner().automation_state() & Play);
 
-       switch (_io->n_outputs()) {
+       switch (_io->n_outputs().n_audio()) {
        case 0:
        case 1:
                break;
@@ -700,7 +728,7 @@ PannerUI::pan_automation_state_changed ()
                return;
        }
 
-       x = (_io->panner().front()->automation().automation_state() != Off);
+       x = (_io->panner().streampanner(0).pan_control()->alist()->automation_state() != Off);
 
        if (pan_automation_state_button.get_active() != x) {
        ignore_toggle = true;
@@ -738,7 +766,7 @@ PannerUI::_astate_string (AutoState state, bool shrt)
 
        switch (state) {
        case Off:
-               sstr = (shrt ? "O" : _("O"));
+               sstr = (shrt ? "M" : _("M"));
                break;
        case Play:
                sstr = (shrt ? "P" : _("P"));