diff options
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 29 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.cc | 9 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/send_ui.cc | 12 | ||||
-rw-r--r-- | libs/ardour/ardour/panner_manager.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/panner_shell.h | 3 | ||||
-rw-r--r-- | libs/ardour/delivery.cc | 1 | ||||
-rw-r--r-- | libs/ardour/panner_manager.cc | 26 | ||||
-rw-r--r-- | libs/ardour/panner_shell.cc | 20 | ||||
-rw-r--r-- | libs/ardour/route.cc | 5 |
10 files changed, 82 insertions, 32 deletions
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 780e8078c6..830d2bf161 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1041,29 +1041,13 @@ MixerStrip::update_panner_choices () ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices) if (!_route->panner_shell()) { return; } - int in = _route->output()->n_ports().n_audio(); - int out = in; - + uint32_t in = _route->output()->n_ports().n_audio(); + uint32_t out = in; if (_route->panner()) { in = _route->panner()->in().n_audio(); } - if (out < 2 || in == 0) { - panners.set_available_panners(_route, std::map<std::string,std::string>()); - return; - } - - std::map<std::string,std::string> panner_list; - std::list<PannerInfo*> panner_info = PannerManager::instance().panner_info; - /* get available panners for current configuration. */ - for (list<PannerInfo*>::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { - PanPluginDescriptor* d = &(*p)->descriptor; - if (d->in != -1 && d->in != in) continue; - if (d->out != -1 && d->out != out) continue; - if (d->in == -1 && d->out == -1 && out <= 2) continue; - panner_list.insert(std::pair<std::string,std::string>(d->panner_uri,d->name)); - } - panners.set_available_panners(_route, panner_list); + panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); } /* @@ -1891,10 +1875,13 @@ MixerStrip::show_send (boost::shared_ptr<Send> send) gain_meter().set_controls (_route, send->meter(), send->amp()); gain_meter().setup_meters (); + uint32_t const in = _current_delivery->pans_required(); + uint32_t const out = _current_delivery->pan_outs(); + panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner()); - panner_ui().set_available_panners(boost::shared_ptr<ARDOUR::Route>(), std::map<std::string,std::string>()); + panner_ui().set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); panner_ui().setup_pan (); - panners.show_all (); + panner_ui().show_all (); input_button.set_sensitive (false); group_button.set_sensitive (false); diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index ab4279a154..2a6568992b 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -388,7 +388,7 @@ PannerUI::build_pan_menu () items.push_back (MenuElem (_("Edit..."), sigc::mem_fun (*this, &PannerUI::pan_edit))); } - if (_route && _panner_list.size() > 1 && !_panshell->bypassed()) { + if (_panner_list.size() > 1 && !_panshell->bypassed()) { RadioMenuItem::Group group; items.push_back (SeparatorElem()); @@ -444,9 +444,7 @@ PannerUI::pan_reset () void PannerUI::pan_set_custom_type (std::string uri) { if (_suspend_menu_callbacks) return; - if (_route) { - _route->set_custom_panner_uri(uri); - } + _panshell->select_panner_by_uri(uri); } void @@ -644,8 +642,7 @@ PannerUI::position_adjusted () } void -PannerUI::set_available_panners(boost::shared_ptr<ARDOUR::Route> r, std::map<std::string,std::string> p) +PannerUI::set_available_panners(std::map<std::string,std::string> p) { - _route = r; _panner_list = p; } diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h index dca24451d1..9b349d664f 100644 --- a/gtk2_ardour/panner_ui.h +++ b/gtk2_ardour/panner_ui.h @@ -73,7 +73,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void set_width (Width); void setup_pan (); - void set_available_panners(boost::shared_ptr<ARDOUR::Route>, std::map<std::string,std::string>); + void set_available_panners(std::map<std::string,std::string>); void effective_pan_display (); @@ -85,6 +85,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr private: friend class MixerStrip; + friend class SendUI; boost::shared_ptr<ARDOUR::PannerShell> _panshell; boost::shared_ptr<ARDOUR::Panner> _panner; @@ -161,7 +162,6 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void start_touch (boost::weak_ptr<ARDOUR::AutomationControl>); void stop_touch (boost::weak_ptr<ARDOUR::AutomationControl>); - boost::shared_ptr<ARDOUR::Route> _route; std::map<std::string,std::string> _panner_list; bool _suspend_menu_callbacks; }; diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc index 90ee52b3ad..cdd8673da9 100644 --- a/gtk2_ardour/send_ui.cc +++ b/gtk2_ardour/send_ui.cc @@ -20,6 +20,7 @@ #include <gtkmm2ext/doi.h> #include "ardour/io.h" +#include "ardour/panner_manager.h" #include "ardour/send.h" #include "ardour/rc_configuration.h" @@ -70,7 +71,11 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session* session _send->output()->changed.connect (connections, invalidator (*this), boost::bind (&SendUI::outs_changed, this, _1, _2), gui_context()); + uint32_t const in = _send->pans_required(); + uint32_t const out = _send->pan_outs(); + _panners.set_width (Wide); + _panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); _panners.setup_pan (); _gpm.setup_meters (); @@ -97,7 +102,14 @@ SendUI::outs_changed (IOChange change, void* /*ignored*/) { ENSURE_GUI_THREAD (*this, &SendUI::outs_changed, change, ignored) if (change.type & IOChange::ConfigurationChanged) { + uint32_t const in = _send->pans_required(); + uint32_t const out = _send->pan_outs(); + if (_panners._panner == 0) { + _panners.set_panner (_send->panner_shell(), _send->panner()); + } + _panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); _panners.setup_pan (); + _panners.show_all (); _gpm.setup_meters (); } } diff --git a/libs/ardour/ardour/panner_manager.h b/libs/ardour/ardour/panner_manager.h index 7b52c65c0a..4a29e1c36b 100644 --- a/libs/ardour/ardour/panner_manager.h +++ b/libs/ardour/ardour/panner_manager.h @@ -26,6 +26,8 @@ namespace ARDOUR { +typedef std::map<std::string,std::string> PannerUriMap; + struct PannerInfo { PanPluginDescriptor descriptor; void* module; @@ -50,7 +52,8 @@ public: std::list<PannerInfo*> panner_info; PannerInfo* select_panner (ChanCount in, ChanCount out, std::string const uri = ""); - PannerInfo* get_by_uri (std::string uri); + PannerInfo* get_by_uri (std::string uri) const; + PannerUriMap get_available_panners(uint32_t const a_in, uint32_t const a_out) const; private: PannerManager(); diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h index f798e0da97..765acad16a 100644 --- a/libs/ardour/ardour/panner_shell.h +++ b/libs/ardour/ardour/panner_shell.h @@ -75,6 +75,9 @@ public: std::string user_selected_panner_uri() const { return _user_selected_panner_uri; } std::string panner_gui_uri() const { return _panner_gui_uri; } + /* this function takes the process lock */ + bool select_panner_by_uri (std::string const uri); + private: friend class Route; void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff); diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 11500b4b10..8e636ed861 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -364,6 +364,7 @@ Delivery::set_state (const XMLNode& node, int version) XMLNode* pannnode = node.child (X_("Pannable")); if (_panshell && _panshell->panner() && pannnode) { _panshell->pannable()->set_state (*pannnode, version); + _panshell->pannable()->set_panner(_panshell->panner()); } return 0; diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc index 24fa10e225..ec5b675731 100644 --- a/libs/ardour/panner_manager.cc +++ b/libs/ardour/panner_manager.cc @@ -218,13 +218,35 @@ PannerManager::select_panner (ChanCount in, ChanCount out, std::string const uri } PannerInfo* -PannerManager::get_by_uri (std::string uri) +PannerManager::get_by_uri (std::string uri) const { PannerInfo* pi = NULL; - for (list<PannerInfo*>::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + for (list<PannerInfo*>::const_iterator p = panner_info.begin(); p != panner_info.end(); ++p) { if ((*p)->descriptor.panner_uri != uri) continue; pi = (*p); break; } return pi; } + +PannerUriMap +PannerManager::get_available_panners(uint32_t const a_in, uint32_t const a_out) const +{ + int const in = a_in; + int const out = a_out; + PannerUriMap panner_list; + + if (out < 2 || in == 0) { + return panner_list; + } + + /* get available panners for current configuration. */ + for (list<PannerInfo*>::const_iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + PanPluginDescriptor* d = &(*p)->descriptor; + if (d->in != -1 && d->in != in) continue; + if (d->out != -1 && d->out != out) continue; + if (d->in == -1 && d->out == -1 && out <= 2) continue; + panner_list.insert(std::pair<std::string,std::string>(d->panner_uri,d->name)); + } + return panner_list; +} diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc index a25cb49ab5..ccb8aa8e87 100644 --- a/libs/ardour/panner_shell.cc +++ b/libs/ardour/panner_shell.cc @@ -43,8 +43,10 @@ #include "evoral/Curve.hpp" #include "ardour/audio_buffer.h" +#include "ardour/audioengine.h" #include "ardour/buffer_set.h" #include "ardour/debug.h" +#include "ardour/pannable.h" #include "ardour/panner.h" #include "ardour/panner_manager.h" #include "ardour/panner_shell.h" @@ -393,3 +395,21 @@ PannerShell::set_user_selected_panner_uri (std::string const uri) _force_reselect = true; return true; } + +bool +PannerShell::select_panner_by_uri (std::string const uri) +{ + if (uri == _user_selected_panner_uri) return false; + _user_selected_panner_uri = uri; + if (uri == _current_panner_uri) return false; + _force_reselect = true; + if (_panner) { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); + ChanCount in = _panner->in(); + ChanCount out = _panner->out(); + configure_io(in, out); + pannable()->set_panner(_panner); + _session.set_dirty (); + } + return true; +} diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index a036c8feb0..ccfe38e9e1 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -1568,6 +1568,10 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* return 0; } +#if 0 +/* currently unused (again) -- but will come in handy soon (again) + * once there is an option to link route + delivery panner settings + */ void Route::set_custom_panner_uri (std::string const panner_uri) { @@ -1619,6 +1623,7 @@ Route::set_custom_panner_uri (std::string const panner_uri) processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */ _session.set_dirty (); } +#endif void Route::reset_instrument_info () |