X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Faudio_unit.h;h=f36e89073bb53cd82e38c5f450cb2c67d9d2cb1e;hb=a473d630eb165272992e90f8d854b1d66ec0be63;hp=d82425765d9a7d9afc63598c34934791d342fbe2;hpb=5695b1790e3fdee4f15a45ed507e41ac866917cd;p=ardour.git diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index d82425765d..f36e89073b 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2006 Paul Davis - Written by Taybin Rutkin + Copyright (C) 2006 Paul Davis + Written by Taybin Rutkin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,13 +22,19 @@ #define __ardour_audio_unit_h__ #include +#include #include #include #include #include +#include + +#include "ardour/plugin.h" -#include +#include +#include +#include "appleutility/AUParamInfo.h" #include @@ -42,76 +48,198 @@ namespace ARDOUR { class AudioEngine; class Session; +struct AUParameterDescriptor : public Plugin::ParameterDescriptor { + // additional fields to make operations more efficient + AudioUnitParameterID id; + AudioUnitScope scope; + AudioUnitElement element; + float default_value; + bool automatable; + AudioUnitParameterUnit unit; +}; + class AUPlugin : public ARDOUR::Plugin { public: - AUPlugin (AudioEngine& engine, Session& session, CAComponent* comp); + AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr comp); + AUPlugin (const AUPlugin& other); virtual ~AUPlugin (); - - uint32_t 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; + const char * maker () const { return _info->creator.c_str(); } uint32_t parameter_count () const; float default_value (uint32_t port); - nframes_t latency () const; + 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 set_block_size (nframes_t nframes); - - int connect_and_run (vector& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, nframes_t nframes, nframes_t offset); - std::set automatable() const; - string describe_parameter (uint32_t); - string state_node_name () const { return "audiounit"; } + 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); + std::set automatable() const; + 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; - - XMLNode& get_state(); - int set_state(const XMLNode& node); - - bool save_preset (string name); - bool load_preset (const string preset_label); - std::vector get_presets (); - + + int set_state(const XMLNode& node, int); + + PresetRecord save_preset (std::string name); + bool load_preset (PresetRecord); + std::string current_preset() const; + bool has_editor () const; - - CAAudioUnit* get_au () { return unit; } - CAComponent* get_comp () { return comp; } - - private: - CAComponent* comp; - CAAudioUnit* unit; - AudioBufferList* in_list; - AudioBufferList* out_list; + bool reconfigurable_io() const { return true; } + bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool configure_io (ChanCount in, ChanCount out); + bool requires_fixed_size_buffers() const; + + 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); + + /* "host" callbacks */ + + OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat, + Float64* outCurrentTempo); + + OSStatus get_musical_time_location_callback (UInt32* outDeltaSampleOffsetToNextBeat, + Float32* outTimeSig_Numerator, + UInt32* outTimeSig_Denominator, + Float64* outCurrentMeasureDownBeat); + + OSStatus get_transport_state_callback (Boolean* outIsPlaying, + Boolean* outTransportStateChanged, + Float64* outCurrentSampleInTimeLine, + Boolean* outIsCycling, + Float64* outCycleStartBeat, + Float64* outCycleEndBeat); + + static std::string maybe_fix_broken_au_id (const std::string&); + + private: + void find_presets (); + + boost::shared_ptr comp; + boost::shared_ptr unit; + + bool initialized; + int32_t input_channels; + int32_t output_channels; + std::vector > io_configs; + pframes_t _current_block_size; + framecnt_t _last_nframes; + bool _requires_fixed_size_buffers; + AudioBufferList* buffers; + bool _has_midi_input; + bool _has_midi_output; + + /* despite all the cool work that apple did on their AU preset + system, they left factory presets and user presets as two + entirely different kinds of things, handled by two entirely + different parts of the API. Resolve this. + */ + + /* XXX these two maps should really be shared across all instances of this AUPlugin */ + + typedef std::map UserPresetMap; + UserPresetMap user_preset_map; + typedef std::map FactoryPresetMap; + FactoryPresetMap factory_preset_map; + + 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; + + std::vector descriptors; + void init (); + + void discover_factory_presets (); + + bool last_transport_rolling; + float last_transport_speed; }; typedef boost::shared_ptr AUPluginPtr; +struct AUPluginCachedInfo { + std::vector > io_configs; +}; + class AUPluginInfo : public PluginInfo { - public: - AUPluginInfo () { }; + public: + AUPluginInfo (boost::shared_ptr); ~AUPluginInfo (); - CAComponentDescription* desc; - - static PluginInfoList discover (); PluginPtr load (Session& session); + bool needs_midi_input (); + bool is_effect () const; + bool is_effect_without_midi_input () const; + bool is_effect_with_midi_input () const; + bool is_instrument () const; + + AUPluginCachedInfo cache; + + static PluginInfoList* discover (); + static void get_names (CAComponentDescription&, std::string& name, std::string& maker); + static std::string stringify_descriptor (const CAComponentDescription&); + + static int load_cached_info (); + private: - static std::string get_name (CAComponentDescription&); - void setup_nchannels (CAComponentDescription&); + boost::shared_ptr descriptor; + UInt32 version; + + static void discover_music (PluginInfoList&); + static void discover_fx (PluginInfoList&); + static void discover_generators (PluginInfoList&); + static void discover_instruments (PluginInfoList&); + static void discover_by_description (PluginInfoList&, CAComponentDescription&); + static Glib::ustring au_cache_path (); + + 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 (); }; typedef boost::shared_ptr AUPluginInfoPtr;