From f07cb624c02c98a5ae375b26cb99c157df64d159 Mon Sep 17 00:00:00 2001 From: Hans Fugal Date: Tue, 8 Aug 2006 21:11:23 +0000 Subject: [PATCH] pull from trunk git-svn-id: svn://localhost/ardour2/branches/undo@764 d708f5d6-7413-0410-9779-e7cbd77b26cf --- ardour.dox | 6 +-- au_pluginui.cc | 45 +++++++++++++++++ gtk2_ardour/plugin_ui.h | 19 +++++++- gtk2_ardour/vst_pluginui.cc | 10 ++-- libs/ardour/ardour/audio_unit.h | 2 + libs/ardour/ardour/state_manager.h | 2 + libs/ardour/ardour/vst_plugin.h | 1 + libs/ardour/audio_unit.cc | 78 ++++++++++++++++-------------- libs/ardour/plugin_manager.cc | 2 +- libs/ardour/state_manager.cc | 3 ++ libs/ardour/vst_plugin.cc | 8 +-- libs/libsndfile/src/flac.c | 12 ++--- 12 files changed, 134 insertions(+), 54 deletions(-) create mode 100644 au_pluginui.cc diff --git a/ardour.dox b/ardour.dox index a72ecbc588..f2036d352e 100644 --- a/ardour.dox +++ b/ardour.dox @@ -971,13 +971,13 @@ ENABLE_PREPROCESSING = YES # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. @@ -1005,7 +1005,7 @@ INCLUDE_FILE_PATTERNS = # undefined via #undef or recursively expanded use the := operator # instead of the = operator. -PREDEFINED = +PREDEFINED = HAVE_COREAUDIO VST_SUPPORT HAVE_LIBLO FFT_ANALYSIS # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. diff --git a/au_pluginui.cc b/au_pluginui.cc new file mode 100644 index 0000000000..cbf493a629 --- /dev/null +++ b/au_pluginui.cc @@ -0,0 +1,45 @@ +/* + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "plugin_ui.h" + +using namespace ARDOUR; +using namespace PBD; + +AUPluginUI::AUPluginUI (boost::shared_ptr pi, boost::shared_ptr ap) + : PlugUIBase (pi), + au (ap) +{ + info << "AUPluginUI created" << endmsg; +} + +AUPluginUI::~AUPluginUI () +{ + // nothing to do here - plugin destructor destroys the GUI +} + +int +AUPluginUI::get_preferred_height () +{ + return -1; +} diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index 570a224b66..0d0055fd47 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -50,6 +50,7 @@ namespace ARDOUR { class Plugin; class VSTPlugin; class Redirect; + class AUPlugin; } namespace PBD { @@ -231,6 +232,22 @@ class VSTPluginUI : public PlugUIBase, public Gtk::VBox bool configure_handler (GdkEventConfigure*, Gtk::Socket*); void save_plugin_setting (); }; -#endif +#endif // VST_SUPPORT + +#ifdef HAVE_COREAUDIO +class AUPluginUI : public PlugUIBase +{ + public: + AUPluginUI (boost::shared_ptr, boost::shared_ptr); + ~AUPluginUI (); + + gint get_preferred_height (); + bool start_updating(GdkEventAny*) {return false;} + bool stop_updating(GdkEventAny*) {return false;} + + private: + boost::shared_ptr au; +}; +#endif // HAVE_COREAUDIO #endif /* __ardour_plugin_ui_h__ */ diff --git a/gtk2_ardour/vst_pluginui.cc b/gtk2_ardour/vst_pluginui.cc index 7adf702f4d..5e65475c46 100644 --- a/gtk2_ardour/vst_pluginui.cc +++ b/gtk2_ardour/vst_pluginui.cc @@ -31,17 +31,17 @@ using namespace Gtk; using namespace ARDOUR; using namespace PBD; -VSTPluginUI::VSTPluginUI (PluginInsert& pi, VSTPlugin& vp) +VSTPluginUI::VSTPluginUI (boost::shared_ptr pi, boost::shared_ptr vp) : PlugUIBase (pi), vst (vp) { - fst_run_editor (vst.fst()); + fst_run_editor (vst->fst()); preset_box.pack_end (bypass_button, false, false, 10); preset_box.pack_end (save_button, false, false); preset_box.pack_end (combo, false, false); - bypass_button.set_active (!insert.active()); + bypass_button.set_active (!insert->active()); pack_start (preset_box, false, false); pack_start (socket, true, true); @@ -55,7 +55,7 @@ VSTPluginUI::~VSTPluginUI () int VSTPluginUI::get_preferred_height () { - return vst.fst()->height; + return vst->fst()->height; } int @@ -69,7 +69,7 @@ VSTPluginUI::package (Gtk::Window& win) this assumes that the window's owner understands the XEmbed protocol. */ - socket.add_id (fst_get_XID (vst.fst())); + socket.add_id (fst_get_XID (vst->fst())); return 0; } diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index f437ae053a..63522d8d5c 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -88,6 +88,8 @@ class AUPlugin : public ARDOUR::Plugin private: CAComponent* comp; CAAudioUnit* unit; + + std::vector > parameter_map; }; class AUPluginInfo : public PluginInfo { diff --git a/libs/ardour/ardour/state_manager.h b/libs/ardour/ardour/state_manager.h index 19ee2e624a..99bfcfc3ce 100644 --- a/libs/ardour/ardour/state_manager.h +++ b/libs/ardour/ardour/state_manager.h @@ -35,6 +35,8 @@ class StateManager : public sigc::trackable state_id_t _current_state_id; + virtual bool should_save_state () const { return true; } + static void prohibit_save (); static void allow_save (const char* why, bool dosave); diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index 3636fe275a..5253da7b0a 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -106,6 +106,7 @@ class VSTPlugin : public ARDOUR::Plugin class VSTPluginInfo : public PluginInfo { + public: VSTPluginInfo () {} ~VSTPluginInfo () {} diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 0756f55a59..59797f3288 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -82,13 +82,13 @@ AUPlugin::unique_id () const const char * AUPlugin::label () const { - return ""; + return "AUPlugin label"; } const char * AUPlugin::maker () const { - return ""; + return "AUplugin maker"; } uint32_t @@ -100,25 +100,30 @@ AUPlugin::parameter_count () const float AUPlugin::default_value (uint32_t port) { - return 0.0; + // AudioUnits don't have default values. Maybe presets though? + return 0; } jack_nframes_t AUPlugin::latency () const { - return 0; + return unit->Latency (); } void AUPlugin::set_parameter (uint32_t which, float val) { - + unit->SetParameter (parameter_map[which].first, parameter_map[which].second, 0, val); } float AUPlugin::get_parameter (uint32_t which) const { - return 0.0; + float outValue = 0.0; + + unit->GetParameter(parameter_map[which].first, parameter_map[which].second, 0, outValue); + + return outValue; } int @@ -136,13 +141,13 @@ AUPlugin::nth_parameter (uint32_t which, bool& ok) const void AUPlugin::activate () { - + unit->GlobalReset (); } void AUPlugin::deactivate () { - + // not needed. GlobalReset () takes care of it. } void @@ -154,7 +159,19 @@ AUPlugin::set_block_size (jack_nframes_t nframes) int AUPlugin::connect_and_run (vector& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, jack_nframes_t nframes, jack_nframes_t offset) { - return -1; + AudioUnitRenderActionFlags flags = 0; + AudioTimeStamp ts; + + AudioBufferList abl; + abl.mNumberBuffers = 1; + abl.mBuffers[0].mNumberChannels = 1; + abl.mBuffers[0].mDataByteSize = nframes * sizeof(Sample); + abl.mBuffers[0].mData = &bufs[0]; + + + unit->Render (&flags, &ts, 0, 0, &abl); + + return 0; } set @@ -281,40 +298,31 @@ AUPluginInfo::discover () { PluginInfoList plugs; - int numTypes = 2; // this magic number was retrieved from the apple AUHost example. - CAComponentDescription desc; desc.componentFlags = 0; desc.componentFlagsMask = 0; desc.componentSubType = 0; desc.componentManufacturer = 0; + desc.componentType = kAudioUnitType_Effect; - for (int i = 0; i < numTypes; ++i) { - if (i == 1) { - desc.componentType = kAudioUnitType_MusicEffect; - } else { - desc.componentType = kAudioUnitType_Effect; - } + Component comp = 0; - Component comp = 0; + comp = FindNextComponent (NULL, &desc); + while (comp != NULL) { + CAComponentDescription temp; + GetComponentInfo (comp, &temp, NULL, NULL, NULL); + + AUPluginInfoPtr plug(new AUPluginInfo); + plug->name = AUPluginInfo::get_name (temp); + plug->type = PluginInfo::AudioUnit; + plug->n_inputs = 0; + plug->n_outputs = 0; + plug->category = "AudioUnit"; + plug->desc = new CAComponentDescription(temp); - comp = FindNextComponent (NULL, &desc); - while (comp != NULL) { - CAComponentDescription temp; - GetComponentInfo (comp, &temp, NULL, NULL, NULL); - - AUPluginInfoPtr plug(new AUPluginInfo); - plug->name = AUPluginInfo::get_name (temp); - plug->type = PluginInfo::AudioUnit; - plug->n_inputs = 0; - plug->n_outputs = 0; - plug->category = "AudioUnit"; - plug->desc = new CAComponentDescription(temp); - - plugs.push_back(plug); - - comp = FindNextComponent (comp, &desc); - } + plugs.push_back(plug); + + comp = FindNextComponent (comp, &desc); } return plugs; diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 096696aca5..2a753617e8 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -382,7 +382,7 @@ PluginManager::vst_discover (string path) << endl; } - PluginInfoPtr info(new PluginInfo); + PluginInfoPtr info(new VSTPluginInfo); /* what a goddam joke freeware VST is */ diff --git a/libs/ardour/state_manager.cc b/libs/ardour/state_manager.cc index bcffe381c3..153773ed30 100644 --- a/libs/ardour/state_manager.cc +++ b/libs/ardour/state_manager.cc @@ -72,6 +72,9 @@ StateManager::use_state (state_id_t id) void StateManager::save_state (std::string why) { + if (!should_save_state()) + return; + if (!_allow_save) { SaveAllowed.connect (mem_fun (*this, &StateManager::save_state)); return; diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index a551a15d28..4c09ba3440 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -488,9 +488,11 @@ VSTPluginInfo::load (Session& session) if (Config->get_use_vst()) { FSTHandle* handle; - - if ((handle = fst_load (info->path.c_str())) == 0) { - error << string_compose(_("VST: cannot load module from \"%1\""), info->path) << endmsg; + + handle = fst_load(path.c_str()); + + if ( (int)handle == -1) { + error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg; } else { plugin.reset (new VSTPlugin (session.engine(), session, handle)); } diff --git a/libs/libsndfile/src/flac.c b/libs/libsndfile/src/flac.c index 1f0872f0bd..b74a4e3253 100644 --- a/libs/libsndfile/src/flac.c +++ b/libs/libsndfile/src/flac.c @@ -128,38 +128,38 @@ static const int legal_sample_rates [] = { 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000 } ; -static inline void +static void s2flac8_array (const short *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] >> 8 ; } /* s2flac8_array */ -static inline void +static void s2flac16_array (const short *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] ; } /* s2flac16_array */ -static inline void +static void s2flac24_array (const short *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] << 8 ; } /* s2flac24_array */ -static inline void +static void i2flac8_array (const int *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] >> 24 ; } /* i2flac8_array */ -static inline void +static void i2flac16_array (const int *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] >> 16 ; } /* i2flac16_array */ -static inline void +static void i2flac24_array (const int *src, FLAC__int32 *dest, int count) { while (--count >= 0) dest [count] = src [count] >> 8 ;