Ardour  8.12
audio_unit.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2014 David Robillard <d@drobilla.net>
3  * Copyright (C) 2007-2017 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2010 Carl Hetherington <carl@carlh.net>
5  * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #ifndef __ardour_audio_unit_h__
23 #define __ardour_audio_unit_h__
24 
25 #include <atomic>
26 #include <cstdint>
27 #include <list>
28 #include <map>
29 #include <memory>
30 #include <set>
31 #include <string>
32 #include <vector>
33 
34 #include "ardour/plugin.h"
35 
36 #include <AudioUnit/AudioUnit.h>
37 #include <AudioUnit/AudioUnitProperties.h>
38 #include "AUParamInfo.h"
39 
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 
52  // additional fields to make operations more efficient
53  AudioUnitParameterID id;
54  AudioUnitScope scope;
55  AudioUnitElement element;
57  AudioUnitParameterUnit au_unit;
58 };
59 
61 {
62  public:
63  AUPlugin (AudioEngine& engine, Session& session, std::shared_ptr<CAComponent> comp);
64  AUPlugin (const AUPlugin& other);
65  virtual ~AUPlugin ();
66 
67  std::string unique_id () const;
68  const char * label () const;
69  const char * name () const { return _info->name.c_str(); }
70  const char * maker () const { return _info->creator.c_str(); }
71  uint32_t parameter_count () const;
72  float default_value (uint32_t port);
73  void set_parameter (uint32_t which, float val, sampleoffset_t);
74  float get_parameter (uint32_t which) const;
75 
76  PluginOutputConfiguration possible_output () const { return _output_configs; }
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  void set_non_realtime (bool);
85 
87  samplepos_t start, samplepos_t end, double speed,
88  ChanMapping const& in, ChanMapping const& out,
89  pframes_t nframes, samplecnt_t offset);
90  std::set<Evoral::Parameter> automatable() const;
92  IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
93  std::string state_node_name () const { return "audiounit"; }
94 
95  bool parameter_is_audio (uint32_t) const;
96  bool parameter_is_control (uint32_t) const;
97  bool parameter_is_input (uint32_t) const;
98  bool parameter_is_output (uint32_t) const;
99 
101 
102  int set_state(const XMLNode& node, int);
103 
105  std::string current_preset() const;
106 
107  bool has_editor () const;
108 
109  bool match_variable_io (ChanCount& in, ChanCount& aux_in, ChanCount& out);
110  bool reconfigure_io (ChanCount in, ChanCount aux_in, ChanCount out);
111 
115 
116  void set_fixed_size_buffers (bool yn) {
117  _requires_fixed_size_buffers = yn;
118  }
119 
120  std::shared_ptr<CAAudioUnit> get_au () { return unit; }
121  std::shared_ptr<CAComponent> get_comp () const { return comp; }
122 
123  OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
124  const AudioTimeStamp *inTimeStamp,
125  UInt32 inBusNumber,
126  UInt32 inNumberSamples,
127  AudioBufferList* ioData);
128 
129  /* "host" callbacks */
130 
131  OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat,
132  Float64* outCurrentTempo);
133 
134  OSStatus get_musical_time_location_callback (UInt32* outDeltaSampleOffsetToNextBeat,
135  Float32* outTimeSig_Numerator,
136  UInt32* outTimeSig_Denominator,
137  Float64* outCurrentMeasureDownBeat);
138 
139  OSStatus get_transport_state_callback (Boolean* outIsPlaying,
140  Boolean* outTransportStateChanged,
141  Float64* outCurrentSampleInTimeLine,
142  Boolean* outIsCycling,
143  Float64* outCycleStartBeat,
144  Float64* outCycleEndBeat);
145 
146  /* this MUST be called from thread in which you want to receive notifications
147  * about parameter changes.
148  */
149  int create_parameter_listener (AUEventListenerProc callback, void *arg, float interval_secs);
150 
151  /* these can be called from any thread but SHOULD be called from the same thread
152  * that will receive parameter change notifications.
153  */
154  int listen_to_parameter (uint32_t param_id);
155  int end_listen_to_parameter (uint32_t param_id);
156 
157 
158  protected:
159  std::string do_save_preset (std::string name);
160  void do_remove_preset (std::string);
161 
162  private:
164  void find_presets ();
165 
166  std::shared_ptr<CAComponent> comp;
167  std::shared_ptr<CAAudioUnit> unit;
168 
171  int32_t input_channels;
173  std::vector<std::pair<int,int> > io_configs;
175  mutable std::atomic<unsigned int> _current_latency;
177  AudioBufferList* buffers;
181 
182  /* despite all the cool work that apple did on their AU preset
183  system, they left factory presets and user presets as two
184  entirely different kinds of things, handled by two entirely
185  different parts of the API. Resolve this.
186  */
187 
188  /* XXX these two maps should really be shared across all instances of this AUPlugin */
189 
190  typedef std::map<std::string,std::string> UserPresetMap;
192  typedef std::map<std::string,int> FactoryPresetMap;
194 
198 
201 
204 
205  uint32_t *bus_inputs;
206  uint32_t *bus_inused;
207  uint32_t *bus_outputs;
208  std::vector <std::string> _bus_name_in;
209  std::vector <std::string> _bus_name_out;
210 
211  int set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription&);
213  void add_state (XMLNode *) const;
214 
215  typedef std::map<uint32_t, uint32_t> ParameterMap;
217  uint32_t input_maxbuf;
223 
224  std::vector<AUParameterDescriptor> descriptors;
225  AUEventListenerRef _parameter_listener;
227  void init ();
228 
230 
235 
236  static void _parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
237  void parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
238 };
239 
241 public:
242  AUPluginInfo (std::shared_ptr<CAComponentDescription>);
244 
246 
247  std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
248 
249  bool needs_midi_input () const;
252 
253  /* note: AU's have an explicit way to prompt for instrument/fx category */
254  bool is_effect () const;
255  bool is_instrument () const;
256  bool is_utility () const;
257 
258  bool reconfigurable_io() const { return true; }
259  uint32_t max_configurable_outputs () const { return max_outputs; }
260 
261  UInt32 version;
262  uint32_t max_outputs;
263  std::vector<std::pair<int,int> > io_configs;
264 
265  static std::string convert_old_unique_id (std::string const&);
266 
267 private:
268  std::shared_ptr<CAComponentDescription> descriptor;
269 };
270 
271 typedef std::shared_ptr<AUPluginInfo> AUPluginInfoPtr;
272 
273 } // namespace ARDOUR
274 
275 #endif // __ardour_audio_unit_h__
bool is_utility() const
bool needs_midi_input() const
bool is_effect_without_midi_input() const
std::shared_ptr< CAComponentDescription > descriptor
Definition: audio_unit.h:268
bool reconfigurable_io() const
Definition: audio_unit.h:258
bool is_instrument() const
bool is_effect() const
std::vector< std::pair< int, int > > io_configs
Definition: audio_unit.h:263
AUPluginInfo(std::shared_ptr< CAComponentDescription >)
static std::string convert_old_unique_id(std::string const &)
bool is_effect_with_midi_input() const
uint32_t max_configurable_outputs() const
Definition: audio_unit.h:259
std::vector< Plugin::PresetRecord > get_presets(bool user_only) const
PluginPtr load(Session &session)
const char * label() const
bool parameter_is_control(uint32_t) const
std::string unique_id() const
uint32_t * bus_outputs
Definition: audio_unit.h:207
void set_parameter(uint32_t which, float val, sampleoffset_t)
void parameter_change_listener(void *, void *, const AudioUnitEvent *event, UInt64 host_time, Float32 new_value)
bool _requires_fixed_size_buffers
Definition: audio_unit.h:176
void set_fixed_size_buffers(bool yn)
Definition: audio_unit.h:116
void set_info(PluginInfoPtr)
samplepos_t transport_sample
Definition: audio_unit.h:231
uint32_t configured_input_busses
Definition: audio_unit.h:202
bool requires_fixed_size_buffers() const
void set_non_realtime(bool)
int connect_and_run(BufferSet &bufs, samplepos_t start, samplepos_t end, double speed, ChanMapping const &in, ChanMapping const &out, pframes_t nframes, samplecnt_t offset)
std::string describe_parameter(Evoral::Parameter)
float default_value(uint32_t port)
static void _parameter_change_listener(void *, void *, const AudioUnitEvent *event, UInt64 host_time, Float32 new_value)
const char * maker() const
Definition: audio_unit.h:70
samplecnt_t plugin_latency() const
FactoryPresetMap factory_preset_map
Definition: audio_unit.h:193
std::shared_ptr< CAComponent > comp
Definition: audio_unit.h:166
samplecnt_t input_offset
Definition: audio_unit.h:218
int32_t input_channels
Definition: audio_unit.h:171
std::vector< AUParameterDescriptor > descriptors
Definition: audio_unit.h:224
PluginOutputConfiguration _output_configs
Definition: audio_unit.h:180
UserPresetMap user_preset_map
Definition: audio_unit.h:191
ChanMapping const * input_map
Definition: audio_unit.h:221
int set_block_size(pframes_t nframes)
std::string do_save_preset(std::string name)
IOPortDescription describe_io_port(DataType dt, bool input, uint32_t id) const
bool parameter_is_input(uint32_t) const
ChanCount output_streams() const
uint32_t configured_output_busses
Definition: audio_unit.h:203
AUPlugin(const AUPlugin &other)
std::shared_ptr< CAComponent > get_comp() const
Definition: audio_unit.h:121
uint32_t * bus_inputs
Definition: audio_unit.h:205
void discover_parameters()
BufferSet * input_buffers
Definition: audio_unit.h:220
OSStatus get_transport_state_callback(Boolean *outIsPlaying, Boolean *outTransportStateChanged, Float64 *outCurrentSampleInTimeLine, Boolean *outIsCycling, Float64 *outCycleStartBeat, Float64 *outCycleEndBeat)
void add_state(XMLNode *) const
bool match_variable_io(ChanCount &in, ChanCount &aux_in, ChanCount &out)
std::vector< std::pair< int, int > > io_configs
Definition: audio_unit.h:173
bool load_preset(PresetRecord)
UInt32 global_elements
Definition: audio_unit.h:195
void discover_factory_presets()
uint32_t nth_parameter(uint32_t which, bool &ok) const
samplecnt_t _last_nframes
Definition: audio_unit.h:174
int get_parameter_descriptor(uint32_t which, ParameterDescriptor &) const
void do_remove_preset(std::string)
int set_stream_format(int scope, uint32_t bus, AudioStreamBasicDescription &)
AUPlugin(AudioEngine &engine, Session &session, std::shared_ptr< CAComponent > comp)
int listen_to_parameter(uint32_t param_id)
OSStatus get_musical_time_location_callback(UInt32 *outDeltaSampleOffsetToNextBeat, Float32 *outTimeSig_Numerator, UInt32 *outTimeSig_Denominator, Float64 *outCurrentMeasureDownBeat)
pframes_t preset_holdoff
Definition: audio_unit.h:234
samplecnt_t * cb_offsets
Definition: audio_unit.h:219
PluginOutputConfiguration possible_output() const
Definition: audio_unit.h:76
uint32_t parameter_count() const
uint32_t input_maxbuf
Definition: audio_unit.h:217
uint32_t * bus_inused
Definition: audio_unit.h:206
std::map< std::string, int > FactoryPresetMap
Definition: audio_unit.h:192
int end_listen_to_parameter(uint32_t param_id)
std::map< uint32_t, uint32_t > ParameterMap
Definition: audio_unit.h:215
std::vector< std::string > _bus_name_in
Definition: audio_unit.h:208
bool parameter_is_output(uint32_t) const
bool reconfigure_io(ChanCount in, ChanCount aux_in, ChanCount out)
bool parameter_is_audio(uint32_t) const
UInt32 input_elements
Definition: audio_unit.h:197
std::set< Evoral::Parameter > automatable() const
ParameterMap parameter_map
Definition: audio_unit.h:216
OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberSamples, AudioBufferList *ioData)
bool has_editor() const
UInt32 output_elements
Definition: audio_unit.h:196
float last_transport_speed
Definition: audio_unit.h:233
samplecnt_t samples_processed
Definition: audio_unit.h:222
int set_state(const XMLNode &node, int)
void * _parameter_listener_arg
Definition: audio_unit.h:226
std::shared_ptr< CAAudioUnit > get_au()
Definition: audio_unit.h:120
ChanCount input_streams() const
OSStatus get_beat_and_tempo_callback(Float64 *outCurrentBeat, Float64 *outCurrentTempo)
std::string state_node_name() const
Definition: audio_unit.h:93
float get_parameter(uint32_t which) const
AUEventListenerRef _parameter_listener
Definition: audio_unit.h:225
std::map< std::string, std::string > UserPresetMap
Definition: audio_unit.h:190
std::vector< std::string > _bus_name_out
Definition: audio_unit.h:209
std::atomic< unsigned int > _current_latency
Definition: audio_unit.h:175
int32_t output_channels
Definition: audio_unit.h:172
std::string current_preset() const
std::shared_ptr< CAAudioUnit > unit
Definition: audio_unit.h:167
float transport_speed
Definition: audio_unit.h:232
virtual ~AUPlugin()
AudioBufferList * buffers
Definition: audio_unit.h:177
const char * name() const
Definition: audio_unit.h:69
int create_parameter_listener(AUEventListenerProc callback, void *arg, float interval_secs)
Definition: xml++.h:114
GtkImageIconNameData name
Definition: gtkimage.h:6
#define LIBARDOUR_API
void session(lua_State *L)
PBD::PropertyDescriptor< timepos_t > start
uint32_t pframes_t
std::shared_ptr< Plugin > PluginPtr
Definition: plugin.h:63
Temporal::samplecnt_t samplecnt_t
Temporal::sampleoffset_t sampleoffset_t
Temporal::samplepos_t samplepos_t
std::shared_ptr< AUPluginInfo > AUPluginInfoPtr
Definition: audio_unit.h:271
std::shared_ptr< PluginInfo > PluginInfoPtr
Definition: plugin.h:66
std::set< uint32_t > PluginOutputConfiguration
Definition: plugin.h:68
DebugBits AudioEngine
Definition: session.h:1413
AudioUnitParameterUnit au_unit
Definition: audio_unit.h:57
AudioUnitParameterID id
Definition: audio_unit.h:53
AudioUnitElement element
Definition: audio_unit.h:55