X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Faudio_unit.h;h=407be7a6dc414d692ee03c7a3e2cb2dbe6b5ef12;hb=21102b45d0d22f2761697b1b9fdfa92aafc25834;hp=07f41f55261b0d304673918e9497966e84623339;hpb=f4b5f4c72ee60b6f509e307c5bfd164108d1f30b;p=ardour.git diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 07f41f5526..407be7a6dc 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -34,28 +34,27 @@ #include #include -#include "appleutility/AUParamInfo.h" +#include "AUParamInfo.h" #include class CAComponent; class CAAudioUnit; class CAComponentDescription; -struct LIBARDOUR_API AudioBufferList; +struct AudioBufferList; namespace ARDOUR { class AudioEngine; class Session; -struct LIBARDOUR_API AUParameterDescriptor : public Plugin::ParameterDescriptor { +struct LIBARDOUR_API AUParameterDescriptor : public ParameterDescriptor { // additional fields to make operations more efficient AudioUnitParameterID id; AudioUnitScope scope; AudioUnitElement element; - float default_value; bool automatable; - AudioUnitParameterUnit unit; + AudioUnitParameterUnit au_unit; }; class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin @@ -71,10 +70,12 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin const char * maker () const { return _info->creator.c_str(); } uint32_t parameter_count () const; float default_value (uint32_t port); - framecnt_t signal_latency() const; + samplecnt_t signal_latency() const; void set_parameter (uint32_t which, float val); float get_parameter (uint32_t which) const; + PluginOutputConfiguration possible_output () const { return _output_configs; } + int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; uint32_t nth_parameter (uint32_t which, bool& ok) const; void activate (); @@ -83,10 +84,12 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin int set_block_size (pframes_t nframes); int connect_and_run (BufferSet& bufs, - ChanMapping in, ChanMapping out, - pframes_t nframes, framecnt_t offset); + samplepos_t start, samplepos_t end, double speed, + ChanMapping in, ChanMapping out, + pframes_t nframes, samplecnt_t offset); std::set automatable() const; std::string describe_parameter (Evoral::Parameter); + IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const; std::string state_node_name () const { return "audiounit"; } void print_parameter (uint32_t, char*, uint32_t len) const; @@ -94,7 +97,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin bool parameter_is_control (uint32_t) const; bool parameter_is_input (uint32_t) const; bool parameter_is_output (uint32_t) const; - + void set_info (PluginInfoPtr); int set_state(const XMLNode& node, int); @@ -104,7 +107,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin bool has_editor () const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out); + bool can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise); ChanCount output_streams() const; ChanCount input_streams() const; bool configure_io (ChanCount in, ChanCount out); @@ -120,7 +123,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, - UInt32 inNumberFrames, + UInt32 inNumberSamples, AudioBufferList* ioData); /* "host" callbacks */ @@ -167,12 +170,13 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin int32_t input_channels; int32_t output_channels; std::vector > io_configs; - pframes_t _current_block_size; - framecnt_t _last_nframes; + samplecnt_t _last_nframes; + mutable volatile guint _current_latency; bool _requires_fixed_size_buffers; AudioBufferList* buffers; bool _has_midi_input; bool _has_midi_output; + PluginOutputConfiguration _output_configs; /* despite all the cool work that apple did on their AU preset system, they left factory presets and user presets as two @@ -191,19 +195,30 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin UInt32 output_elements; UInt32 input_elements; - int set_output_format (AudioStreamBasicDescription&); - int set_input_format (AudioStreamBasicDescription&); - int set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription&); + bool variable_inputs; + bool variable_outputs; + + uint32_t configured_input_busses; + uint32_t configured_output_busses; + + uint32_t *bus_inputs; + uint32_t *bus_outputs; + std::vector _bus_name_in; + std::vector _bus_name_out; + + int set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription&); void discover_parameters (); void add_state (XMLNode *) const; typedef std::map ParameterMap; ParameterMap parameter_map; uint32_t input_maxbuf; - framecnt_t input_offset; - framecnt_t cb_offset; + samplecnt_t input_offset; + samplecnt_t *cb_offsets; BufferSet* input_buffers; - framecnt_t frames_processed; + ChanMapping * input_map; + samplecnt_t samples_processed; + uint32_t audio_input_cnt; std::vector descriptors; AUEventListenerRef _parameter_listener; @@ -212,8 +227,9 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin void discover_factory_presets (); - bool last_transport_rolling; - float last_transport_speed; + samplepos_t transport_sample; + float transport_speed; + float last_transport_speed; static void _parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value); void parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value); @@ -232,18 +248,24 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { PluginPtr load (Session& session); - bool needs_midi_input (); - bool is_effect () const; + std::vector get_presets (bool user_only) const; + + bool needs_midi_input () const; bool is_effect_without_midi_input () const; bool is_effect_with_midi_input () const; + + /* note: AU's have an explicit way to prompt for instrument/fx category */ + bool is_effect () const; bool is_instrument () const; + bool is_utility () const; AUPluginCachedInfo cache; bool reconfigurable_io() const { return true; } - static PluginInfoList* discover (); - static void get_names (CAComponentDescription&, std::string& name, std::string& maker); + static void clear_cache (); + static PluginInfoList* discover (bool scan_only); + static bool au_get_crashlog (std::string &msg); static std::string stringify_descriptor (const CAComponentDescription&); static int load_cached_info (); @@ -251,6 +273,12 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { private: boost::shared_ptr descriptor; UInt32 version; + static FILE * _crashlog_fd; + static bool _scan_only; + + static void au_start_crashlog (void); + static void au_remove_crashlog (void); + static void au_crashlog (std::string); static void discover_music (PluginInfoList&); static void discover_fx (PluginInfoList&); @@ -262,7 +290,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { typedef std::map CachedInfoMap; static CachedInfoMap cached_info; - static bool cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name); + static int cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name); static void add_cached_info (const std::string&, AUPluginCachedInfo&); static void save_cached_info (); };