Added facilities into PluginInsert for the GUI to gather parts of the real signal...
[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_list.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>, Placement);
48         PluginInsert (Session&, const XMLNode&);
49         PluginInsert (const PluginInsert&);
50         ~PluginInsert ();
51
52         static const string port_automation_node_name;
53         
54         XMLNode& state(bool);
55         XMLNode& get_state(void);
56         int set_state(const XMLNode&);
57
58         void run_in_place (BufferSet& in, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset);
59         void silence (nframes_t nframes, nframes_t offset);
60         
61         void activate ();
62         void deactivate ();
63
64         void set_block_size (nframes_t nframes);
65
66         ChanCount output_streams() const;
67         ChanCount input_streams() const;
68         ChanCount natural_output_streams() const;
69         ChanCount natural_input_streams() const;
70
71         bool     set_count (uint32_t num);
72         uint32_t get_count () const { return _plugins.size(); }
73
74         bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
75         bool configure_io (ChanCount in, ChanCount out);
76
77         bool is_generator() const;
78
79         struct PluginControl : public AutomationControl 
80         {
81             PluginControl (PluginInsert* p, const Evoral::Parameter &param,
82                     boost::shared_ptr<AutomationList> list = boost::shared_ptr<AutomationList>());
83             
84                 void set_value (float val);
85             float get_value (void) const;
86         
87           private:
88                 PluginInsert* _plugin;
89                 bool _logarithmic;
90                 bool _toggled;
91         };
92
93         boost::shared_ptr<Plugin> plugin(uint32_t num=0) const {
94                 if (num < _plugins.size()) { 
95                         return _plugins[num];
96                 } else {
97                         return _plugins[0]; // we always have one
98                 }
99         }
100
101         PluginType type ();
102
103         string describe_parameter (Evoral::Parameter param);
104
105         nframes_t signal_latency() const;
106
107         boost::shared_ptr<Plugin> get_impulse_analysis_plugin();
108
109         sigc::signal<void, BufferSet*, BufferSet*> AnalysisDataGathered;
110         void collect_signal_for_analysis(nframes_t nframes) { 
111                 // called from outside the audio thread, so this should be safe
112                 _signal_analysis_input_bufferset.ensure_buffers(input_streams(), nframes);
113                 _signal_analysis_output_bufferset.ensure_buffers(output_streams(), nframes);
114
115                 _signal_analysis_collect_nframes_max = nframes; 
116                 _signal_analysis_collected_nframes   = 0;
117         }
118
119   private:
120
121         void parameter_changed (Evoral::Parameter, float);
122         
123         void  set_parameter (Evoral::Parameter param, float val);
124         float get_parameter (Evoral::Parameter param);
125
126         float default_parameter_value (const Evoral::Parameter& param);
127         
128         std::vector<boost::shared_ptr<Plugin> > _plugins;
129
130         boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
131
132         nframes_t _signal_analysis_collected_nframes;
133         nframes_t _signal_analysis_collect_nframes_max;
134
135         BufferSet _signal_analysis_input_bufferset;
136         BufferSet _signal_analysis_output_bufferset;
137         
138         void automation_run (BufferSet& bufs, nframes_t nframes, nframes_t offset);
139         void connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now = 0);
140
141         void init ();
142         void set_automatable ();
143         void auto_state_changed (Evoral::Parameter which);
144
145         int32_t count_for_configuration (ChanCount in, ChanCount out) const;
146
147         boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
148 };
149
150 } // namespace ARDOUR
151
152 #endif /* __ardour_plugin_insert_h__ */