#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
+#include <glibmm/convert.h>
#include "pbd/floating.h"
#include "pbd/locale_guard.h"
#include "ardour/filesystem_paths.h"
#include "ardour/audio_buffer.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
memset (&_timeInfo, 0, sizeof(_timeInfo));
}
+VSTPlugin::VSTPlugin (const VSTPlugin& other)
+ : Plugin (other)
+ , _handle (other._handle)
+ , _state (other._state)
+ , _plugin (other._plugin)
+ , _pi (other._pi)
+ , _num (other._num)
+ , _midi_out_buf (other._midi_out_buf)
+ , _transport_frame (0)
+ , _transport_speed (0.f)
+ , _parameter_defaults (other._parameter_defaults)
+{
+ memset (&_timeInfo, 0, sizeof(_timeInfo));
+}
+
VSTPlugin::~VSTPlugin ()
{
}
float
-VSTPlugin::default_value (uint32_t)
+VSTPlugin::default_value (uint32_t which)
{
- return 0;
+ return _parameter_defaults[which];
}
float
VSTPlugin::set_chunk (gchar const * data, bool single)
{
gsize size = 0;
+ int r = 0;
guchar* raw_data = g_base64_decode (data, &size);
- int const r = _plugin->dispatcher (_plugin, 24 /* effSetChunk */, single ? 1 : 0, size, raw_data, 0);
+ {
+ pthread_mutex_lock (&_state->state_lock);
+ r = _plugin->dispatcher (_plugin, 24 /* effSetChunk */, single ? 1 : 0, size, raw_data, 0);
+ pthread_mutex_unlock (&_state->state_lock);
+ }
g_free (raw_data);
return r;
}
desc.toggled = prop.flags & kVstParameterIsSwitch;
desc.logarithmic = false;
desc.sr_dependent = false;
- desc.label = prop.label;
+ desc.label = Glib::locale_to_utf8 (prop.label);
} else {
_plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);
- desc.label = label;
+ desc.label = Glib::locale_to_utf8 (label);
desc.integer_step = false;
desc.lower = 0.0f;
desc.upper = 1.0f;
desc.sr_dependent = false;
}
+ desc.normal = get_parameter (which);
+ if (_parameter_defaults.find (which) == _parameter_defaults.end ()) {
+ _parameter_defaults[which] = desc.normal;
+ }
+
return 0;
}
sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index);
#endif
_state->want_program = index;
+ LoadPresetProgram (); /* EMIT SIGNAL */ /* used for macvst */
return true;
}
_state->wanted_chunk = raw_data;
_state->wanted_chunk_size = size;
_state->want_chunk = 1;
+ LoadPresetProgram (); /* EMIT SIGNAL */ /* used for macvst */
return true;
}
}
{
Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
+ if (pthread_mutex_trylock (&_state->state_lock)) {
+ /* by convention 'effSetChunk' should not be called while processing
+ * http://www.reaper.fm/sdk/vst/vst_ext.php
+ *
+ * All VSTs don't use in-place, PluginInsert::connect_and_run()
+ * does clear output buffers, so we can just return.
+ */
+ return 0;
+ }
+
_transport_frame = start;
_transport_speed = speed;
_plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
_midi_out_buf = 0;
+ pthread_mutex_unlock (&_state->state_lock);
return 0;
}