summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/audio_port.h2
-rw-r--r--libs/ardour/ardour/audio_unit.h5
-rw-r--r--libs/ardour/ardour/audioengine.h8
-rw-r--r--libs/ardour/ardour/buffer_set.h20
-rw-r--r--libs/ardour/ardour/chan_count.h10
-rw-r--r--libs/ardour/ardour/chan_mapping.h82
-rw-r--r--libs/ardour/ardour/io.h2
-rw-r--r--libs/ardour/ardour/ladspa_plugin.h5
-rw-r--r--libs/ardour/ardour/lv2_event_buffer.h81
-rw-r--r--libs/ardour/ardour/lv2_plugin.h13
-rw-r--r--libs/ardour/ardour/midi_buffer.h1
-rw-r--r--libs/ardour/ardour/midi_port.h2
-rw-r--r--libs/ardour/ardour/plugin.h5
-rw-r--r--libs/ardour/ardour/plugin_insert.h17
-rw-r--r--libs/ardour/ardour/port.h5
-rw-r--r--libs/ardour/ardour/processor.h3
-rw-r--r--libs/ardour/ardour/route.h6
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/ardour/uri_map.h60
-rw-r--r--libs/ardour/ardour/vst_plugin.h6
20 files changed, 304 insertions, 31 deletions
diff --git a/libs/ardour/ardour/audio_port.h b/libs/ardour/ardour/audio_port.h
index 85bac1f286..09bd8bdd1e 100644
--- a/libs/ardour/ardour/audio_port.h
+++ b/libs/ardour/ardour/audio_port.h
@@ -38,6 +38,8 @@ class AudioPort : public Port
void cycle_start (nframes_t);
void cycle_end (nframes_t);
void cycle_split ();
+
+ size_t raw_buffer_size(jack_nframes_t nframes) const;
Buffer& get_buffer (nframes_t nframes, nframes_t offset = 0) {
return get_audio_buffer (nframes, offset);
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index e023979ed8..83d85ec5d0 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -30,13 +30,14 @@
#include <vector>
#include <map>
-#include "ardour/plugin.h"
-
#include <AudioUnit/AudioUnit.h>
#include <appleutility/AUParamInfo.h>
#include <boost/shared_ptr.hpp>
+#include "ardour/plugin.h"
+#include "ardour/chan_mapping.h"
+
class CAComponent;
class CAAudioUnit;
class CAComponentDescription;
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 54154141f6..9dec7c8ec3 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -40,9 +40,10 @@
namespace ARDOUR {
-class Session;
-class Port;
class InternalPort;
+class MidiPort;
+class Port;
+class Session;
class AudioEngine : public sigc::trackable
{
@@ -74,6 +75,8 @@ class AudioEngine : public sigc::trackable
nframes_t frame_rate();
nframes_t frames_per_cycle();
+ size_t raw_buffer_size(DataType t);
+
int usecs_per_cycle () const { return _usecs_per_cycle; }
bool get_sync_offset (nframes_t& offset) const;
@@ -213,6 +216,7 @@ class AudioEngine : public sigc::trackable
bool _running;
bool _has_run;
nframes_t _buffer_size;
+ std::map<DataType,size_t> _raw_buffer_sizes;
nframes_t _frame_rate;
/// number of frames between each check for changes in monitor input
nframes_t monitor_check_interval;
diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h
index f02470c3e8..72f45762c7 100644
--- a/libs/ardour/ardour/buffer_set.h
+++ b/libs/ardour/ardour/buffer_set.h
@@ -31,6 +31,7 @@ class Buffer;
class AudioBuffer;
class MidiBuffer;
class PortSet;
+class LV2EventBuffer;
/** A set of buffers of various types.
*
@@ -55,7 +56,6 @@ public:
void attach_buffers(PortSet& ports, nframes_t nframes, nframes_t offset = 0);
- void ensure_buffers(const ChanCount& count, size_t buffer_capacity);
void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity);
const ChanCount& available() const { return _available; }
@@ -68,10 +68,7 @@ public:
size_t buffer_capacity(DataType type) const;
- Buffer& get(DataType type, size_t i) {
- assert(i <= _count.get(type));
- return *_buffers[type][i];
- }
+ Buffer& get(DataType type, size_t i);
AudioBuffer& get_audio(size_t i) {
return (AudioBuffer&)get(DataType::AUDIO, i);
@@ -81,6 +78,14 @@ public:
return (MidiBuffer&)get(DataType::MIDI, i);
}
+ /** Get a MIDI buffer translated into an LV2 MIDI buffer for use with plugins.
+ * The index here corresponds directly to MIDI buffer numbers (i.e. the index
+ * passed to get_midi), translation back and forth will happen as needed */
+ LV2EventBuffer& get_lv2_midi(bool input, size_t i);
+
+ /** Flush modified LV2 event output buffers back to Ardour buffers */
+ void flush_lv2_midi(bool input, size_t i);
+
void read_from(BufferSet& in, nframes_t nframes);
// ITERATORS
@@ -137,6 +142,11 @@ private:
/// Vector of vectors, indexed by DataType
std::vector<BufferVec> _buffers;
+
+ /// LV2 MIDI buffers (for conversion to/from MIDI buffers)
+ //
+ typedef std::vector< std::pair<bool, LV2EventBuffer*> > LV2Buffers;
+ LV2Buffers _lv2_buffers;
/// Use counts (there may be more actual buffers than this)
ChanCount _count;
diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h
index ff70be6bb6..fb4b1999ca 100644
--- a/libs/ardour/ardour/chan_count.h
+++ b/libs/ardour/ardour/chan_count.h
@@ -20,10 +20,10 @@
#ifndef __ardour_chan_count_h__
#define __ardour_chan_count_h__
+#include <cassert>
#include <ostream>
#include "ardour/data_type.h"
-#include <cassert>
namespace ARDOUR {
@@ -103,6 +103,14 @@ public:
bool operator>=(const ChanCount& other) const {
return ( (*this > other) || (*this == other) );
}
+
+ static ChanCount max(const ChanCount& a, const ChanCount& b) {
+ ChanCount ret;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ ret.set(*t, std::max(a.get(*t), b.get(*t)));
+ }
+ return ret;
+ }
static const ChanCount INFINITE;
static const ChanCount ZERO;
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h
new file mode 100644
index 0000000000..1dae20e34a
--- /dev/null
+++ b/libs/ardour/ardour/chan_mapping.h
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2009 Paul Davis
+ Author: Dave Robillard
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_chan_mapping_h__
+#define __ardour_chan_mapping_h__
+
+#include <map>
+#include <cassert>
+#include <ostream>
+#include <utility>
+
+#include "ardour/data_type.h"
+
+namespace ARDOUR {
+
+
+/** A mapping from one set of channels to another
+ * (e.g. how to 'connect' two BufferSets).
+ */
+class ChanMapping {
+public:
+ ChanMapping() {}
+ ChanMapping(ChanCount identity) {
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (size_t i = 0; i <= identity.get(*t); ++i)
+ set(*t, i, i);
+ }
+ }
+
+ uint32_t get(DataType t, uint32_t from) {
+ Mappings::iterator tm = _mappings.find(t);
+ assert(tm != _mappings.end());
+ TypeMapping::iterator m = tm->second.find(from);
+ assert(m != tm->second.end());
+ return m->second;
+ }
+
+ void set(DataType t, uint32_t from, uint32_t to) {
+ Mappings::iterator tm = _mappings.find(t);
+ if (tm == _mappings.end()) {
+ tm = _mappings.insert(std::make_pair(t, TypeMapping())).first;
+ }
+ tm->second.insert(std::make_pair(from, to));
+ }
+
+ /** Increase the 'to' field of every mapping for type @a t by @a delta */
+ void offset(DataType t, uint32_t delta) {
+ Mappings::iterator tm = _mappings.find(t);
+ if (tm != _mappings.end()) {
+ for (TypeMapping::iterator m = tm->second.begin(); m != tm->second.end(); ++m) {
+ m->second += delta;
+ }
+ }
+ }
+
+private:
+ typedef std::map<uint32_t, uint32_t> TypeMapping;
+ typedef std::map<DataType, TypeMapping> Mappings;
+
+ Mappings _mappings;
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_chan_mapping_h__
+
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h
index 6b309bf50c..8457668756 100644
--- a/libs/ardour/ardour/io.h
+++ b/libs/ardour/ardour/io.h
@@ -365,7 +365,7 @@ class IO : public SessionObject, public AutomatableControls, public Latent
int make_connections (const XMLNode&);
boost::shared_ptr<Bundle> find_possible_bundle (const string &desired_name, const string &default_name, const string &connection_type_name);
- void setup_peak_meters ();
+ virtual void setup_peak_meters ();
void meter ();
bool ensure_inputs_locked (ChanCount, bool clear, void *src);
diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h
index 855aa7189b..847b582432 100644
--- a/libs/ardour/ardour/ladspa_plugin.h
+++ b/libs/ardour/ardour/ladspa_plugin.h
@@ -84,7 +84,10 @@ class LadspaPlugin : public ARDOUR::Plugin
void set_block_size (nframes_t nframes) {}
- int connect_and_run (BufferSet& bufs, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset);
+ int connect_and_run (BufferSet& bufs,
+ ChanMapping in, ChanMapping out,
+ nframes_t nframes, nframes_t offset);
+
std::string describe_parameter (Evoral::Parameter);
std::string state_node_name() const { return "ladspa"; }
void print_parameter (uint32_t, char*, uint32_t len) const;
diff --git a/libs/ardour/ardour/lv2_event_buffer.h b/libs/ardour/ardour/lv2_event_buffer.h
new file mode 100644
index 0000000000..9d35d36d55
--- /dev/null
+++ b/libs/ardour/ardour/lv2_event_buffer.h
@@ -0,0 +1,81 @@
+/*
+ Copyright (C) 2009 Paul Davis
+ Author: Dave Robillard
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_lv2_event_buffer_h__
+#define __ardour_lv2_event_buffer_h__
+
+#include "lv2ext/lv2_event.h"
+#include "lv2ext/lv2_event_helpers.h"
+
+namespace ARDOUR {
+
+
+class LV2EventBuffer {
+public:
+ LV2EventBuffer(size_t capacity);
+ ~LV2EventBuffer();
+
+ inline LV2_Event_Buffer* data() { return _data; }
+ inline const LV2_Event_Buffer* data() const { return _data; }
+
+ inline void rewind() const { lv2_event_begin(&_iter, _data); }
+
+ inline void reset() {
+ _latest_frames = 0;
+ _latest_subframes = 0;
+ _data->event_count = 0;
+ _data->size = 0;
+ rewind();
+ }
+
+ inline size_t event_count() const { return _data->event_count; }
+ inline uint32_t capacity() const { return _data->capacity; }
+ inline uint32_t size() const { return _data->size; }
+ inline uint32_t latest_frames() const { return _latest_frames; }
+ inline uint32_t latest_subframes() const { return _latest_subframes; }
+
+ bool increment() const;
+
+ bool is_valid() const;
+
+ bool get_event(uint32_t* frames,
+ uint32_t* subframes,
+ uint16_t* type,
+ uint16_t* size,
+ uint8_t** data) const;
+
+ bool append(uint32_t frames,
+ uint32_t subframes,
+ uint16_t type,
+ uint16_t size,
+ const uint8_t* data);
+
+ bool append(const LV2_Event_Buffer* buf);
+
+private:
+ LV2_Event_Buffer* _data; ///< Contents
+ mutable LV2_Event_Iterator _iter; ///< Iterator into _data
+ uint32_t _latest_frames; ///< Latest time of all events (frames)
+ uint32_t _latest_subframes; ///< Latest time of all events (subframes)
+};
+
+
+} // namespace ARDOUR
+
+#endif // __ardour_lv2_event_buffer_h__
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index f235a0b4c2..7daf4ed2b1 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -33,6 +33,7 @@
#include <jack/types.h>
#include <slv2/slv2.h>
#include "ardour/plugin.h"
+#include "ardour/uri_map.h"
namespace ARDOUR {
class AudioEngine;
@@ -95,9 +96,12 @@ class LV2Plugin : public ARDOUR::Plugin
void set_block_size (nframes_t nframes) {}
- int connect_and_run (BufferSet& bufs, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset);
+ int connect_and_run (BufferSet& bufs,
+ ChanMapping in, ChanMapping out,
+ nframes_t nframes, nframes_t offset);
+
std::string describe_parameter (Evoral::Parameter);
- std::string state_node_name() const { return "LV2"; }
+ std::string state_node_name() const { return "lv2"; }
void print_parameter (uint32_t, char*, uint32_t len) const;
bool parameter_is_audio(uint32_t) const;
@@ -107,6 +111,8 @@ class LV2Plugin : public ARDOUR::Plugin
bool parameter_is_output(uint32_t) const;
bool parameter_is_toggled(uint32_t) const;
+ static uint32_t midi_event_type() { return _midi_event_type; }
+
XMLNode& get_state();
int set_state(const XMLNode& node);
bool save_preset(std::string uri);
@@ -138,6 +144,9 @@ class LV2Plugin : public ARDOUR::Plugin
LV2_Feature _data_access_feature;
LV2_Feature _instance_access_feature;
+ static URIMap _uri_map;
+ static uint32_t _midi_event_type;
+
void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
void run (nframes_t nsamples);
void latency_compute_run ();
diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h
index 70e2203df4..43626fd0e7 100644
--- a/libs/ardour/ardour/midi_buffer.h
+++ b/libs/ardour/ardour/midi_buffer.h
@@ -44,6 +44,7 @@ public:
bool push_back(const Evoral::MIDIEvent<TimeType>& event);
bool push_back(const jack_midi_event_t& event);
+ bool push_back(TimeType time, size_t size, const uint8_t* data);
uint8_t* reserve(TimeType time, size_t size);
void resize(size_t);
diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h
index 2f3d8d1647..e4d6a41d05 100644
--- a/libs/ardour/ardour/midi_port.h
+++ b/libs/ardour/ardour/midi_port.h
@@ -40,6 +40,8 @@ class MidiPort : public Port {
void cycle_end (nframes_t nframes);
void cycle_split ();
void flush_buffers (nframes_t nframes, nframes_t offset = 0);
+
+ size_t raw_buffer_size(jack_nframes_t nframes) const;
Buffer& get_buffer (nframes_t nframes, nframes_t offset = 0) {
return get_midi_buffer (nframes, offset);
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index 0039a1f8ca..2cf3d3fc34 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -29,6 +29,7 @@
#include <jack/types.h>
#include "ardour/chan_count.h"
+#include "ardour/chan_mapping.h"
#include "ardour/cycles.h"
#include "ardour/latent.h"
#include "ardour/plugin_insert.h"
@@ -126,7 +127,9 @@ class Plugin : public PBD::StatefulDestructible, public Latent
virtual void deactivate () = 0;
virtual void set_block_size (nframes_t nframes) = 0;
- virtual int connect_and_run (BufferSet& bufs, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset) = 0;
+ virtual int connect_and_run (BufferSet& bufs,
+ ChanMapping in, ChanMapping out,
+ nframes_t nframes, nframes_t offset) = 0;
virtual std::set<Evoral::Parameter> automatable() const = 0;
virtual string describe_parameter (Evoral::Parameter) = 0;
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index 88a5ee357d..99bd492ab5 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -104,16 +104,10 @@ class PluginInsert : public Processor
nframes_t signal_latency() const;
boost::shared_ptr<Plugin> get_impulse_analysis_plugin();
+
+ void collect_signal_for_analysis(nframes_t nframes);
sigc::signal<void, BufferSet*, BufferSet*> AnalysisDataGathered;
- void collect_signal_for_analysis(nframes_t nframes) {
- // called from outside the audio thread, so this should be safe
- _signal_analysis_input_bufferset.ensure_buffers(input_streams(), nframes);
- _signal_analysis_output_bufferset.ensure_buffers(output_streams(), nframes);
-
- _signal_analysis_collected_nframes = 0;
- _signal_analysis_collect_nframes_max = nframes;
- }
private:
/* disallow copy construction */
@@ -126,15 +120,16 @@ class PluginInsert : public Processor
float default_parameter_value (const Evoral::Parameter& param);
- std::vector<boost::shared_ptr<Plugin> > _plugins;
+ typedef std::vector<boost::shared_ptr<Plugin> > Plugins;
+ Plugins _plugins;
boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
nframes_t _signal_analysis_collected_nframes;
nframes_t _signal_analysis_collect_nframes_max;
- BufferSet _signal_analysis_input_bufferset;
- BufferSet _signal_analysis_output_bufferset;
+ BufferSet _signal_analysis_inputs;
+ BufferSet _signal_analysis_outputs;
void automation_run (BufferSet& bufs, nframes_t nframes);
void connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now = 0);
diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h
index 0c77eb15dd..3f86fb8fd2 100644
--- a/libs/ardour/ardour/port.h
+++ b/libs/ardour/ardour/port.h
@@ -101,6 +101,9 @@ public:
void set_latency (nframes_t);
virtual void reset ();
+
+ /** @return the size of the raw buffer (bytes) for duration @a nframes (audio frames) */
+ virtual size_t raw_buffer_size(jack_nframes_t nframes) const = 0;
virtual DataType type () const = 0;
virtual void cycle_start (nframes_t) = 0;
@@ -108,7 +111,7 @@ public:
virtual void cycle_split () = 0;
virtual Buffer& get_buffer (nframes_t nframes, nframes_t offset = 0) = 0;
virtual void flush_buffers (nframes_t, nframes_t offset = 0) {}
-
+
static void set_engine (AudioEngine *);
sigc::signal<void, bool> MonitorInputChanged;
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index 24d3cd93c7..c2c23b8f67 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -95,8 +95,8 @@ class Processor : public SessionObject, public AutomatableControls, public Laten
virtual bool is_out_of_place () const { return false; }
virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const = 0;
- virtual ChanCount output_streams() const { return _configured_input; }
virtual ChanCount input_streams () const { return _configured_input; }
+ virtual ChanCount output_streams() const { return _configured_output; }
virtual XMLNode& state (bool full);
virtual XMLNode& get_state (void);
@@ -116,6 +116,7 @@ protected:
bool _next_ab_is_active;
bool _configured;
ChanCount _configured_input;
+ ChanCount _configured_output;
Placement _placement;
uint32_t _sort_key;
void* _gui; /* generic, we don't know or care what this is */
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 183be9c4c8..6926dbd036 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -161,7 +161,7 @@ class Route : public IO
}
}
- ChanCount max_processor_outs () const { return processor_max_outs; }
+ ChanCount max_processor_streams () const { return processor_max_streams; }
ChanCount pre_fader_streams() const;
/** A record of the stream configuration at some point in the processor list.
@@ -333,11 +333,13 @@ class Route : public IO
sigc::connection input_signal_connection;
- ChanCount processor_max_outs;
+ ChanCount processor_max_streams;
uint32_t _remote_control_id;
uint32_t pans_required() const;
ChanCount n_process_buffers ();
+
+ void setup_peak_meters ();
virtual int _set_state (const XMLNode&, bool call_base);
virtual void _set_processor_states (const XMLNodeList&);
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index ce238fbc2e..bc8dcb81f1 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -944,6 +944,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
pan_t** pan_automation_buffer () const { return _pan_automation_buffer; }
+
+ void ensure_buffer_set (BufferSet& buffers, const ChanCount& howmany);
/* VST support */
diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h
new file mode 100644
index 0000000000..78e5393271
--- /dev/null
+++ b/libs/ardour/ardour/uri_map.h
@@ -0,0 +1,60 @@
+/*
+ Copyright (C) 2009 Paul Davis
+ Author: Dave Robillard
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_uri_map_h__
+#define __ardour_uri_map_h__
+
+#include <map>
+#include <string>
+#include <boost/utility.hpp>
+#include <slv2/slv2.h>
+#include "lv2ext/lv2_uri_map.h"
+
+namespace ARDOUR {
+
+
+/** Implementation of the LV2 URI Map extension
+ */
+class URIMap : public boost::noncopyable {
+public:
+ URIMap();
+
+ LV2_Feature* feature() { return &uri_map_feature; }
+
+ uint32_t uri_to_id(const char* map,
+ const char* uri);
+
+private:
+ typedef std::map<std::string, uint32_t> Map;
+
+ static uint32_t uri_map_uri_to_id(LV2_URI_Map_Callback_Data callback_data,
+ const char* map,
+ const char* uri);
+
+ LV2_Feature uri_map_feature;
+ LV2_URI_Map_Feature uri_map_feature_data;
+ Map uri_map;
+ uint32_t next_uri_id;
+};
+
+
+} // namespace ARDOUR
+
+#endif // __ardour_uri_map_h__
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h
index 7541740cf8..d4ca3b8b60 100644
--- a/libs/ardour/ardour/vst_plugin.h
+++ b/libs/ardour/ardour/vst_plugin.h
@@ -71,7 +71,11 @@ class VSTPlugin : public ARDOUR::Plugin
void activate ();
void deactivate ();
void set_block_size (nframes_t nframes);
- int connect_and_run (BufferSet&, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset);
+
+ int connect_and_run (BufferSet&,
+ ChanMapping in, ChanMapping out,
+ nframes_t nframes, nframes_t offset);
+
string describe_parameter (Evoral::Parameter);
string state_node_name() const { return "vst"; }
void print_parameter (uint32_t, char*, uint32_t len) const;