You are not logged in.

#1 2006-02-09 02:37:13

funkmuscle
Member
Registered: 2006-02-09
Posts: 509

ardour build with vst support.

Hey,

I been trying to build Ardour with vst support but I get this error message:

scons  BUILD_SSE_OPTIMIZATIONS=1  USE_SSE_EVERYWHERE=0 VST=1 VSTPATH=/path/of/fst-1.7 PREFIX=/usr  KSI=no DEBUG=yes
scons: Reading SConscript files ...
Checking for C header file alsa/asoundlib.h... yes

*******************************
detected DIST_TARGET = i686
*******************************

Checking for internationalization support ...
Checking for C header file libintl.h... yes
Checking for C header file /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h... no
Checking for C function posix_memalign()... yes
Checking for C function getmntent()... yes
Checking for jack_client_open()...ok
Checking for jack_recompute_total_latencies()...ok
Checking for C header file wordexp.h... yes
Checking for C header file sys/vfs.h... yes
Checking for executable gtk-config ...yes
scons: done reading SConscript files.
scons: Building targets ...
scons: `ardour.rc' is up to date.
scons: `libs/soundtouch/libsoundtouch.a' is up to date.
scons: `libs/sigc++/libsigc++.a' is up to date.
scons: `libs/pbd/libpbd.a' is up to date.
scons: `libs/midi++/libmidi++.a' is up to date.
scons: `libs/ardour/libardour.a' is up to date.
scons: `libs/gtkmm/config.h.in' is up to date.
scons: `libs/gtkmm/config.h' is up to date.
scons: `libs/gtkmm/libgtkmm.a' is up to date.
scons: `libs/gtkmmext/libgtkmmext.a' is up to date.
scons: `libs/gtk-canvas/libgtk-canvas.a' is up to date.
g++ -o gtk_ardour/ardour.bin gtk_ardour/about.o gtk_ardour/add_route_dialog.o gtk_ardour/ardour_dialog.o gtk_ardour/ardour_message.o gtk_ardour/ardour_ui.o gtk_ardour/ardour_ui2.o gtk_ardour/ardour_ui_dependents.o gtk_ardour/ardour_ui_dialogs.o gtk_ardour/ardour_ui_ed.o gtk_ardour/ardour_ui_mixer.o gtk_ardour/audio_clock.o gtk_ardour/audio_time_axis.o gtk_ardour/automation_gain_line.o gtk_ardour/automation_line.o gtk_ardour/automation_pan_line.o gtk_ardour/automation_time_axis.o gtk_ardour/axis_view.o gtk_ardour/canvas-imageframe.o gtk_ardour/canvas-ruler.o gtk_ardour/canvas-simpleline.o gtk_ardour/canvas-simplerect.o gtk_ardour/canvas-waveview.o gtk_ardour/connection_editor.o gtk_ardour/crossfade_edit.o gtk_ardour/crossfade_view.o gtk_ardour/curvetest.o gtk_ardour/default_keys.o gtk_ardour/editing.o gtk_ardour/editor.o gtk_ardour/editor_audiotrack.o gtk_ardour/editor_canvas_events.o gtk_ardour/editor_cursors.o gtk_ardour/editor_edit_groups.o gtk_ardour/editor_export_audio.o gtk_ardour/editor_hscroller.o gtk_ardour/editor_imageframe.o gtk_ardour/editor_keyboard.o gtk_ardour/editor_keys.o gtk_ardour/editor_markers.o gtk_ardour/editor_mixer.o gtk_ardour/editor_mouse.o gtk_ardour/editor_nudge.o gtk_ardour/editor_ops.o gtk_ardour/editor_region_list.o gtk_ardour/editor_route_list.o gtk_ardour/editor_rulers.o gtk_ardour/editor_scrub.o gtk_ardour/editor_selection_list.o gtk_ardour/editor_tempodisplay.o gtk_ardour/editor_timefx.o gtk_ardour/export_dialog.o gtk_ardour/gain_automation_time_axis.o gtk_ardour/gain_meter.o gtk_ardour/ghostregion.o gtk_ardour/grouped_buttons.o gtk_ardour/gtk-custom-hruler.o gtk_ardour/gtk-custom-ruler.o gtk_ardour/gtkscrolledwindow.o gtk_ardour/imageframe_socket_handler.o gtk_ardour/imageframe_time_axis.o gtk_ardour/imageframe_time_axis_group.o gtk_ardour/imageframe_time_axis_view.o gtk_ardour/imageframe_view.o gtk_ardour/io_selector.o gtk_ardour/keyboard.o gtk_ardour/keyboard_target.o gtk_ardour/library_ui.o gtk_ardour/location_ui.o gtk_ardour/main.o gtk_ardour/marker.o gtk_ardour/marker_time_axis.o gtk_ardour/marker_time_axis_view.o gtk_ardour/marker_view.o gtk_ardour/meter_bridge.o gtk_ardour/meter_bridge_strip.o gtk_ardour/mixer_strip.o gtk_ardour/mixer_ui.o gtk_ardour/new_session_dialog.o gtk_ardour/option_editor.o gtk_ardour/opts.o gtk_ardour/pan_automation_time_axis.o gtk_ardour/panner2d.o gtk_ardour/panner_ui.o gtk_ardour/playlist_selector.o gtk_ardour/plugin_selector.o gtk_ardour/plugin_ui.o gtk_ardour/prompter.o gtk_ardour/public_editor.o gtk_ardour/redirect_automation_line.o gtk_ardour/redirect_automation_time_axis.o gtk_ardour/redirect_box.o gtk_ardour/region_editor.o gtk_ardour/region_gain_line.o gtk_ardour/region_selection.o gtk_ardour/regionview.o gtk_ardour/route_params_ui.o gtk_ardour/route_redirect_selection.o gtk_ardour/route_ui.o gtk_ardour/selection.o gtk_ardour/send_ui.o gtk_ardour/streamview.o gtk_ardour/tempo_dialog.o gtk_ardour/time_axis_view.o gtk_ardour/time_axis_view_item.o gtk_ardour/time_selection.o gtk_ardour/utils.o gtk_ardour/version.o gtk_ardour/visual_time_axis.o gtk_ardour/vst_pluginui.o -Llibs/ardour -Llibs/gtkmmext -Llibs/midi++ -Llibs/pbd -Llibs/gtkmm -Llibs/sigc++ -Llibs/gtk-canvas -L/usr/lib -Llibs/soundtouch -lardour -lgtkmmext -lmidi++ -lpbd -lgtkmm -lsigc++ -lgtk-canvas -lart_lgpl_2 -lasound -lsndfile -llrdf -lgtk -lgdk -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm -lxml2 -lz -lm -lsoundtouch -lraptor -lcurl -lssl -lcrypto -ldl -lxslt -lxml2 -lz -lm -lsamplerate -ljack -lfst -lwine -lwine_unicode
/usr/bin/ld: cannot find -lfst
collect2: ld returned 1 exit status
scons: *** [gtk_ardour/ardour.bin] Error 1
scons: building terminated because of errors.

Does anyone know what /usr/bin/ld: cannot find -lfst means?

Thank you in advance. big_smile

Offline

#2 2006-02-09 03:08:56

Snowman
Developer/Forum Fellow
From: Montreal, Canada
Registered: 2004-08-20
Posts: 5,212

Re: ardour build with vst support.

"/usr/bin/ld: cannot find -lfst" means that it didn't found libfst.

You need to install fst before building ardour with fst support. There's no package so you'll need to build it: http://linuxaudiosystems.com/fst/

Offline

#3 2006-02-09 03:57:47

funkmuscle
Member
Registered: 2006-02-09
Posts: 509

Re: ardour build with vst support.

I do have fst-1.7 installed and I use it as a standalone to run vst programs.
some vst plugins needs a vsthost that's why I want to build Ardour with vst support.
where would I find the libfst?

Thanx Snowman. Me being from Toronto, I should be Snowman2 after the storm a few days ago. big_smile

Offline

#4 2006-02-09 06:22:44

Snowman
Developer/Forum Fellow
From: Montreal, Canada
Registered: 2004-08-20
Posts: 5,212

Re: ardour build with vst support.

Where did you installed fst? I would assume that it would come with fst.
Search your system for it:
# updatedb
# locate libfst

Offline

#5 2006-02-09 12:23:45

funkmuscle
Member
Registered: 2006-02-09
Posts: 509

Re: ardour build with vst support.

Hey Snowman, thanx again.
I looked at the Sconscript in Ardour and the one from the fst-1.7. I then edit the fst/vst section of the Ardour Sconscript.
Now I get this:

scons  BUILD_SSE_OPTIMIZATIONS=1  USE_SSE_EVERYWHERE=0 VST=1 VSTPATH=/path/to/fst-1.7 PREFIX=/usr  KSI=no DEBUG=yes
scons: Reading SConscript files ...
Checking for C header file alsa/asoundlib.h... yes

*******************************
detected DIST_TARGET = i686
*******************************

Checking for internationalization support ...
Checking for C header file libintl.h... yes
Checking for C header file /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h... no
Checking for C function posix_memalign()... yes
Checking for C function getmntent()... yes
Checking for jack_client_open()...ok
Checking for jack_recompute_total_latencies()...ok
Checking for C header file wordexp.h... yes
Checking for C header file sys/vfs.h... yes
Checking for executable gtk-config ...yes
scons: done reading SConscript files.
scons: Building targets ...
scons: `ardour.rc' is up to date.
scons: `libs/soundtouch/libsoundtouch.a' is up to date.
scons: `libs/sigc++/libsigc++.a' is up to date.
scons: `libs/pbd/libpbd.a' is up to date.
scons: `libs/midi++/libmidi++.a' is up to date.
scons: `libs/ardour/libardour.a' is up to date.
scons: `libs/gtkmm/config.h.in' is up to date.
scons: `libs/gtkmm/config.h' is up to date.
scons: `libs/gtkmm/libgtkmm.a' is up to date.
scons: `libs/gtkmmext/libgtkmmext.a' is up to date.
scons: `libs/gtk-canvas/libgtk-canvas.a' is up to date.
version_builder(["gtk_ardour/version.cc", "gtk_ardour/version.h"], ["gtk_ardour/SConscript"])
g++ -g -DARCH_X86 -msse -mfpmath=sse -DBUILD_SSE_OPTIMIZATIONS -Wall -DVST_SUPPORT -DENABLE_NLS -D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DPACKAGE="gtk_ardour" -DDATA_DIR="/usr/share" -DLOCALEDIR="/usr/share/locale" -DVERSIONSTRING="0.99.1" -Igtk_ardour -Ilibs -Ilibs/ardour -Ilibs/gtkmmext -Ilibs/midi++ -Ilibs/pbd -Ilibs/gtkmm -Ilibs/gtkmm/gdk-- -Ilibs/gtkmm/src -Ilibs/sigc++ -Ilibs/sigc++/sigc++/config -Ilibs/gtk-canvas -I/usr/include/libart-2.0 -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/include/libxml2 -Ilibs -Ilibs/soundtouch -c -o gtk_ardour/about.o gtk_ardour/about.cc
g++ -g -DARCH_X86 -msse -mfpmath=sse -DBUILD_SSE_OPTIMIZATIONS -Wall -DVST_SUPPORT -DENABLE_NLS -D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DPACKAGE="gtk_ardour" -DDATA_DIR="/usr/share" -DLOCALEDIR="/usr/share/locale" -DVERSIONSTRING="0.99.1" -Igtk_ardour -Ilibs -Ilibs/ardour -Ilibs/gtkmmext -Ilibs/midi++ -Ilibs/pbd -Ilibs/gtkmm -Ilibs/gtkmm/gdk-- -Ilibs/gtkmm/src -Ilibs/sigc++ -Ilibs/sigc++/sigc++/config -Ilibs/gtk-canvas -I/usr/include/libart-2.0 -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/include/libxml2 -Ilibs -Ilibs/soundtouch -c -o gtk_ardour/main.o gtk_ardour/main.cc
g++ -g -DARCH_X86 -msse -mfpmath=sse -DBUILD_SSE_OPTIMIZATIONS -Wall -DVST_SUPPORT -DENABLE_NLS -D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DPACKAGE="gtk_ardour" -DDATA_DIR="/usr/share" -DLOCALEDIR="/usr/share/locale" -DVERSIONSTRING="0.99.1" -Igtk_ardour -Ilibs -Ilibs/ardour -Ilibs/gtkmmext -Ilibs/midi++ -Ilibs/pbd -Ilibs/gtkmm -Ilibs/gtkmm/gdk-- -Ilibs/gtkmm/src -Ilibs/sigc++ -Ilibs/sigc++/sigc++/config -Ilibs/gtk-canvas -I/usr/include/libart-2.0 -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/include/libxml2 -Ilibs -Ilibs/soundtouch -c -o gtk_ardour/version.o gtk_ardour/version.cc
g++ -o gtk_ardour/ardour.bin gtk_ardour/about.o gtk_ardour/add_route_dialog.o gtk_ardour/ardour_dialog.o gtk_ardour/ardour_message.o gtk_ardour/ardour_ui.o gtk_ardour/ardour_ui2.o gtk_ardour/ardour_ui_dependents.o gtk_ardour/ardour_ui_dialogs.o gtk_ardour/ardour_ui_ed.o gtk_ardour/ardour_ui_mixer.o gtk_ardour/audio_clock.o gtk_ardour/audio_time_axis.o gtk_ardour/automation_gain_line.o gtk_ardour/automation_line.o gtk_ardour/automation_pan_line.o gtk_ardour/automation_time_axis.o gtk_ardour/axis_view.o gtk_ardour/canvas-imageframe.o gtk_ardour/canvas-ruler.o gtk_ardour/canvas-simpleline.o gtk_ardour/canvas-simplerect.o gtk_ardour/canvas-waveview.o gtk_ardour/connection_editor.o gtk_ardour/crossfade_edit.o gtk_ardour/crossfade_view.o gtk_ardour/curvetest.o gtk_ardour/default_keys.o gtk_ardour/editing.o gtk_ardour/editor.o gtk_ardour/editor_audiotrack.o gtk_ardour/editor_canvas_events.o gtk_ardour/editor_cursors.o gtk_ardour/editor_edit_groups.o gtk_ardour/editor_export_audio.o gtk_ardour/editor_hscroller.o gtk_ardour/editor_imageframe.o gtk_ardour/editor_keyboard.o gtk_ardour/editor_keys.o gtk_ardour/editor_markers.o gtk_ardour/editor_mixer.o gtk_ardour/editor_mouse.o gtk_ardour/editor_nudge.o gtk_ardour/editor_ops.o gtk_ardour/editor_region_list.o gtk_ardour/editor_route_list.o gtk_ardour/editor_rulers.o gtk_ardour/editor_scrub.o gtk_ardour/editor_selection_list.o gtk_ardour/editor_tempodisplay.o gtk_ardour/editor_timefx.o gtk_ardour/export_dialog.o gtk_ardour/gain_automation_time_axis.o gtk_ardour/gain_meter.o gtk_ardour/ghostregion.o gtk_ardour/grouped_buttons.o gtk_ardour/gtk-custom-hruler.o gtk_ardour/gtk-custom-ruler.o gtk_ardour/gtkscrolledwindow.o gtk_ardour/imageframe_socket_handler.o gtk_ardour/imageframe_time_axis.o gtk_ardour/imageframe_time_axis_group.o gtk_ardour/imageframe_time_axis_view.o gtk_ardour/imageframe_view.o gtk_ardour/io_selector.o gtk_ardour/keyboard.o gtk_ardour/keyboard_target.o gtk_ardour/library_ui.o gtk_ardour/location_ui.o gtk_ardour/main.o gtk_ardour/marker.o gtk_ardour/marker_time_axis.o gtk_ardour/marker_time_axis_view.o gtk_ardour/marker_view.o gtk_ardour/meter_bridge.o gtk_ardour/meter_bridge_strip.o gtk_ardour/mixer_strip.o gtk_ardour/mixer_ui.o gtk_ardour/new_session_dialog.o gtk_ardour/option_editor.o gtk_ardour/opts.o gtk_ardour/pan_automation_time_axis.o gtk_ardour/panner2d.o gtk_ardour/panner_ui.o gtk_ardour/playlist_selector.o gtk_ardour/plugin_selector.o gtk_ardour/plugin_ui.o gtk_ardour/prompter.o gtk_ardour/public_editor.o gtk_ardour/redirect_automation_line.o gtk_ardour/redirect_automation_time_axis.o gtk_ardour/redirect_box.o gtk_ardour/region_editor.o gtk_ardour/region_gain_line.o gtk_ardour/region_selection.o gtk_ardour/regionview.o gtk_ardour/route_params_ui.o gtk_ardour/route_redirect_selection.o gtk_ardour/route_ui.o gtk_ardour/selection.o gtk_ardour/send_ui.o gtk_ardour/streamview.o gtk_ardour/tempo_dialog.o gtk_ardour/time_axis_view.o gtk_ardour/time_axis_view_item.o gtk_ardour/time_selection.o gtk_ardour/utils.o gtk_ardour/version.o gtk_ardour/visual_time_axis.o gtk_ardour/vst_pluginui.o -Llibs/ardour -Llibs/gtkmmext -Llibs/midi++ -Llibs/pbd -Llibs/gtkmm -Llibs/sigc++ -Llibs/gtk-canvas -L/usr/lib -Llibs/soundtouch -lardour -lgtkmmext -lmidi++ -lpbd -lgtkmm -lsigc++ -lgtk-canvas -lart_lgpl_2 -lasound -lsndfile -llrdf -lgtk -lgdk -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm -lxml2 -lz -lm -lsoundtouch -lraptor -lcurl -lssl -lcrypto -ldl -lxslt -lxml2 -lz -lm -lsamplerate -ljack
gtk_ardour/vst_pluginui.o: In function `VSTPluginUI::package(Gtk::Window&)':
gtk_ardour/vst_pluginui.cc:78: undefined reference to `fst_get_XID'
gtk_ardour/vst_pluginui.o: In function `VSTPluginUI':
gtk_ardour/vst_pluginui.cc:40: undefined reference to `fst_run_editor'
gtk_ardour/vst_pluginui.cc:40: undefined reference to `fst_run_editor'
libs/ardour/libardour.a(audioengine.o): In function `_thread_init_callback(void*)':
libs/ardour/audioengine.cc:87: undefined reference to `fst_adopt_thread'
libs/ardour/libardour.a(globals.o): In function `ARDOUR::init(ARDOUR::AudioEngine&, bool, bool, void (*)(int, siginfo*, void*))':
libs/ardour/globals.cc:183: undefined reference to `fst_init'
libs/ardour/libardour.a(plugin_manager.o): In function `ARDOUR::PluginManager::vst_discover(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
libs/ardour/plugin_manager.cc:456: undefined reference to `fst_get_info'
libs/ardour/plugin_manager.cc:484: undefined reference to `fst_free_info'
libs/ardour/libardour.a(plugin_manager.o): In function `ARDOUR::PluginManager::load(ARDOUR::Session&, ARDOUR::PluginInfo*)':
libs/ardour/plugin_manager.cc:296: undefined reference to `fst_load'
libs/ardour/libardour.a(vst_plugin.o): In function `~VSTPlugin':
libs/ardour/vst_plugin.cc:103: undefined reference to `fst_close'
libs/ardour/vst_plugin.cc:103: undefined reference to `fst_close'
libs/ardour/vst_plugin.cc:103: undefined reference to `fst_close'
libs/ardour/libardour.a(vst_plugin.o): In function `VSTPlugin':
libs/ardour/vst_plugin.cc:91: undefined reference to `fst_instantiate'
libs/ardour/vst_plugin.cc:91: undefined reference to `fst_instantiate'
libs/ardour/vst_plugin.cc:65: undefined reference to `fst_instantiate'
libs/ardour/vst_plugin.cc:65: undefined reference to `fst_instantiate'
collect2: ld returned 1 exit status
scons: *** [gtk_ardour/ardour.bin] Error 1
scons: building terminated because of errors.

So I got further but don't know what these errors are.

Thanx again.

Offline

#6 2006-02-09 20:25:08

Snowman
Developer/Forum Fellow
From: Montreal, Canada
Registered: 2004-08-20
Posts: 5,212

Re: ardour build with vst support.

Looks like it can't find the vst header files. Were they also installed? And where? Maybe you'll need to add an argument to scons so that it can find them.

Offline

#7 2006-02-09 22:16:51

funkmuscle
Member
Registered: 2006-02-09
Posts: 509

Re: ardour build with vst support.

Yeah, that's what i was thinking but the vst files are in the .../ardour-0.99.1/libs/ardour/vst.

this seems to be the file in question:


/*
    Copyright (C) 2004 Paul Davis

    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.

    $Id: vst_plugin.cc,v 1.19 2005/11/14 16:31:05 sampo Exp $
*/

#include <algorithm>
#include <vector>
#include <string>
#include <ctype.h>

#include <cstdlib>
#include <cstdio> // so libraptor doesn't complain
#include <cmath>
#include <dirent.h>
#include <string.h> // for memmove
#include <sys/stat.h>
#include <cerrno>

#include <lrdf.h>
#include <fst.h>

#include <pbd/compose.h>
#include <pbd/error.h>
#include <pbd/pathscanner.h>
#include <pbd/xml++.h>

#include <vst/aeffectx.h>

#include <midi++/manager.h>

#include <ardour/ardour.h>
#include <ardour/session.h>
#include <ardour/audioengine.h>
#include <ardour/vst_plugin.h>

#include <pbd/stl_delete.h>

#include "i18n.h"
#include <locale.h>

using namespace ARDOUR;
using std::min;
using std::max;

VSTPlugin::VSTPlugin (AudioEngine& e, Session& session, FSTHandle* h)
    : Plugin (e, session)
{
    handle = h;

    if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
        throw failed_constructor();
    }

    _plugin = _fst->plugin;
    _plugin->user = this;

    /* set rate and blocksize */

    _plugin->dispatcher (_plugin, effSetSampleRate, 0, 0, NULL,
                 (float) session.frame_rate());
    _plugin->dispatcher (_plugin, effSetBlockSize, 0,
                 session.get_block_size(), NULL, 0.0f);
   
    /* set program to zero */

    _plugin->dispatcher (_plugin, effSetProgram, 0, 0, NULL, 0.0f);
   
    Plugin::setup_midi_controls ();
}

VSTPlugin::VSTPlugin (const VSTPlugin &other)
    : Plugin (other)
{
    handle = other.handle;

    if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
        throw failed_constructor();
    }
    _plugin = _fst->plugin;

    Plugin::setup_midi_controls ();
}

VSTPlugin::~VSTPlugin ()
{
    deactivate ();
    GoingAway (this); /* EMIT SIGNAL */
    fst_close (_fst);
}

void
VSTPlugin::set_block_size (jack_nframes_t nframes)
{
    deactivate ();
    _plugin->dispatcher (_plugin, effSetBlockSize, 0, nframes, NULL, 0.0f);
    activate ();
}

void
VSTPlugin::store_state (PluginState& state)
{
}

void
VSTPlugin::restore_state (PluginState& state)
{
}

float
VSTPlugin::default_value (uint32_t port)
{
    return 0;
}   

void
VSTPlugin::set_parameter (uint32_t which, float val)
{
    _plugin->setParameter (_plugin, which, val);
    ParameterChanged (which, val); /* EMIT SIGNAL */

    if (session().get_midi_feedback()) {
       
        if (which < parameter_count() && midi_controls[which]) {
            midi_controls[which]->send_feedback (val);
        }
    }
}

float
VSTPlugin::get_parameter (uint32_t which) const
{
    return _plugin->getParameter (_plugin, which);
   
}

uint32_t
VSTPlugin::nth_parameter (uint32_t n, bool& ok) const
{
    ok = true;
    return n;
}

XMLNode&
VSTPlugin::get_state()
{
    XMLNode *root = new XMLNode (state_node_name());
    LocaleGuard lg (X_("POSIX"));
   
    if (_plugin->flags & effFlagsProgramChunks) {

        /* fetch the current chunk */
       
        void* data;
        long  data_size;
       
        if ((data_size = _plugin->dispatcher (_plugin, effGetChunk, 0, 0, &data, false)) == 0) {
            return *root;
        }

        /* save it to a file */

        string path;
        struct stat sbuf;

        path = getenv ("HOME");
        path += "/.ardour/vst";

        if (stat (path.c_str(), &sbuf)) {
            if (errno == ENOENT) {
                if (mkdir (path.c_str(), 0600)) {
                    error << compose (_("cannot create VST chunk directory: %1"),
                              strerror (errno))
                          << endmsg;
                    return *root;
                }

            } else {

                error << compose (_("cannot check VST chunk directory: %1"),
                          strerror (errno))
                      << endmsg;
                return *root;
            }

        } else if (!S_ISDIR (sbuf.st_mode)) {
            error << compose (_("%1 exists but is not a directory"), path)
                  << endmsg;
            return *root;
        }
       
        path += "something";
       
        /* store information */

        XMLNode* chunk_node = new XMLNode (X_("chunk"));
        chunk_node->add_property ("path", path);
       
        root->add_child_nocopy (*chunk_node);
       
    } else {

        XMLNode* parameters = new XMLNode ("parameters");

        for (long n = 0; n < _plugin->numParams; ++n) {
            char index[64];
            char val[32];
            snprintf (index, sizeof (index), "param_%ld", n);
            snprintf (val, sizeof (val), "%f", _plugin->getParameter (_plugin, n));
            parameters->add_property (index, val);
        }

        root->add_child_nocopy (*parameters);
    }

    return *root;
}

int
VSTPlugin::set_state(const XMLNode& node)
{
    LocaleGuard lg (X_("POSIX"));

    if (node.name() != state_node_name()) {
        error << _("Bad node sent to VSTPlugin::set_state") << endmsg;
        return 0;
    }

    XMLNode* child;

    if ((child = find_named_node (node, X_("chunks"))) != 0) {

        return 0;

    } else if ((child = find_named_node (node, X_("parameters"))) != 0) {
       
        XMLPropertyList::const_iterator i;

        for (i = child->properties().begin(); i != child->properties().end(); ++i) {
            long param;
            float val;
            sscanf ((*i)->name().c_str(), "param_%ld", &param);
            sscanf ((*i)->value().c_str(), "%f", &val);

            _plugin->setParameter (_plugin, param, val);
        }

        return 0;
    }

    return -1;
}

int
VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
{
    VstParameterProperties prop;

    desc.min_unbound = false;
    desc.max_unbound = false;

    if (_plugin->dispatcher (_plugin, effGetParameterProperties, which, 0, &prop, 0)) {

        /* i have yet to find or hear of a VST plugin that uses this */

        if (prop.flags & kVstParameterUsesIntegerMinMax) {
            desc.lower = prop.minInteger;
            desc.upper = prop.maxInteger;
        } else {
            desc.lower = 0;
            desc.upper = 1.0;
        }
       
        if (prop.flags & kVstParameterUsesIntStep) {
           
            desc.step = prop.stepInteger;
            desc.smallstep = prop.stepInteger;
            desc.largestep = prop.stepInteger;
           
        } else if (prop.flags & kVstParameterUsesFloatStep) {
           
            desc.step = prop.stepFloat;
            desc.smallstep = prop.smallStepFloat;
            desc.largestep = prop.largeStepFloat;
           
        } else {
           
            float range = desc.upper - desc.lower;
           
            desc.step = range / 100.0f;
            desc.smallstep = desc.step / 2.0f;
            desc.largestep = desc.step * 10.0f;
        }
       
        desc.toggled = prop.flags & kVstParameterIsSwitch;
        desc.logarithmic = false;
        desc.sr_dependent = false;
        desc.label = prop.label;

    } else {

        /* old style */

        char label[64];
        label[0] = '';

        _plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);

        desc.label = label;
        desc.integer_step = false;
        desc.lower = 0.0f;
        desc.upper = 1.0f;
        desc.step = 0.01f;
        desc.smallstep = 0.005f;
        desc.largestep = 0.1f;
        desc.toggled = false;
        desc.logarithmic = false;
        desc.sr_dependent = false;
    }

    return 0;
}

bool
VSTPlugin::load_preset (string name)
{
    if (_plugin->flags & effFlagsProgramChunks) {
        error << _("no support for presets using chunks at this time")
              << endmsg;
        return false;
    }
    return Plugin::load_preset (name);
}

bool
VSTPlugin::save_preset (string name)
{
    if (_plugin->flags & effFlagsProgramChunks) {
        error << _("no support for presets using chunks at this time")
              << endmsg;
        return false;
    }
    return Plugin::save_preset (name, "vst");
}

string
VSTPlugin::describe_parameter (uint32_t param)
{
    char name[64];
    _plugin->dispatcher (_plugin, effGetParamName, param, 0, name, 0);
    return name;
}

jack_nframes_t
VSTPlugin::latency () const
{
    return _plugin->initialDelay;
}

set<uint32_t>
VSTPlugin::automatable () const
{
    set<uint32_t> ret;

    for (uint32_t i = 0; i < parameter_count(); ++i){
        ret.insert (ret.end(), i);
    }

    return ret;
}

int
VSTPlugin::connect_and_run (vector<Sample*>& bufs, uint32_t maxbuf, int32_t& in_index, int32_t& out_index, jack_nframes_t nframes, jack_nframes_t offset)
{
    float *ins[_plugin->numInputs];
    float *outs[_plugin->numOutputs];
    int32_t i;

    for (i = 0; i < (int32_t) _plugin->numInputs; ++i) {
        ins[i] = bufs[min((uint32_t) in_index,maxbuf)] + offset;
        in_index++;
    }

    for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
        outs[i] = bufs[min((uint32_t) out_index,maxbuf)] + offset;

        /* unbelievably, several VST plugins still rely on Cubase
           behaviour and do not silence the buffer in processReplacing
           when they have no output.
        */
       
        // memset (outs[i], 0, sizeof (Sample) * nframes);
        out_index++;
    }


    /* we already know it can support processReplacing */

    _plugin->processReplacing (_plugin, ins, outs, nframes);
   
    return 0;
}

void
VSTPlugin::deactivate ()
{
    _plugin->dispatcher (_plugin, effMainsChanged, 0, 0, NULL, 0.0f);
}

void
VSTPlugin::activate ()
{
    _plugin->dispatcher (_plugin, effMainsChanged, 0, 1, NULL, 0.0f);
}

uint32_t
VSTPlugin::unique_id() const
{
    return _plugin->uniqueID;
}


const char *
VSTPlugin::name () const
{
    return handle->name;
}

const char *
VSTPlugin::maker () const
{
    return "imadeit";
}

const char *
VSTPlugin::label () const
{
    return handle->name;
}

uint32_t
VSTPlugin::parameter_count() const
{
    return _plugin->numParams;
}

bool
VSTPlugin::has_editor () const
{
    return _plugin->flags & effFlagsHasEditor;
}

void
VSTPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
{
    char lab[9];
    char *first_nonws;

    _plugin->dispatcher (_plugin, effGetParamLabel, param, 0, lab, 0);
    _plugin->dispatcher (_plugin, effGetParamDisplay, param, 0, buf, 0);

    if (buf[0] == '') {
        return;
    }

    first_nonws = buf;
    while (*first_nonws && isspace (*first_nonws)) {
        first_nonws++;
    }
    if (*first_nonws == '') {
        return;
    }

    memmove (buf, first_nonws, strlen (buf) - (first_nonws - buf) + 1);
}

Once again, thank you very much. People like you are the reason I left Windows.
smile  smile

Offline

Board footer

Powered by FluxBB