- vector<Adjustment*>::size_type asz;
- uint32_t npans = _panner->npanners();
-
- while (!pan_adjustments.empty()) {
- delete pan_bars.back();
- pan_bars.pop_back ();
- delete pan_adjustments.back();
- pan_adjustments.pop_back ();
- }
-
- while ((asz = pan_adjustments.size()) < npans) {
-
- float x, rx;
- PannerBar* bc;
-
- /* 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 */
-
- rx = _panner->pan_control( asz)->get_value();
-
- if (npans == 1) {
- x = 0.5;
- } else if (asz == 0) {
- x = 0.0;
- } else if (asz == 1) {
- x = 1.0;
- } else {
- x = rx;
- }
-
- pan_adjustments.push_back (new Adjustment (x, 0, 1.0, 0.005, 0.05));
- bc = new PannerBar (*pan_adjustments[asz],
- boost::static_pointer_cast<PBD::Controllable>( _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));
-
- _panner->pan_control( asz )->Changed.connect (bind (mem_fun(*this, &PannerUI::pan_value_changed), (uint32_t) asz));
-
-
- bc->set_name ("PanSlider");
- bc->set_shadow_type (Gtk::SHADOW_NONE);
-
- boost::shared_ptr<AutomationControl> ac = _panner->pan_control (asz);
-
- if (asz) {
- bc->StartGesture.connect (mem_fun (*ac, &AutomationControl::start_touch));
- bc->StopGesture.connect (mem_fun (*ac, &AutomationControl::stop_touch));
- }
-
- char buf[64];
- snprintf (buf, sizeof (buf), _("panner for channel %zu"), asz + 1);
- ARDOUR_UI::instance()->tooltips().set_tip (bc->event_widget(), buf);
-
- bc->event_widget().signal_button_release_event().connect
- (bind (mem_fun(*this, &PannerUI::pan_button_event), (uint32_t) asz));
-
- bc->set_size_request (-1, pan_bar_height);
-
- pan_bars.push_back (bc);
- pan_bar_packer.pack_start (*bc, false, false);
- }
+ if (nins == 2) {
+
+ /* add integrated 2in/2out panner GUI */
+
+ boost::shared_ptr<Pannable> pannable = _panner->pannable();
+
+ _stereo_panner = new StereoPanner (_panner);
+ _stereo_panner->set_size_request (-1, pan_bar_height);
+ pan_vbox.pack_start (*_stereo_panner, false, false);
+
+ boost::shared_ptr<AutomationControl> ac;
+
+ ac = pannable->pan_azimuth_control;
+ _stereo_panner->StartPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch),
+ boost::weak_ptr<AutomationControl> (ac)));
+ _stereo_panner->StopPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch),
+ boost::weak_ptr<AutomationControl>(ac)));
+
+ ac = pannable->pan_width_control;
+ _stereo_panner->StartWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch),
+ boost::weak_ptr<AutomationControl> (ac)));
+ _stereo_panner->StopWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch),
+ boost::weak_ptr<AutomationControl>(ac)));
+
+ } else if (nins == 1) {
+ /* 1-in/2out */
+
+ MonoPanner* mp;
+ boost::shared_ptr<Pannable> pannable = _panner->pannable();
+ boost::shared_ptr<AutomationControl> ac = pannable->pan_azimuth_control;
+
+ mp = new MonoPanner (ac);
+
+ mp->StartGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch),
+ boost::weak_ptr<AutomationControl> (ac)));
+ mp->StopGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch),
+ boost::weak_ptr<AutomationControl>(ac)));
+
+ mp->signal_button_release_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event));
+
+ mp->set_size_request (-1, pan_bar_height);
+
+ update_pan_sensitive ();
+ pan_vbox.pack_start (*mp, false, false);
+
+ } else {
+ warning << string_compose (_("No panner user interface is currently available for %1-in/2out tracks/busses"),
+ nins) << endmsg;
+ }