Update of /cvsroot/audacity/audacity-src/src/effects/VST
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv22018/src/effects/VST

Modified Files:
        LoadVST.cpp VSTEffect.cpp VSTEffect.h aeffectx.h 
Log Message:
Fixes saving/loading of programs (presets) with proper handling of program 
chunks
Adds better feedback for screen readers
Fixes several GUI vs non-GUI handling issues
Fixes processing of multiple tracks (now resets properly between them)

Index: VSTEffect.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/VST/VSTEffect.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- VSTEffect.cpp       21 May 2009 04:42:05 -0000      1.34
+++ VSTEffect.cpp       24 May 2009 11:31:06 -0000      1.35
@@ -42,7 +42,7 @@
 #include "../../xml/XMLWriter.h"
 #include "FileDialog.h"
 
-#include "VSTEffect.h"          // This class's header file
+#include "VSTEffect.h"
 
 ///////////////////////////////////////////////////////////////////////////////
 //
@@ -54,9 +54,10 @@
 {
  public:
[...964 lines suppressed...]
+{
+   switch (opcode)
+   {
+      case audioMasterPinConnected:
+         return (index < mChannels ? 0 : 1);
 
+      default:
+#if defined(__WXDEBUG__)
+         wxPrintf(wxT("effect: %p opcode: %d index: %d value: %d ptr: %p opt: 
%f user: %p\n"),
+                  effect, opcode, index, value, ptr, opt, effect->user);
+#endif
+         return 0;
+   }
+
+}
+
+#endif // USE_VST
 
 // Indentation settings for Vim and Emacs and unique identifier for Arch, a
 // version control system. Please do not modify past this point.

Index: VSTEffect.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/VST/VSTEffect.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- VSTEffect.h 20 May 2009 06:33:45 -0000      1.16
+++ VSTEffect.h 24 May 2009 11:31:06 -0000      1.17
@@ -30,6 +30,8 @@
 
 typedef float (*getParameterFn)(AEffect * effect, long index);
 
+typedef AEffect *(*vstPluginMain)(audioMasterCallback audioMaster);
+
 class VSTEffect:public Effect
 {
  public:
@@ -53,6 +55,11 @@
    
    virtual void End();
 
+   // Utility methods
+
+   wxString GetString(int opcode, int index = 0);
+   void SetString(int opcode, const wxString & str, int index = 0);
+
    // VST methods
 
    long callDispatcher(long opcode, long index, long value, void *ptr, float 
opt);
@@ -61,8 +68,15 @@
    void callSetParameter(long index, float parameter);
    float callGetParameter(long index);
 
- private:
+   // VST callback
+   long int audioMaster(AEffect * effect,
+                        long int opcode,
+                        long int index,
+                        long int value,
+                        void * ptr,
+                        float opt);
 
+ private:
    bool ProcessStereo(int count,
                       WaveTrack *left,
                       WaveTrack *right,
@@ -78,12 +92,11 @@
    wxString mName;
 
    sampleCount mBlockSize;
-   float *mBuffer;
    float **mInBuffer;
    float **mOutBuffer;
    int mInputs;
    int mOutputs;
-   int mNumParameters;
+   int mChannels;
 };
 
 #endif // USE_VST

Index: aeffectx.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/VST/aeffectx.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- aeffectx.h  20 May 2009 06:33:45 -0000      1.3
+++ aeffectx.h  24 May 2009 11:31:06 -0000      1.4
@@ -85,6 +85,7 @@
 
 const int effFlagsHasEditor = 1;
 const int effFlagsCanReplacing = 1 << 4; // very likely
+const int effFlagsProgramChunks = 1 << 5; // from Ardour
 const int effFlagsIsSynth = 1 << 8; // currently unused
 
 const int effOpen = 0;
@@ -106,6 +107,8 @@
 const int effEditClose = 15;
 const int effEditIdle = 19;
 const int effEditTop = 20;
+const int effGetChunk = 23; // from Ardour
+const int effSetChunk = 24; // from Ardour
 const int effProcessEvents = 25;
 // The next one was gleaned from 
http://www.kvraudio.com/forum/viewtopic.php?p=1905347
 const int effGetProgramNameIndexed = 29;

Index: LoadVST.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/VST/LoadVST.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- LoadVST.cpp 21 May 2009 04:25:59 -0000      1.2
+++ LoadVST.cpp 24 May 2009 11:31:06 -0000      1.3
@@ -34,9 +34,23 @@
 extern "C" {
 #endif
 
-static long audioMaster(AEffect * effect, long opcode, long index,
-                        long value, void * ptr, float opt)
+typedef AEffect *(*vstPluginMain)(audioMasterCallback audioMaster);
+
+static long int audioMaster(AEffect * effect,
+                            long int opcode,
+                            long int index,
+                            long int value,
+                            void * ptr,
+                            float opt)
 {
+   // Forward to VSTEffect if it's active
+   if (effect && effect->user) {
+      VSTEffect *vst = (VSTEffect *) effect->user;
+      return vst->audioMaster(effect, opcode, index, value, ptr, opt);
+   }
+
+   // Handles operations during initialization...before VSTEffect has had a
+   // chance to set its instance pointer.
    switch (opcode)
    {
       case audioMasterVersion:
@@ -52,31 +66,33 @@
 
       default:
 #if defined(__WXDEBUG__)
-         wxPrintf(wxT("effect: %p opcode: %d index: %d value: %d ptr: %p opt: 
%f\n"),
-                  effect, opcode, index, value, ptr, opt);
-         wxLogDebug(wxT("effect: %p opcode: %d index: %d value: %d ptr: %p 
opt: %f"),
-                    effect, opcode, index, value, ptr, opt);
+         wxPrintf(wxT("effect: %p opcode: %d index: %d value: %d ptr: %p opt: 
%f user: %p\n"),
+                  effect, opcode, index, value, ptr, opt, effect->user);
+         wxLogDebug(wxT("effect: %p opcode: %d index: %d value: %d ptr: %p 
opt: %f user: %p"),
+                    effect, opcode, index, value, ptr, opt, effect->user);
 #endif
          return 0;
    }
 }
 
-typedef AEffect *(*vstPluginMain)(audioMasterCallback audioMaster);
-
 static void LoadVSTPlugin(const wxString & fname)
 {
    vstPluginMain pluginMain;
    void *module = NULL;
 
 #if defined(__WXDEBUG__)
-   wxPrintf(wxT("%s\n"), fname.c_str());
-   wxLogDebug(wxT("%s"), fname.c_str());
+//   wxPrintf(wxT("%s\n"), fname.c_str());
+//   wxLogDebug(wxT("%s"), fname.c_str());
 #endif
 
 #if defined(__WXMAC__)
+
+   // Remove the 'Contents/Info.plist' portion of the name and create a
+   // CFString
    wxString name(wxPathOnly(wxPathOnly(fname)));
    wxMacCFStringHolder path(name);
 
+   // Convert the path to a URL
    CFURLRef urlRef =
       CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                     path,
@@ -86,59 +102,84 @@
       return;
    }
 
+   // Create the bundle using the URL
    CFBundleRef bundleRef = CFBundleCreate(kCFAllocatorDefault, urlRef);
 
+   // Done with the URL
    CFRelease(urlRef);
 
+   // Bail if the bundle wasn't created
    if (bundleRef == NULL) {
       return;
    }
 
+   // Try to locate the new plugin entry point
    pluginMain = (vstPluginMain)
       CFBundleGetFunctionPointerForName(bundleRef,
                                         CFSTR("VSTPluginMain"));
+
+   // If not found, try finding the old entry point
    if (pluginMain == NULL) {
       pluginMain = (vstPluginMain)
          CFBundleGetFunctionPointerForName(bundleRef,
                                            CFSTR("main_macho"));
    }
 
+   // Must not be a VST plugin
    if (pluginMain == NULL) {
       CFRelease(bundleRef);
       return;
    }
 
+   // Save the bundle reference
    module = bundleRef;
+
 #else
+
+   // Try to load the library
    wxDynamicLibrary *lib = new wxDynamicLibrary(fname);
    if (!lib) {
       return;
    }
 
+   // Bail if it wasn't successful
    if (!lib->IsLoaded()) {
       delete lib;
       return;
    }
 
-   pluginMain = (vstPluginMain) lib->GetSymbol(wxT("main"));
-   if (pluginMain == NULL) {
-      delete lib;
-      return;
+   // Try to find the entry point, while suppressing error messages
+   {
+      wxLogNull logNo;
+      pluginMain = (vstPluginMain) lib->GetSymbol(wxT("main"));
+      if (pluginMain == NULL) {
+         delete lib;
+         return;
+      }
    }
 
+   // Save the library reference
    module = lib;
+
 #endif
 
+   // Initialize the plugin
    AEffect *aeffect = pluginMain(audioMaster);
 
+   // Was it successful?
    if (aeffect) {
+
+      // Ensure that it looks like a plugin and can deal with ProcessReplacing
+      // calls.  Also exclude synths for now.
       if (aeffect->magic == kEffectMagic &&
          !(aeffect->flags & effFlagsIsSynth) &&
          aeffect->flags & effFlagsCanReplacing) {
 
+         // Looks good...try to create the VSTEffect
          VSTEffect *vst = new VSTEffect(fname, module, aeffect);
          if (vst != NULL) {
 
+            // Success...register it and get out
             EffectManager::Get().RegisterEffect(vst);
             return;
          }
@@ -153,6 +194,8 @@
 #endif
    }
 
+   // Only way we can get here is if something went wrong...clean up
+   
 #if defined(__WXMAC__)
    CFRelease(bundleRef);
 #else
@@ -165,9 +208,14 @@
    wxArrayString audacityPathList = wxGetApp().audacityPathList;
    wxArrayString pathList;
    wxArrayString files;
-   
+
+   // Check for the VST_PATH environment variable
    wxString vstpath = wxGetenv(wxT("VST_PATH"));
+   if (!vstpath.IsEmpty()) {
+      wxGetApp().AddUniquePathToPathList(vstpath, pathList);
+   }
 
+   // Add Audacity specific paths
    for (size_t i = 0; i < audacityPathList.GetCount(); i++) {
       wxString prefix = audacityPathList[i] + wxFILE_SEP_PATH;
       wxGetApp().AddUniquePathToPathList(prefix + wxT("VST"),
@@ -180,21 +228,27 @@
 
 #if defined(__WXMAC__)
 #define VSTPATH wxT("/Library/Audio/Plug-Ins/VST")
+
+   // Look in /Library/Audio/Plug-Ins/VST and $HOME/Library/Audio/Plug-Ins/VST
    wxGetApp().AddUniquePathToPathList(VSTPATH, pathList);
    wxGetApp().AddUniquePathToPathList(wxString(wxGetenv(wxT("HOME"))) + 
VSTPATH,
                                       pathList);
 
+   // Recursively search all paths for Info.plist files.  This will identify 
all
+   // bundles.
    wxGetApp().FindFilesInPathList(wxT("Info.plist"), pathList, files, 
wxDIR_DEFAULT);
 #elif defined(__WXMSW__)
    TCHAR dpath[MAX_PATH];
    TCHAR tpath[MAX_PATH];
    DWORD len = sizeof(tpath);
 
+   // Setup the default VST path.
    dpath[0] = '\0';
    ExpandEnvironmentStrings(_T("%ProgramFiles%\\Steinberg\\VSTPlugins"),
                             dpath,
                             sizeof(dpath));
 
+   // Check registry for the real path
    if (SHRegGetUSValue(_T("Software\\VST"),
                           _T("VSTPluginsPath"),
                           NULL,
@@ -208,11 +262,17 @@
       wxGetApp().AddUniquePathToPathList(LAT1CTOWX(dpath), pathList);
    }
 
+   // Recursively scan for all DLLs
    wxGetApp().FindFilesInPathList(wxT("*.dll"), pathList, files, 
wxDIR_DEFAULT);
+
 #else
+
+   // Recursively scan for all shared objects
    wxGetApp().FindFilesInPathList(wxT("*.so"), pathList, files);
+
 #endif
 
+   // Try loading everything found
    for (size_t i = 0; i < files.GetCount(); i++) {
       LoadVSTPlugin(files[i]);
    }


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Audacity-cvs mailing list
Audacity-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to