X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Faudio_unit.h;h=36e82da802ebbe9ea08748d944172e4e814e9fe9;hb=5bc4e54b7da3eb139d699c6e371d43540c69b519;hp=74edd4a3c22c0ab90d244c0274ce1ad1872f79b8;hpb=ee725fbe915dfc81fb10a58045419566a917f206;p=ardour.git diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 74edd4a3c2..36e82da802 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2006 Paul Davis + Copyright (C) 2006 Paul Davis Written by Taybin Rutkin This program is free software; you can redistribute it and/or modify @@ -64,8 +64,8 @@ class AUPlugin : public ARDOUR::Plugin AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr comp); AUPlugin (const AUPlugin& other); virtual ~AUPlugin (); - - std::string unique_id () const; + + std::string unique_id () const; const char * label () const; const char * name () const { return _info->name.c_str(); } const char * maker () const { return _info->creator.c_str(); } @@ -74,14 +74,14 @@ class AUPlugin : public ARDOUR::Plugin framecnt_t signal_latency() const; void set_parameter (uint32_t which, float val); float get_parameter (uint32_t which) const; - + int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; uint32_t nth_parameter (uint32_t which, bool& ok) const; void activate (); void deactivate (); void flush (); int set_block_size (pframes_t nframes); - + int connect_and_run (BufferSet& bufs, ChanMapping in, ChanMapping out, pframes_t nframes, framecnt_t offset); @@ -89,41 +89,43 @@ class AUPlugin : public ARDOUR::Plugin std::string describe_parameter (Evoral::Parameter); std::string state_node_name () const { return "audiounit"; } void print_parameter (uint32_t, char*, uint32_t len) const; - + bool parameter_is_audio (uint32_t) const; bool parameter_is_control (uint32_t) const; bool parameter_is_input (uint32_t) const; bool parameter_is_output (uint32_t) const; - - int set_state(const XMLNode& node, int); - PresetRecord save_preset (std::string name); + void set_info (PluginInfoPtr); + + int set_state(const XMLNode& node, int); + bool load_preset (PresetRecord); std::string current_preset() const; bool has_editor () const; - - bool reconfigurable_io() const { return true; } + bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + ChanCount output_streams() const; + ChanCount input_streams() const; bool configure_io (ChanCount in, ChanCount out); bool requires_fixed_size_buffers() const; - void set_fixed_size_buffers (bool yn) { + void set_fixed_size_buffers (bool yn) { _requires_fixed_size_buffers = yn; } boost::shared_ptr get_au () { return unit; } boost::shared_ptr get_comp () const { return comp; } - - OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags, - const AudioTimeStamp *inTimeStamp, - UInt32 inBusNumber, - UInt32 inNumberFrames, - AudioBufferList* ioData); + + OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList* ioData); /* "host" callbacks */ - OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat, + OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat, Float64* outCurrentTempo); OSStatus get_musical_time_location_callback (UInt32* outDeltaSampleOffsetToNextBeat, @@ -140,13 +142,28 @@ class AUPlugin : public ARDOUR::Plugin static std::string maybe_fix_broken_au_id (const std::string&); + /* this MUST be called from thread in which you want to receive notifications + about parameter changes. + */ + int create_parameter_listener (AUEventListenerProc callback, void *arg, float interval_secs); + /* these can be called from any thread but SHOULD be called from the same thread + that will receive parameter change notifications. + */ + int listen_to_parameter (uint32_t param_id); + int end_listen_to_parameter (uint32_t param_id); + + + protected: + std::string do_save_preset (std::string name); + void do_remove_preset (std::string); + private: void find_presets (); - - boost::shared_ptr comp; - boost::shared_ptr unit; - - bool initialized; + + boost::shared_ptr comp; + boost::shared_ptr unit; + + bool initialized; int32_t input_channels; int32_t output_channels; std::vector > io_configs; @@ -173,37 +190,43 @@ class AUPlugin : public ARDOUR::Plugin UInt32 global_elements; 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&); void discover_parameters (); void add_state (XMLNode *) const; - std::vector > parameter_map; - uint32_t current_maxbuf; - framecnt_t current_offset; - framecnt_t cb_offset; - BufferSet* current_buffers; - framecnt_t frames_processed; - + typedef std::map ParameterMap; + ParameterMap parameter_map; + uint32_t input_maxbuf; + framecnt_t input_offset; + framecnt_t cb_offset; + BufferSet* input_buffers; + framecnt_t frames_processed; + std::vector descriptors; + AUEventListenerRef _parameter_listener; + void * _parameter_listener_arg; void init (); void discover_factory_presets (); bool last_transport_rolling; 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); }; - + typedef boost::shared_ptr AUPluginPtr; -struct AUPluginCachedInfo { +struct AUPluginCachedInfo { std::vector > io_configs; }; class AUPluginInfo : public PluginInfo { - public: + public: AUPluginInfo (boost::shared_ptr); ~AUPluginInfo (); @@ -217,16 +240,18 @@ class AUPluginInfo : public PluginInfo { AUPluginCachedInfo cache; + bool reconfigurable_io() const { return true; } + static PluginInfoList* discover (); static void get_names (CAComponentDescription&, std::string& name, std::string& maker); - static std::string stringify_descriptor (const CAComponentDescription&); + static std::string stringify_descriptor (const CAComponentDescription&); static int load_cached_info (); private: boost::shared_ptr descriptor; UInt32 version; - + static void discover_music (PluginInfoList&); static void discover_fx (PluginInfoList&); static void discover_generators (PluginInfoList&); @@ -236,10 +261,10 @@ class 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 void add_cached_info (const std::string&, AUPluginCachedInfo&); - static void save_cached_info (); + static void save_cached_info (); }; typedef boost::shared_ptr AUPluginInfoPtr;