diff --git a/gtk2_ardour/foldback_strip.cc b/gtk2_ardour/foldback_strip.cc index 56c1cae126..de3834d13c 100644 --- a/gtk2_ardour/foldback_strip.cc +++ b/gtk2_ardour/foldback_strip.cc @@ -84,7 +84,11 @@ FoldbackSend::FoldbackSend (boost::shared_ptr snd, \ _button.set_fallthrough_to_parent(true); _button.set_led_left (true); _button.signal_led_clicked.connect (sigc::mem_fun (*this, &FoldbackSend::led_clicked)); - _button.set_name ("processor prefader"); + if (_send_proc->get_pre_fader ()) { + _button.set_name ("processor prefader"); + } else { + _button.set_name ("processor postfader"); + } _button.set_layout_ellipsize_width (PX_SCALE(_width) * PANGO_SCALE); _button.set_text_ellipsize (Pango::ELLIPSIZE_END); name_changed (); @@ -259,6 +263,15 @@ FoldbackSend::build_send_menu () items.push_back ( MenuElem(_("Set send gain to 0dB"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_gain), 1.0)) ); + if (_send_proc->get_pre_fader ()) { + items.push_back ( + MenuElem(_("Set send post fader"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_send_position), true)) + ); + } else { + items.push_back ( + MenuElem(_("Set send pre fader"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_send_position), false)) + ); + } items.push_back (MenuElem(_("Remove This Send"), sigc::mem_fun (*this, &FoldbackSend::remove_me))); return menu; @@ -281,6 +294,41 @@ FoldbackSend::set_gain (float new_gain) } +void +FoldbackSend::set_send_position (bool post) +{ + boost::shared_ptr new_snd_rt = _send_route; + boost::shared_ptr new_fb_rt = _foldback_route; + float new_level = _send->gain_control()->get_value(); + bool new_enable = _send_proc->enabled (); + bool is_pan = false; + float new_pan = 0.0; + if (_foldback_route->input()->n_ports().n_audio() == 2) { + is_pan = true; + boost::shared_ptr pannable = _send_del->panner()->pannable(); + boost::shared_ptr ac; + ac = pannable->pan_azimuth_control; + new_pan = ac->get_value(); + } + + remove_me (); + new_snd_rt->add_foldback_send (new_fb_rt, post); + + boost::shared_ptr snd = new_snd_rt->internal_send_for (new_fb_rt); + if (snd) { + snd->gain_control()->set_value(new_level, Controllable::NoGroup); + boost::shared_ptr snd_proc = boost::dynamic_pointer_cast (snd); + snd_proc->enable (new_enable); + if (is_pan) { + boost::shared_ptr new_del = boost::dynamic_pointer_cast (snd); + boost::shared_ptr pannable = new_del->panner()->pannable(); + boost::shared_ptr ac; + ac = pannable->pan_azimuth_control; + ac->set_value(new_pan, Controllable::NoGroup); + } + } +} + void FoldbackSend::remove_me () { @@ -416,7 +464,7 @@ FoldbackStrip::init () global_vpacker.set_border_width (1); global_vpacker.set_spacing (2); - // Packing is from top down to the send box. Thje send box + // Packing is from top down to the send box. The send box // needs the most room and takes all left over space // Everything below the send box is packed from the bottom up // the panner is the last thing to pack as it doesn't always show @@ -1586,20 +1634,17 @@ FoldbackStrip::ab_plugins () } void -FoldbackStrip::create_selected_sends (bool include_buses) +FoldbackStrip::create_selected_sends (bool post_fader) { boost::shared_ptr slist (new StripableList); - PresentationInfo::Flag fl = PresentationInfo::AudioTrack; - if (include_buses) { - fl = PresentationInfo::MixerRoutes; - } + PresentationInfo::Flag fl = PresentationInfo::MixerRoutes; _session->get_stripables (*slist, fl); for (StripableList::iterator i = (*slist).begin(); i != (*slist).end(); ++i) { if ((*i)->is_selected() && !(*i)->is_master() && !(*i)->is_monitor()) { boost::shared_ptr rt = boost::dynamic_pointer_cast(*i); if (rt) { - rt->add_foldback_send (_route); + rt->add_foldback_send (_route, post_fader); } } } @@ -1627,11 +1672,11 @@ FoldbackStrip::build_sends_menu () menu->set_name ("ArdourContextMenu"); items.push_back ( - MenuElem(_("Assign selected tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), false)) + MenuElem(_("Assign selected tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), false)) ); items.push_back ( - MenuElem(_("Assign selected tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), true))); + MenuElem(_("Assign selected tracks and buses (postfader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), true))); items.push_back (MenuElem(_("Copy track/bus gains to sends"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_from_track))); items.push_back (MenuElem(_("Set sends gain to -inf"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_to_zero))); @@ -1664,7 +1709,9 @@ FoldbackStrip::duplicate_current_fb () if (i->sends_only) { boost::shared_ptr rt (i->r.lock()); boost::shared_ptr old_snd = rt->internal_send_for (old_fb); - rt->add_foldback_send (new_fb); + boost::shared_ptr old_proc = old_snd; + bool old_pre = old_proc->get_pre_fader (); + rt->add_foldback_send (new_fb, !old_pre); if (old_snd) { float old_gain = old_snd->gain_control()->get_value (); boost::shared_ptr new_snd = rt->internal_send_for (new_fb); diff --git a/gtk2_ardour/foldback_strip.h b/gtk2_ardour/foldback_strip.h index a4902cb8c7..5de7338542 100644 --- a/gtk2_ardour/foldback_strip.h +++ b/gtk2_ardour/foldback_strip.h @@ -94,6 +94,7 @@ private: gboolean button_press (GdkEventButton*); Gtk::Menu* build_send_menu (); void set_gain (float new_gain); + void set_send_position (bool post); void remove_me (); void route_property_changed (const PBD::PropertyChange&); diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 25b58b7f25..ff0885654b 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -2821,7 +2821,7 @@ ProcessorBox::choose_aux (boost::weak_ptr wr) } if (target->is_foldbackbus ()) { - _route->add_foldback_send (target); + _route->add_foldback_send (target, false); } else { _session->add_internal_send (target, _placement, _route); } diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index e027990452..7429203587 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -417,7 +417,7 @@ public: PBD::Signal1 SelectedChanged; int add_aux_send (boost::shared_ptr, boost::shared_ptr); - int add_foldback_send (boost::shared_ptr); + int add_foldback_send (boost::shared_ptr, bool post_fader); void remove_aux_or_listen (boost::shared_ptr); /** diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index dd07ddc0b9..fe24a5a120 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -3384,10 +3384,15 @@ Route::add_aux_send (boost::shared_ptr route, boost::shared_ptr route) +Route::add_foldback_send (boost::shared_ptr route, bool post_fader) { assert (route != _session.monitor_out ()); - boost::shared_ptr before = before_processor_for_placement (PreFader); + boost::shared_ptr before; + if (post_fader) { + before = before_processor_for_placement (PostFader); + } else { + before = before_processor_for_placement (PreFader); + } { Glib::Threads::RWLock::ReaderLock rm (_processor_lock); @@ -3413,6 +3418,7 @@ Route::add_foldback_send (boost::shared_ptr route) } listener->panner_shell()->set_linked_to_route (false); + listener->set_pre_fader (!post_fader); add_processor (listener, before); } catch (failed_constructor& err) { diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 8212a25121..7f1606079a 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -4323,7 +4323,7 @@ OSC::sel_new_personal_send (char *foldback, lo_message msg) bool s_only = true; if (!rt->feeds (lsn_rt, &s_only)) { // create send - rt->add_foldback_send (lsn_rt); + rt->add_foldback_send (lsn_rt, false); //boost::shared_ptr snd = rt->internal_send_for (aux); session->dirty (); return 0; @@ -6608,7 +6608,7 @@ OSC::cue_new_send (string rt_name, lo_message msg) bool s_only = true; if (!rt_send->feeds (aux, &s_only)) { // create send - rt_send->add_foldback_send (aux); + rt_send->add_foldback_send (aux, false); boost::shared_ptr snd = rt_send->internal_send_for (aux); session->dirty (); return 0;