ardour
plugin_insert.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2000,2007 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __ardour_plugin_insert_h__
21 #define __ardour_plugin_insert_h__
22 
23 #include <vector>
24 #include <string>
25 
26 #include <boost/weak_ptr.hpp>
27 
28 #include "ardour/ardour.h"
30 #include "ardour/types.h"
32 #include "ardour/processor.h"
34 
35 class XMLNode;
36 
37 namespace ARDOUR {
38 
39 class Session;
40 class Route;
41 class Plugin;
42 
46 {
47  public:
49  ~PluginInsert ();
50 
51  static const std::string port_automation_node_name;
52 
53  XMLNode& state(bool);
54  XMLNode& get_state(void);
55  int set_state(const XMLNode&, int version);
56 
57  void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
58  void silence (framecnt_t nframes);
59 
60  void activate ();
61  void deactivate ();
62  void flush ();
63 
64  bool reset_parameters_to_default ();
65  bool can_reset_all_parameters ();
66 
67  int set_block_size (pframes_t nframes);
68 
69  ChanCount output_streams() const;
70  ChanCount input_streams() const;
71  ChanCount natural_output_streams() const;
72  ChanCount natural_input_streams() const;
73 
74  bool set_count (uint32_t num);
75  uint32_t get_count () const { return _plugins.size(); }
76 
77  bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
78  bool configure_io (ChanCount in, ChanCount out);
79 
80  bool has_no_inputs() const;
81  bool has_no_audio_inputs() const;
82  bool is_midi_instrument() const;
83 
84  void realtime_handle_transport_stopped ();
85  void realtime_locate ();
86  void monitoring_changed ();
87 
90  {
92  const Evoral::Parameter& param,
93  const ParameterDescriptor& desc,
95 
96  void set_value (double val);
97  double get_value (void) const;
98  XMLNode& get_state();
99 
100  double internal_to_interface (double) const;
101  double interface_to_internal (double) const;
102 
103  private:
105  };
106 
109  {
111  const Evoral::Parameter& param,
112  const ParameterDescriptor& desc,
114 
115  void set_value (const Variant& val);
116  void set_value (double val);
117  double get_value (void) const;
118  XMLNode& get_state();
119 
120  private:
123  };
124 
125  boost::shared_ptr<Plugin> plugin(uint32_t num=0) const {
126  if (num < _plugins.size()) {
127  return _plugins[num];
128  } else {
129  return _plugins[0]; // we always have one
130  }
131  }
132 
133  PluginType type ();
134 
135  std::string describe_parameter (Evoral::Parameter param);
136 
137  framecnt_t signal_latency () const;
138 
139  boost::shared_ptr<Plugin> get_impulse_analysis_plugin();
140 
141  void collect_signal_for_analysis (framecnt_t nframes);
142 
143  bool splitting () const {
144  return _match.method == Split;
145  }
146 
147  PBD::Signal2<void,BufferSet*, BufferSet*> AnalysisDataGathered;
148  PBD::Signal0<void> PluginIoReConfigure;
149 
161  };
162 
163  private:
164  /* disallow copy construction */
165  PluginInsert (const PluginInsert&);
166 
167  void parameter_changed (uint32_t, float);
168 
169  void set_parameter (Evoral::Parameter param, float val);
170  float get_parameter (Evoral::Parameter param);
171 
172  float default_parameter_value (const Evoral::Parameter& param);
173 
174  typedef std::vector<boost::shared_ptr<Plugin> > Plugins;
175  Plugins _plugins;
176 
178 
181 
184 
186 
188  struct Match {
189  Match () : method (Impossible), plugins (0) {}
190  Match (MatchingMethod m, int32_t p, ChanCount h = ChanCount ()) : method (m), plugins (p), hide (h) {}
191 
193  int32_t plugins;
195  };
196 
197  Match private_can_support_io_configuration (ChanCount const &, ChanCount &);
198 
201 
202  void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes);
203  void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
204 
205  void create_automatable_parameters ();
206  void control_list_automation_state_changed (Evoral::Parameter, AutoState);
207  void set_parameter_state_2X (const XMLNode& node, int version);
208  void set_control_ids (const XMLNode&, int version);
209 
211  void add_plugin (boost::shared_ptr<Plugin>);
212 
213  void start_touch (uint32_t param_id);
214  void end_touch (uint32_t param_id);
215 };
216 
217 } // namespace ARDOUR
218 
219 #endif /* __ardour_plugin_insert_h__ */
framecnt_t _signal_analysis_collected_nframes
ChanCount hide
number of channels to hide
we copy one of our insert's inputs to multiple plugin inputs
PBD::Signal0< void > PluginIoReConfigure
BufferSet _signal_analysis_inputs
MatchingMethod method
method to employ
we `hide' some of the plugin's inputs by feeding them silence
uint32_t pframes_t
Definition: types.h:61
our insert's inputs are the same as the plugin's
boost::shared_ptr< Plugin > plugin(uint32_t num=0) const
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
uint32_t get_count() const
Definition: plugin_insert.h:75
we are delegating to the plugin, and it can handle it
framecnt_t _signal_analysis_collect_nframes_max
std::vector< boost::shared_ptr< Plugin > > Plugins
static const std::string port_automation_node_name
Definition: plugin_insert.h:51
int64_t framecnt_t
Definition: types.h:76
Match(MatchingMethod m, int32_t p, ChanCount h=ChanCount())
Definition: amp.h:29
int64_t framepos_t
Definition: types.h:66
#define LIBARDOUR_API
PBD::Signal2< void, BufferSet *, BufferSet * > AnalysisDataGathered
we have multiple instances of the plugin
Definition: xml++.h:95
bool splitting() const
boost::weak_ptr< Plugin > _impulseAnalysisPlugin
static LilvNode * get_value(LilvWorld *world, const LilvNode *subject, const LilvNode *predicate)
Definition: lv2_plugin.cc:971
BufferSet _signal_analysis_outputs
plugin has no inputs, so anything goes
int32_t plugins
number of copies of the plugin that we need
AutoState
Definition: types.h:145