summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-03-25 19:08:21 +0100
committerRobin Gareus <robin@gareus.org>2016-03-25 19:08:21 +0100
commit79d63d870186e421957e1f5086a7af7d9549b292 (patch)
tree5b394be494d5743925af18c94fbeb7c39b0b4a37 /libs
parent9a8a164930d02d433175eecef9d0e7119edfa16d (diff)
prepare Plugin Pin Management
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/chan_mapping.h1
-rw-r--r--libs/ardour/ardour/plugin_insert.h3
-rw-r--r--libs/ardour/chan_mapping.cc5
-rw-r--r--libs/ardour/plugin_insert.cc39
4 files changed, 34 insertions, 14 deletions
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h
index 7b9f81976d..baa3e9f6a9 100644
--- a/libs/ardour/ardour/chan_mapping.h
+++ b/libs/ardour/ardour/chan_mapping.h
@@ -38,6 +38,7 @@ class LIBARDOUR_API ChanMapping {
public:
ChanMapping() {}
ChanMapping(ARDOUR::ChanCount identity);
+ ChanMapping(const ChanMapping&);
uint32_t get(DataType t, uint32_t from, bool* valid);
uint32_t get(DataType t, uint32_t from) { return get (t, from, NULL); }
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index ffa55b9eaa..ed97126e34 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -27,6 +27,7 @@
#include "ardour/ardour.h"
#include "ardour/libardour_visibility.h"
+#include "ardour/chan_mapping.h"
#include "ardour/types.h"
#include "ardour/parameter_descriptor.h"
#include "ardour/processor.h"
@@ -204,6 +205,8 @@ class LIBARDOUR_API PluginInsert : public Processor
/** details of the match currently being used */
Match _match;
+ ARDOUR::ChanMapping _in_map;
+ ARDOUR::ChanMapping _out_map;
void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes);
void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
diff --git a/libs/ardour/chan_mapping.cc b/libs/ardour/chan_mapping.cc
index 57734803d2..83ded4141c 100644
--- a/libs/ardour/chan_mapping.cc
+++ b/libs/ardour/chan_mapping.cc
@@ -40,6 +40,11 @@ ChanMapping::ChanMapping(ChanCount identity)
}
}
+ChanMapping::ChanMapping (const ChanMapping& other )
+ : _mappings (other._mappings)
+{
+}
+
uint32_t
ChanMapping::get(DataType t, uint32_t from, bool* valid)
{
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index c085f1f9cb..19571c6b5f 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -369,19 +369,16 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
ChanCount const in_streams = input_streams ();
ChanCount const out_streams = output_streams ();
- ChanMapping in_map (in_streams);
- ChanMapping out_map (out_streams);
bool valid;
if (_match.method == Split) {
/* fix the input mapping so that we have maps for each of the plugin's inputs */
- in_map = ChanMapping (natural_input_streams ());
/* copy the first stream's buffer contents to the others */
/* XXX: audio only */
- uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
+ uint32_t first_idx = _in_map.get (DataType::AUDIO, 0, &valid);
if (valid) {
for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
- bufs.get_audio(in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
+ bufs.get_audio(_in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
}
}
}
@@ -441,6 +438,12 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
}
+
+ // copy - for now - since the map is offset below
+ // TODO: use dedicated maps per plugin
+ ChanMapping in_map (_in_map);
+ ChanMapping out_map (_out_map);
+
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
if ((*i)->connect_and_run(bufs, in_map, out_map, nframes, offset)) {
deactivate ();
@@ -486,16 +489,8 @@ PluginInsert::silence (framecnt_t nframes)
return;
}
- ChanMapping in_map(input_streams());
- ChanMapping out_map(output_streams());
-
- if (_match.method == Split) {
- /* fix the input mapping so that we have maps for each of the plugin's inputs */
- in_map = ChanMapping (natural_input_streams ());
- }
-
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
- (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
+ (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), _in_map, _out_map, nframes, 0);
}
}
@@ -752,6 +747,22 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
break;
}
+ if (_match.method == Split) {
+ /* fix the input mapping so that we have maps for each of the plugin's inputs */
+ _in_map = ChanMapping (natural_input_streams ());
+ } else {
+ _in_map = ChanMapping (input_streams ());
+ }
+ _out_map = ChanMapping (output_streams());
+
+#if 0
+ cout << "Set Channel Maps:" << name () << " " << this
+ << "\nin:\n" << _in_map
+ << "\nout:\n" << _out_map
+ << "\n";
+#endif
+
+
if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
|| old_in != in
|| old_out != out