return 0;
}
+bool
+VSTPlugin::requires_fixed_sized_buffers () const
+{
+ /* This controls if Ardour will split the plugin's run()
+ * on automation events in order to pass sample-accurate automation
+ * via standard control-ports.
+ *
+ * When returning true Ardour will *not* sub-divide the process-cycle.
+ * Automation events that happen between cycle-start and cycle-end will be
+ * ignored (ctrl values are interpolated to cycle-start).
+ *
+ * Note: This does not guarantee a fixed block-size.
+ * e.g The process cycle may be split when looping, also
+ * the period-size may change any time: see set_block_size()
+ */
+ if (get_info()->n_inputs.n_midi() > 0) {
+ /* we don't yet implement midi buffer offsets (for split cycles).
+ * Also session_vst callbacls uses _session.transport_sample() directly
+ * (for BBT) which is not offset for plugin cycle split.
+ */
+ return true;
+ }
+ return false;
+}
+
float
VSTPlugin::default_value (uint32_t which)
{
sha1_result_hash (&s, hash);
string const uri = string_compose (X_("VST:%1:x%2"), unique_id (), hash);
- string const str_ver = std::to_string (version ());
- string const num_params = std::to_string (parameter_count ());
if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
p = new XMLNode (X_("ChunkPreset"));
}
p->set_property (X_("uri"), uri);
- p->set_property (X_("version"), str_ver);
+ p->set_property (X_("version"), version ());
p->set_property (X_("label"), name);
- p->set_property (X_("numParams"), num_params);
+ p->set_property (X_("numParams"), parameter_count ());
if (_plugin->flags & 32) {
int
VSTPlugin::connect_and_run (BufferSet& bufs,
samplepos_t start, samplepos_t end, double speed,
- ChanMapping in_map, ChanMapping out_map,
+ ChanMapping const& in_map, ChanMapping const& out_map,
pframes_t nframes, samplecnt_t offset)
{
Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
VstEvents* v = 0;
bool valid = false;
const uint32_t buf_index_in = in_map.get(DataType::MIDI, 0, &valid);
+ /* TODO: apply offset to MIDI buffer and trim at nframes */
if (valid) {
v = bufs.get_vst_midi (buf_index_in);
}
const uint32_t buf_index_out = out_map.get(DataType::MIDI, 0, &valid);
if (valid) {
_midi_out_buf = &bufs.get_midi(buf_index_out);
- _midi_out_buf->silence(0, 0);
+ /* TODO: apply offset to MIDI buffer and trim at nframes */
+ _midi_out_buf->silence(nframes, offset);
} else {
_midi_out_buf = 0;
}
int const vst_version = _plugin->dispatcher (_plugin, effGetVstVersion, 0, 0, NULL, 0);
for (int i = 0; i < _plugin->numPrograms; ++i) {
- PresetRecord r (string_compose (X_("VST:%1:%2"), unique_id (), i), "", false);
+
+ PresetRecord r (string_compose (X_("VST:%1:%2"), unique_id (), std::setw(4), std::setfill('0'), i), "", false);
if (vst_version >= 2) {
char buf[256];