2 Copyright (C) 2006 Paul Davis
3 Written by Taybin Rutkin
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.
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.
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.
21 #ifndef __ardour_audio_unit_h__
22 #define __ardour_audio_unit_h__
25 #include <boost/shared_ptr.hpp>
33 #include "ardour/plugin.h"
35 #include <AudioUnit/AudioUnit.h>
36 #include <AudioUnit/AudioUnitProperties.h>
37 #include "appleutility/AUParamInfo.h"
39 #include <boost/shared_ptr.hpp>
43 class CAComponentDescription;
44 struct AudioBufferList;
51 struct AUParameterDescriptor : public Plugin::ParameterDescriptor {
52 // additional fields to make operations more efficient
53 AudioUnitParameterID id;
55 AudioUnitElement element;
58 AudioUnitParameterUnit unit;
61 class AUPlugin : public ARDOUR::Plugin
64 AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp);
65 AUPlugin (const AUPlugin& other);
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;
78 int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
79 uint32_t nth_parameter (uint32_t which, bool& ok) const;
83 int set_block_size (pframes_t nframes);
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;
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;
98 int set_state(const XMLNode& node, int);
100 bool load_preset (PresetRecord);
101 std::string current_preset() const;
103 bool has_editor () const;
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;
110 void set_fixed_size_buffers (bool yn) {
111 _requires_fixed_size_buffers = yn;
114 boost::shared_ptr<CAAudioUnit> get_au () { return unit; }
115 boost::shared_ptr<CAComponent> get_comp () const { return comp; }
117 OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
118 const AudioTimeStamp *inTimeStamp,
120 UInt32 inNumberFrames,
121 AudioBufferList* ioData);
123 /* "host" callbacks */
125 OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat,
126 Float64* outCurrentTempo);
128 OSStatus get_musical_time_location_callback (UInt32* outDeltaSampleOffsetToNextBeat,
129 Float32* outTimeSig_Numerator,
130 UInt32* outTimeSig_Denominator,
131 Float64* outCurrentMeasureDownBeat);
133 OSStatus get_transport_state_callback (Boolean* outIsPlaying,
134 Boolean* outTransportStateChanged,
135 Float64* outCurrentSampleInTimeLine,
136 Boolean* outIsCycling,
137 Float64* outCycleStartBeat,
138 Float64* outCycleEndBeat);
140 static std::string maybe_fix_broken_au_id (const std::string&);
143 std::string do_save_preset (std::string name);
144 void do_remove_preset (std::string);
147 void find_presets ();
149 boost::shared_ptr<CAComponent> comp;
150 boost::shared_ptr<CAAudioUnit> unit;
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;
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.
169 /* XXX these two maps should really be shared across all instances of this AUPlugin */
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;
176 UInt32 global_elements;
177 UInt32 output_elements;
178 UInt32 input_elements;
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;
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;
193 std::vector<AUParameterDescriptor> descriptors;
196 void discover_factory_presets ();
198 bool last_transport_rolling;
199 float last_transport_speed;
202 typedef boost::shared_ptr<AUPlugin> AUPluginPtr;
204 struct AUPluginCachedInfo {
205 std::vector<std::pair<int,int> > io_configs;
208 class AUPluginInfo : public PluginInfo {
210 AUPluginInfo (boost::shared_ptr<CAComponentDescription>);
213 PluginPtr load (Session& session);
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;
221 AUPluginCachedInfo cache;
223 static PluginInfoList* discover ();
224 static void get_names (CAComponentDescription&, std::string& name, std::string& maker);
225 static std::string stringify_descriptor (const CAComponentDescription&);
227 static int load_cached_info ();
230 boost::shared_ptr<CAComponentDescription> descriptor;
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 ();
240 typedef std::map<std::string,AUPluginCachedInfo> CachedInfoMap;
241 static CachedInfoMap cached_info;
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 ();
248 typedef boost::shared_ptr<AUPluginInfo> AUPluginInfoPtr;
250 } // namespace ARDOUR
252 #endif // __ardour_audio_unit_h__