*** NEW CODING POLICY ***
[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>, Placement);
48         PluginInsert (Session&, const XMLNode&);
49         ~PluginInsert ();
50
51         static const 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, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset);
58         void silence (nframes_t nframes, nframes_t offset);
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         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         sigc::signal<void, BufferSet*, BufferSet*> AnalysisDataGathered;
109         void collect_signal_for_analysis(nframes_t nframes) { 
110                 // called from outside the audio thread, so this should be safe
111                 _signal_analysis_input_bufferset.ensure_buffers(input_streams(), nframes);
112                 _signal_analysis_output_bufferset.ensure_buffers(output_streams(), nframes);
113
114                 _signal_analysis_collect_nframes_max = nframes; 
115                 _signal_analysis_collected_nframes   = 0;
116         }
117
118   private:
119         /* disallow copy construction */
120         PluginInsert (const PluginInsert&);
121
122         void parameter_changed (Evoral::Parameter, float);
123         
124         void  set_parameter (Evoral::Parameter param, float val);
125         float get_parameter (Evoral::Parameter param);
126
127         float default_parameter_value (const Evoral::Parameter& param);
128         
129         std::vector<boost::shared_ptr<Plugin> > _plugins;
130
131         boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
132
133         nframes_t _signal_analysis_collected_nframes;
134         nframes_t _signal_analysis_collect_nframes_max;
135
136         BufferSet _signal_analysis_input_bufferset;
137         BufferSet _signal_analysis_output_bufferset;
138         
139         void automation_run (BufferSet& bufs, nframes_t nframes, nframes_t offset);
140         void connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now = 0);
141
142         void init ();
143         void set_automatable ();
144         void auto_state_changed (Evoral::Parameter which);
145
146         int32_t count_for_configuration (ChanCount in, ChanCount out) const;
147
148         boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
149 };
150
151 } // namespace ARDOUR
152
153 #endif /* __ardour_plugin_insert_h__ */