// FIXME: mirroring for MIDI buffers?
MidiBuffer::MidiBuffer(size_t capacity)
: Buffer(DataType::MIDI, capacity)
- , _size(0)
, _data(0)
{
if (capacity) {
_silent = src.silent();
}
+void
+MidiBuffer::merge_from (const Buffer& src, nframes_t nframes, nframes_t dst_offset, nframes_t src_offset)
+{
+ const MidiBuffer* mbuf = dynamic_cast<const MidiBuffer*>(&src);
+ assert (mbuf);
+ assert (mbuf != this);
+
+ /* XXX use nframes, and possible offsets */
+ merge_in_place (*mbuf);
+}
+
/** Push an event into the buffer.
*
* Note that the raw MIDI pointed to by ev will be COPIED and unmodified.
return false;
}
+ push_back(ev.time(), ev.size(), ev.buffer());
+
+ return true;
+}
+
+
+/** Push an event into the buffer.
+ * @return false if operation failed (not enough room)
+ */
+bool
+MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data)
+{
+ const size_t stamp_size = sizeof(TimeType);
+ /*cerr << "MidiBuffer: pushing event @ " << ev.time()
+ << " size = " << ev.size() << endl;*/
+
+ if (_size + stamp_size + size >= _capacity) {
+ cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
+ return false;
+ }
+
+ if (!Evoral::midi_event_is_valid(data, size)) {
+ cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
+ return false;
+ }
+
uint8_t* const write_loc = _data + _size;
- *((TimeType*)write_loc) = ev.time();
- memcpy(write_loc + stamp_size, ev.buffer(), ev.size());
+ *((TimeType*)write_loc) = time;
+ memcpy(write_loc + stamp_size, data, size);
- _size += stamp_size + ev.size();
+ _size += stamp_size + size;
_silent = false;
return true;