pull from trunk
authorHans Fugal <hans@fugal.net>
Tue, 8 Aug 2006 21:11:23 +0000 (21:11 +0000)
committerHans Fugal <hans@fugal.net>
Tue, 8 Aug 2006 21:11:23 +0000 (21:11 +0000)
git-svn-id: svn://localhost/ardour2/branches/undo@764 d708f5d6-7413-0410-9779-e7cbd77b26cf

12 files changed:
ardour.dox
au_pluginui.cc [new file with mode: 0644]
gtk2_ardour/plugin_ui.h
gtk2_ardour/vst_pluginui.cc
libs/ardour/ardour/audio_unit.h
libs/ardour/ardour/state_manager.h
libs/ardour/ardour/vst_plugin.h
libs/ardour/audio_unit.cc
libs/ardour/plugin_manager.cc
libs/ardour/state_manager.cc
libs/ardour/vst_plugin.cc
libs/libsndfile/src/flac.c

index a72ecbc5889c4cf0a9245c19a91230b6cf0a108d..f2036d352e1723173a54f47fb02bf62aad8c8fae 100644 (file)
@@ -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 (file)
index 0000000..cbf493a
--- /dev/null
@@ -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 <ardour/insert.h>
+#include <ardour/audio_unit.h>
+
+#include "plugin_ui.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<AUPlugin> 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;
+}
index 570a224b66d5baf61320b2c4db18b56c30d167f7..0d0055fd47813f977d03af40d0570298f0ca34ee 100644 (file)
@@ -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<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::AUPlugin>);
+       ~AUPluginUI ();
+       
+       gint get_preferred_height ();
+       bool start_updating(GdkEventAny*) {return false;}
+       bool stop_updating(GdkEventAny*) {return false;}
+
+  private:
+       boost::shared_ptr<ARDOUR::AUPlugin> au;
+};
+#endif // HAVE_COREAUDIO
 
 #endif /* __ardour_plugin_ui_h__ */
index 7adf702f4d38a843fbeb7a3f75188623e96ad0a5..5e65475c46acbcb155a89bffa22363eb05f39481 100644 (file)
@@ -31,17 +31,17 @@ using namespace Gtk;
 using namespace ARDOUR;
 using namespace PBD;
 
-VSTPluginUI::VSTPluginUI (PluginInsert& pi, VSTPlugin& vp)
+VSTPluginUI::VSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> 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;
 }
index f437ae053a53fa1615997061b5f555c161e2e105..63522d8d5c91a0fb599fc4325c63d44ade4d5adc 100644 (file)
@@ -88,6 +88,8 @@ class AUPlugin : public ARDOUR::Plugin
   private:
        CAComponent* comp;
     CAAudioUnit* unit;
+
+       std::vector<std::pair<uint32_t, uint32_t> > parameter_map;
 };
 
 class AUPluginInfo : public PluginInfo {
index 19ee2e624aa2f0edc6065110b5ad1b05a39cf9a8..99bfcfc3ceed22055d93be3a364791deab644db6 100644 (file)
@@ -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);
 
index 3636fe275a01efabf53b5152013b982785018bb5..5253da7b0a0ad6ca2113327d5f959af6cf70f073 100644 (file)
@@ -106,6 +106,7 @@ class VSTPlugin : public ARDOUR::Plugin
 
 class VSTPluginInfo : public PluginInfo
 {
+  public:
        VSTPluginInfo () {}
        ~VSTPluginInfo () {}
        
index 0756f55a5912c5639839fcdfb3863788afc641ea..59797f32883f847b4a5ba32f73457ca7d5b0b726 100644 (file)
@@ -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<Sample*>& 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<uint32_t>
@@ -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);
-
-                       plugs.push_back(plug);
-                       
-                       comp = FindNextComponent (comp, &desc);
-               }
+       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);
        }
 
        return plugs;
index 096696aca56dc67b8bf97522eef03b648a85a041..2a753617e88967b8ae87bb9c5f9857c1af2c1187 100644 (file)
@@ -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 */
 
index bcffe381c382be341f3ef1b90c7d89b82f4383f2..153773ed30c8cc54778b69793de93b03d144126f 100644 (file)
@@ -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;
index a551a15d280d346ef85cd6818491fb1ca8e076e7..4c09ba34401ed848a7e84e5bd19bf642e39480b0 100644 (file)
@@ -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));
                        }
index 1f0872f0bd77254c44467b9d9b31dbb7520a81f7..b74a4e3253df98374b2a6937f2e462a2b577a582 100644 (file)
@@ -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 ;