fixes for 98% of all the warnings/errors reported by OS X gcc on tiger
[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 #include <map>
32
33 #include "ardour/plugin.h"
34
35 #include <AudioUnit/AudioUnit.h>
36 #include <AudioUnit/AudioUnitProperties.h>
37 #include "appleutility/AUParamInfo.h"
38
39 #include <boost/shared_ptr.hpp>
40
41 class CAComponent;
42 class CAAudioUnit;
43 class CAComponentDescription;
44 struct AudioBufferList;
45
46 namespace ARDOUR {
47
48 class AudioEngine;
49 class Session;
50
51 struct AUParameterDescriptor : public Plugin::ParameterDescriptor {
52         // additional fields to make operations more efficient
53         AudioUnitParameterID id;
54         AudioUnitScope scope;
55         AudioUnitElement element;
56         float default_value;
57         bool automatable;
58         AudioUnitParameterUnit unit;
59 };
60
61 class AUPlugin : public ARDOUR::Plugin
62 {
63   public:
64         AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp);
65         AUPlugin (const AUPlugin& other);
66         virtual ~AUPlugin ();
67
68         std::string unique_id () const;
69         const char * label () const;
70         const char * name () const { return _info->name.c_str(); }
71         const char * maker () const { return _info->creator.c_str(); }
72         uint32_t parameter_count () const;
73         float default_value (uint32_t port);
74         framecnt_t signal_latency() const;
75         void set_parameter (uint32_t which, float val);
76         float get_parameter (uint32_t which) const;
77
78         int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
79         uint32_t nth_parameter (uint32_t which, bool& ok) const;
80         void activate ();
81         void deactivate ();
82         void flush ();
83         int set_block_size (pframes_t nframes);
84
85         int connect_and_run (BufferSet& bufs,
86                              ChanMapping in, ChanMapping out,
87                              pframes_t nframes, framecnt_t offset);
88         std::set<Evoral::Parameter> automatable() const;
89         std::string describe_parameter (Evoral::Parameter);
90         std::string state_node_name () const { return "audiounit"; }
91         void print_parameter (uint32_t, char*, uint32_t len) const;
92
93         bool parameter_is_audio (uint32_t) const;
94         bool parameter_is_control (uint32_t) const;
95         bool parameter_is_input (uint32_t) const;
96         bool parameter_is_output (uint32_t) const;
97
98         int set_state(const XMLNode& node, int);
99
100         bool load_preset (PresetRecord);
101         std::string current_preset() const;
102
103         bool has_editor () const;
104
105         bool reconfigurable_io() const { return true; }
106         bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
107         bool configure_io (ChanCount in, ChanCount out);
108         bool requires_fixed_size_buffers() const;
109
110         void set_fixed_size_buffers (bool yn) {
111                 _requires_fixed_size_buffers = yn;
112         }
113
114         boost::shared_ptr<CAAudioUnit> get_au () { return unit; }
115         boost::shared_ptr<CAComponent> get_comp () const { return comp; }
116
117         OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
118                                  const AudioTimeStamp       *inTimeStamp,
119                                  UInt32                      inBusNumber,
120                                  UInt32                      inNumberFrames,
121                                  AudioBufferList*            ioData);
122
123         /* "host" callbacks */
124
125         OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat,
126                                               Float64* outCurrentTempo);
127
128         OSStatus get_musical_time_location_callback (UInt32*  outDeltaSampleOffsetToNextBeat,
129                                                      Float32*  outTimeSig_Numerator,
130                                                      UInt32*   outTimeSig_Denominator,
131                                                      Float64*  outCurrentMeasureDownBeat);
132
133         OSStatus get_transport_state_callback (Boolean*  outIsPlaying,
134                                                Boolean*  outTransportStateChanged,
135                                                Float64*  outCurrentSampleInTimeLine,
136                                                Boolean*  outIsCycling,
137                                                Float64*  outCycleStartBeat,
138                                                Float64*  outCycleEndBeat);
139
140         static std::string maybe_fix_broken_au_id (const std::string&);
141
142   protected:
143         std::string do_save_preset (std::string name);
144         void do_remove_preset (std::string);
145
146   private:
147         void find_presets ();
148
149         boost::shared_ptr<CAComponent> comp;
150         boost::shared_ptr<CAAudioUnit> unit;
151
152         bool initialized;
153         int32_t input_channels;
154         int32_t output_channels;
155         std::vector<std::pair<int,int> > io_configs;
156         pframes_t _current_block_size;
157         framecnt_t _last_nframes;
158         bool _requires_fixed_size_buffers;
159         AudioBufferList* buffers;
160         bool _has_midi_input;
161         bool _has_midi_output;
162
163         /* despite all the cool work that apple did on their AU preset
164            system, they left factory presets and user presets as two
165            entirely different kinds of things, handled by two entirely
166            different parts of the API. Resolve this.
167         */
168
169         /* XXX these two maps should really be shared across all instances of this AUPlugin */
170
171         typedef std::map<std::string,std::string> UserPresetMap;
172         UserPresetMap user_preset_map;
173         typedef std::map<std::string,int> FactoryPresetMap;
174         FactoryPresetMap factory_preset_map;
175
176         UInt32 global_elements;
177         UInt32 output_elements;
178         UInt32 input_elements;
179
180         int set_output_format (AudioStreamBasicDescription&);
181         int set_input_format (AudioStreamBasicDescription&);
182         int set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription&);
183         void discover_parameters ();
184         void add_state (XMLNode *) const;
185
186         std::vector<std::pair<uint32_t, uint32_t> > parameter_map;
187         uint32_t current_maxbuf;
188         framecnt_t current_offset;
189         framecnt_t cb_offset;
190         BufferSet* current_buffers;
191         framecnt_t frames_processed;
192
193         std::vector<AUParameterDescriptor> descriptors;
194         void init ();
195
196         void discover_factory_presets ();
197
198         bool      last_transport_rolling;
199         float     last_transport_speed;
200 };
201
202 typedef boost::shared_ptr<AUPlugin> AUPluginPtr;
203
204 struct AUPluginCachedInfo {
205         std::vector<std::pair<int,int> > io_configs;
206 };
207
208 class AUPluginInfo : public PluginInfo {
209   public:
210          AUPluginInfo (boost::shared_ptr<CAComponentDescription>);
211         ~AUPluginInfo ();
212
213         PluginPtr load (Session& session);
214
215         bool needs_midi_input ();
216         bool is_effect () const;
217         bool is_effect_without_midi_input () const;
218         bool is_effect_with_midi_input () const;
219         bool is_instrument () const;
220
221         AUPluginCachedInfo cache;
222
223         static PluginInfoList* discover ();
224         static void get_names (CAComponentDescription&, std::string& name, std::string& maker);
225         static std::string stringify_descriptor (const CAComponentDescription&);
226
227         static int load_cached_info ();
228
229   private:
230         boost::shared_ptr<CAComponentDescription> descriptor;
231         UInt32 version;
232
233         static void discover_music (PluginInfoList&);
234         static void discover_fx (PluginInfoList&);
235         static void discover_generators (PluginInfoList&);
236         static void discover_instruments (PluginInfoList&);
237         static void discover_by_description (PluginInfoList&, CAComponentDescription&);
238         static Glib::ustring au_cache_path ();
239
240         typedef std::map<std::string,AUPluginCachedInfo> CachedInfoMap;
241         static CachedInfoMap cached_info;
242
243         static bool cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name);
244         static void add_cached_info (const std::string&, AUPluginCachedInfo&);
245         static void save_cached_info ();
246 };
247
248 typedef boost::shared_ptr<AUPluginInfo> AUPluginInfoPtr;
249
250 } // namespace ARDOUR
251
252 #endif // __ardour_audio_unit_h__