more work on the new all-Processor-all-The-Time redesign of Route - LOTS OF BREAKAGE...
[ardour.git] / libs / ardour / ardour / plugin_insert.h
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 <sigc++/signal.h>
29 #include "ardour/ardour.h"
30 #include "ardour/types.h"
31 #include "ardour/processor.h"
32 #include "ardour/automation_control.h"
33
34 class XMLNode;
35
36 namespace ARDOUR {
37
38 class Session;
39 class Route;
40 class Plugin;
41
42 /** Plugin inserts: send data through a plugin
43  */
44 class PluginInsert : public Processor
45 {
46   public:
47         PluginInsert (Session&, boost::shared_ptr<Plugin>);
48         PluginInsert (Session&, const XMLNode&);
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&);
56
57         void run_in_place (BufferSet& in, sframes_t start_frame, sframes_t end_frame, nframes_t nframes);
58         void silence (nframes_t nframes);
59         
60         void activate ();
61         void deactivate ();
62
63         void set_block_size (nframes_t nframes);
64
65         ChanCount output_streams() const;
66         ChanCount input_streams() const;
67         ChanCount natural_output_streams() const;
68         ChanCount natural_input_streams() const;
69
70         bool     set_count (uint32_t num);
71         uint32_t get_count () const { return _plugins.size(); }
72
73         bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
74         bool configure_io (ChanCount in, ChanCount out);
75
76         bool is_generator() const;
77
78         struct PluginControl : public AutomationControl 
79         {
80             PluginControl (PluginInsert* p, const Evoral::Parameter &param,
81                     boost::shared_ptr<AutomationList> list = boost::shared_ptr<AutomationList>());
82             
83                 void set_value (float val);
84             float get_value (void) const;
85         
86           private:
87                 PluginInsert* _plugin;
88                 bool _logarithmic;
89                 bool _toggled;
90         };
91
92         boost::shared_ptr<Plugin> plugin(uint32_t num=0) const {
93                 if (num < _plugins.size()) { 
94                         return _plugins[num];
95                 } else {
96                         return _plugins[0]; // we always have one
97                 }
98         }
99
100         PluginType type ();
101
102         std::string describe_parameter (Evoral::Parameter param);
103
104         nframes_t signal_latency() const;
105
106         boost::shared_ptr<Plugin> get_impulse_analysis_plugin();
107         
108         void collect_signal_for_analysis(nframes_t nframes);
109
110         sigc::signal<void, BufferSet*, BufferSet*> AnalysisDataGathered;
111
112   private:
113         /* disallow copy construction */
114         PluginInsert (const PluginInsert&);
115
116         void parameter_changed (Evoral::Parameter, float);
117         
118         void  set_parameter (Evoral::Parameter param, float val);
119         float get_parameter (Evoral::Parameter param);
120
121         float default_parameter_value (const Evoral::Parameter& param);
122         
123         typedef std::vector<boost::shared_ptr<Plugin> > Plugins;
124         Plugins _plugins;
125
126         boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
127
128         nframes_t _signal_analysis_collected_nframes;
129         nframes_t _signal_analysis_collect_nframes_max;
130
131         BufferSet _signal_analysis_inputs;
132         BufferSet _signal_analysis_outputs;
133         
134         void automation_run (BufferSet& bufs, nframes_t nframes);
135         void connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now = 0);
136
137         void init ();
138         void set_automatable ();
139         void auto_state_changed (Evoral::Parameter which);
140
141         int32_t count_for_configuration (ChanCount in, ChanCount out) const;
142
143         boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
144 };
145
146 } // namespace ARDOUR
147
148 #endif /* __ardour_plugin_insert_h__ */