merge 3.0 from 2.0-ongoing@3243
[ardour.git] / libs / ardour / ardour / audio_unit.h
1 /*
2     Copyright (C) 2006 Paul Davis 
3     Written by Taybin Rutkin
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 */
20
21 #ifndef __ardour_audio_unit_h__
22 #define __ardour_audio_unit_h__
23
24 #include <stdint.h>
25 #include <boost/shared_ptr.hpp>
26
27 #include <list>
28 #include <set>
29 #include <string>
30 #include <vector>
31
32 #include <ardour/plugin.h>
33
34 #include <AudioUnit/AudioUnit.h>
35 #include <appleutility/AUParamInfo.h>
36
37 #include <boost/shared_ptr.hpp>
38
39 class CAComponent;
40 class CAAudioUnit;
41 class CAComponentDescription;
42 struct AudioBufferList;
43
44 namespace ARDOUR {
45
46 class AudioEngine;
47 class Session;
48
49 struct AUParameterDescriptor : public Plugin::ParameterDescriptor {
50         // additional fields to make operations more efficient
51         AudioUnitParameterID id;
52         AudioUnitScope scope;
53         AudioUnitElement element;
54         float default_value;
55         bool automatable;
56         AudioUnitParameterUnit unit;
57 };
58
59 class AUPlugin : public ARDOUR::Plugin
60 {
61   public:
62         AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp);
63         AUPlugin (const AUPlugin& other);
64         virtual ~AUPlugin ();
65         
66         std::string unique_id () const;
67         const char * label () const;
68         const char * name () const { return _info->name.c_str(); }
69         const char * maker () const { return _info->creator.c_str(); }
70         uint32_t parameter_count () const;
71         float default_value (uint32_t port);
72         nframes_t signal_latency () const;
73         void set_parameter (uint32_t which, float val);
74         float get_parameter (uint32_t which) const;
75     
76         int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
77         uint32_t nth_parameter (uint32_t which, bool& ok) const;
78         void activate ();
79         void deactivate ();
80         void set_block_size (nframes_t nframes);
81     
82         int connect_and_run (BufferSet& bufs, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset);
83         
84         std::set<uint32_t> automatable() const;
85         string describe_parameter (uint32_t);
86         string state_node_name () const { return "audiounit"; }
87         void print_parameter (uint32_t, char*, uint32_t len) const;
88     
89         bool parameter_is_audio (uint32_t) const;
90         bool parameter_is_control (uint32_t) const;
91         bool parameter_is_input (uint32_t) const;
92         bool parameter_is_output (uint32_t) const;
93     
94         XMLNode& get_state();
95         int set_state(const XMLNode& node);
96         
97         bool save_preset (string name);
98         bool load_preset (const string preset_label);
99         std::vector<std::string> get_presets ();
100     
101         bool has_editor () const;
102         
103         bool fixed_io() const { return false; }
104         int32_t can_support_input_configuration (int32_t in);
105         int32_t compute_output_streams (int32_t nplugins);
106         uint32_t output_streams() const;
107         uint32_t input_streams() const;
108
109         boost::shared_ptr<CAAudioUnit> get_au () { return unit; }
110         boost::shared_ptr<CAComponent> get_comp () const { return comp; }
111     
112         OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
113                                  const AudioTimeStamp    *inTimeStamp,
114                                  UInt32       inBusNumber,
115                                  UInt32       inNumberFrames,
116                                  AudioBufferList*       ioData);
117   private:
118         boost::shared_ptr<CAComponent> comp;
119         boost::shared_ptr<CAAudioUnit> unit;
120
121         AudioStreamBasicDescription streamFormat;
122         bool initialized;
123         int format_set;
124         AudioBufferList* buffers;
125         
126         UInt32 global_elements;
127         UInt32 output_elements;
128         UInt32 input_elements;
129         
130         int set_output_format ();
131         int set_input_format ();
132         int set_stream_format (int scope, uint32_t cnt);
133         int _set_block_size (nframes_t nframes);
134         void discover_parameters ();
135
136         std::vector<std::pair<uint32_t, uint32_t> > parameter_map;
137         uint32_t current_maxbuf;
138         nframes_t current_offset;
139         nframes_t cb_offset;
140         vector<Sample*>* current_buffers;
141         nframes_t frames_processed;
142         
143         std::vector<AUParameterDescriptor> descriptors;
144         void init ();
145 };
146         
147 typedef boost::shared_ptr<AUPlugin> AUPluginPtr;
148
149 class AUPluginInfo : public PluginInfo {
150   public:       
151          AUPluginInfo (boost::shared_ptr<CAComponentDescription>);
152         ~AUPluginInfo ();
153
154         PluginPtr load (Session& session);
155
156         static PluginInfoList discover ();
157         static void get_names (CAComponentDescription&, std::string& name, Glib::ustring& maker);
158         static std::string stringify_descriptor (const CAComponentDescription&);
159
160   private:
161         boost::shared_ptr<CAComponentDescription> descriptor;
162
163         static void discover_music (PluginInfoList&);
164         static void discover_fx (PluginInfoList&);
165         static void discover_by_description (PluginInfoList&, CAComponentDescription&);
166 };
167
168 typedef boost::shared_ptr<AUPluginInfo> AUPluginInfoPtr;
169
170 } // namespace ARDOUR
171
172 #endif // __ardour_audio_unit_h__