summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-13 15:13:37 +0100
committerRobin Gareus <robin@gareus.org>2014-01-13 15:13:37 +0100
commit291618fe7116424448da5f7029e567d655526521 (patch)
treee8399ce25f46634a7a75670e8c97ac3747f99002 /libs/ardour
parent9c595f8131967541808ae77bae842bd905db9caa (diff)
allow to custom select panner-type for each delivery.
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/panner_manager.h5
-rw-r--r--libs/ardour/ardour/panner_shell.h3
-rw-r--r--libs/ardour/delivery.cc1
-rw-r--r--libs/ardour/panner_manager.cc26
-rw-r--r--libs/ardour/panner_shell.cc20
-rw-r--r--libs/ardour/route.cc5
6 files changed, 57 insertions, 3 deletions
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 ()