#ifdef LV2_SUPPORT
#include "ardour/lv2_plugin.h"
#include "lv2_evbuf.h"
+#include "ardour/uri_map.h"
#endif
-#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT
#include "ardour/vestige/aeffectx.h"
#endif
_count.reset();
_available.reset();
-#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT
for (VSTBuffers::iterator i = _vst_buffers.begin(); i != _vst_buffers.end(); ++i) {
delete *i;
}
_vst_buffers.clear ();
#endif
+#ifdef LV2_SUPPORT
+ for (LV2Buffers::iterator i = _lv2_buffers.begin(); i != _lv2_buffers.end(); ++i) {
+ free ((*i).second);
+ }
+ _lv2_buffers.clear ();
+#endif
+
}
/** Set up this BufferSet so that its data structures mirror a PortSet's buffers.
* the process() callback tree anyway, so this has to be called in RT context.
*/
void
-BufferSet::get_backend_port_addresses (PortSet& ports, framecnt_t nframes)
+BufferSet::get_backend_port_addresses (PortSet& ports, samplecnt_t nframes)
{
assert (_count == ports.count ());
assert (_available == ports.count ());
for (size_t i = 0; i < num_buffers; ++i) {
bufs.push_back(Buffer::create(type, buffer_capacity));
}
-
+
_available.set(type, num_buffers);
_count.set (type, num_buffers);
}
_lv2_buffers.push_back(
std::make_pair(false, lv2_evbuf_new(buffer_capacity,
LV2_EVBUF_EVENT,
- LV2Plugin::urids.atom_Chunk,
- LV2Plugin::urids.atom_Sequence)));
+ URIMap::instance().urids.atom_Chunk,
+ URIMap::instance().urids.atom_Sequence)));
}
}
#endif
-#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT
// As above but for VST
if (type == DataType::MIDI) {
while (_vst_buffers.size() < _buffers[type].size()) {
std::make_pair(false, lv2_evbuf_new(
buffer_capacity,
LV2_EVBUF_EVENT,
- LV2Plugin::urids.atom_Chunk,
- LV2Plugin::urids.atom_Sequence));
+ URIMap::instance().urids.atom_Chunk,
+ URIMap::instance().urids.atom_Sequence));
}
LV2_Evbuf*
for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
lv2_evbuf_is_valid(i);
i = lv2_evbuf_next(i)) {
- uint32_t frames, subframes, type, size;
+ uint32_t samples, subframes, type, size;
uint8_t* data;
- lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
- if (type == LV2Plugin::urids.midi_MidiEvent) {
- mbuf.push_back(frames, size, data);
+ lv2_evbuf_get(i, &samples, &subframes, &type, &size, &data);
+ if (type == URIMap::instance().urids.midi_MidiEvent) {
+ mbuf.push_back(samples, size, data);
}
}
}
for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(evbuf);
lv2_evbuf_is_valid(i);
i = lv2_evbuf_next(i)) {
- uint32_t frames;
+ uint32_t samples;
uint32_t subframes;
uint32_t type;
uint32_t size;
uint8_t* data;
- lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
+ lv2_evbuf_get(i, &samples, &subframes, &type, &size, &data);
#ifndef NDEBUG
DEBUG_TRACE (PBD::DEBUG::LV2, string_compose ("(FLUSH) MIDI event of size %1\n", size));
for (uint16_t x = 0; x < size; ++x) {
DEBUG_TRACE (PBD::DEBUG::LV2, string_compose ("\tByte[%1] = %2\n", x, (int) data[x]));
}
#endif
- if (type == LV2Plugin::urids.midi_MidiEvent) {
+ if (type == URIMap::instance().urids.midi_MidiEvent) {
// TODO: Make Ardour event buffers generic so plugins can communicate
- mbuf.push_back(frames, size, data);
+ mbuf.push_back(samples, size, data);
}
}
}
#endif /* LV2_SUPPORT */
-#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT
VstEvents*
BufferSet::get_vst_midi (size_t b)
{
MidiBuffer& m = get_midi (b);
+ assert (b <= _vst_buffers.size());
VSTBuffer* vst = _vst_buffers[b];
vst->clear ();
}
BufferSet::VSTBuffer::VSTBuffer (size_t c)
- : _capacity (c)
+ : _events (0)
+ , _midi_events (0)
+ , _capacity (c)
{
- _events = static_cast<VstEvents*> (malloc (sizeof (VstEvents) + _capacity * sizeof (VstEvent *)));
- _midi_events = static_cast<VstMidiEvent*> (malloc (sizeof (VstMidiEvent) * _capacity));
+ if (_capacity > 0) {
+ /* from `man malloc`: "If size is 0, then malloc() returns either NULL, or a
+ * unique pointer value that can later be successfully passed to free()."
+ *
+ * The latter will cause trouble here.
+ */
+ _events = static_cast<VstEvents*> (malloc (sizeof (VstEvents) + _capacity * sizeof (VstEvent *)));
+ _midi_events = static_cast<VstMidiEvent*> (malloc (sizeof (VstMidiEvent) * _capacity));
+ }
if (_events == 0 || _midi_events == 0) {
free (_events);
free (_midi_events);
+ _events = 0;
+ _midi_events = 0;
throw failed_constructor ();
}
}
void
-BufferSet::VSTBuffer::push_back (Evoral::MIDIEvent<framepos_t> const & ev)
+BufferSet::VSTBuffer::push_back (Evoral::Event<samplepos_t> const & ev)
{
if (ev.size() > 3) {
/* XXX: this will silently drop MIDI messages longer than 3 bytes, so
*/
return;
}
- int const n = _events->numEvents;
- assert (n < (int) _capacity);
+ uint32_t const n = _events->numEvents;
+ assert (n < _capacity);
+ if (n >= _capacity) {
+ return;
+ }
_events->events[n] = reinterpret_cast<VstEvent*> (_midi_events + n);
VstMidiEvent* v = reinterpret_cast<VstMidiEvent*> (_events->events[n]);
v->type = kVstMidiType;
v->byteSize = sizeof (VstMidiEvent);
- v->deltaFrames = ev.time ();
+ v->deltaSamples = ev.time ();
v->flags = 0;
v->detune = 0;
/** Copy buffers of one type from `in' to this BufferSet */
void
-BufferSet::read_from (const BufferSet& in, framecnt_t nframes, DataType type)
+BufferSet::read_from (const BufferSet& in, samplecnt_t nframes, DataType type)
{
assert (available().get (type) >= in.count().get (type));
/** Copy buffers of all types from `in' to this BufferSet */
void
-BufferSet::read_from (const BufferSet& in, framecnt_t nframes)
+BufferSet::read_from (const BufferSet& in, samplecnt_t nframes)
{
assert(available() >= in.count());
}
void
-BufferSet::merge_from (const BufferSet& in, framecnt_t nframes)
+BufferSet::merge_from (const BufferSet& in, samplecnt_t nframes)
{
/* merge all input buffers into out existing buffers.
}
void
-BufferSet::silence (framecnt_t nframes, framecnt_t offset)
+BufferSet::silence (samplecnt_t nframes, samplecnt_t offset)
{
for (std::vector<BufferVec>::iterator i = _buffers.begin(); i != _buffers.end(); ++i) {
for (BufferVec::iterator b = i->begin(); b != i->end(); ++b) {