27 #include "ardour/debug.h"
35 MidiBuffer::MidiBuffer(
size_t capacity)
91 assert (&src !=
this);
97 if (dst_offset == 0) {
106 if (ev.
time() >= src_offset && ev.
time() < (nframes+src_offset)) {
109 cerr <<
"MIDI event @ " << ev.
time() <<
" skipped, not within range "
110 << src_offset <<
" .. " << (nframes + src_offset) << endl;
122 assert (mbuf !=
this);
138 const size_t stamp_size =
sizeof(
TimeType);
141 cerr <<
"MidiBuffer::push_back failed (buffer is full)" << endl;
147 cerr <<
"WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
163 const size_t stamp_size =
sizeof(
TimeType);
169 for (
size_t i=0; i <
size; ++i) {
181 cerr <<
"MidiBuffer::push_back2 failed (buffer is full; _size = " <<
_size <<
" capacity "
182 <<
_capacity <<
" stamp " << stamp_size <<
" size = " << size <<
")" << endl;
188 cerr <<
"WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
193 *(
reinterpret_cast<TimeType*
>((uintptr_t)write_loc)) = time;
194 memcpy(write_loc + stamp_size, data, size);
196 _size += stamp_size +
size;
209 const size_t stamp_size =
sizeof(
TimeType);
210 const size_t bytes_to_merge = stamp_size + ev.
size();
213 cerr <<
"MidiBuffer::push_back failed (buffer is full)" << endl;
220 ssize_t insert_offset = -1;
222 if ((*m).time() < t) {
225 if ((*m).time() == t) {
226 const uint8_t our_midi_status_byte = *(
_data + m.offset +
sizeof (
TimeType));
231 insert_offset = m.offset;
234 if (insert_offset == -1) {
240 for (ssize_t a =
_size + bytes_to_merge - 1, b =
_size - 1; b >= insert_offset; --b, --a) {
244 uint8_t*
const write_loc =
_data + insert_offset;
245 *(
reinterpret_cast<TimeType*
>((uintptr_t)write_loc)) = t;
246 memcpy(write_loc + stamp_size, ev.
buffer(), ev.
size());
248 _size += bytes_to_merge;
270 const size_t stamp_size =
sizeof(
TimeType);
277 *(
reinterpret_cast<TimeType*
>((uintptr_t)write_loc)) = time;
280 write_loc += stamp_size;
282 _size += stamp_size +
size;
303 bool b_first =
false;
319 if ((a) >= 0xf0 || (b) >= 0xf0 || ((a & 0xf) != (b & 0xf))) {
429 if (other.
size() == 0) {
445 while (them != other.
end()) {
447 size_t bytes_to_merge;
448 ssize_t merge_offset;
457 while (them != other.
end() && (*them).time() < (*us).time()) {
458 if (merge_offset == -1) {
459 merge_offset = them.
offset;
461 bytes_to_merge +=
sizeof (
TimeType) + (*them).size();
480 if (bytes_to_merge) {
481 assert(merge_offset >= 0);
485 _size += bytes_to_merge;
490 us.
offset += bytes_to_merge;
495 if (them == other.
end()) {
503 if ((*us).time() == (*them).time()) {
506 string_compose (
"simultaneous MIDI events discovered during merge, times %1/%2 status %3/%4\n",
507 (*us).time(), (*them).time(),
522 bytes_to_merge =
sizeof (
TimeType) + (*them).size();
530 _size += bytes_to_merge;
535 us.
offset += bytes_to_merge;
562 while (us !=
end() && (*us).time() <= (*them).time()) {
static bool second_simultaneous_midi_byte_is_first(uint8_t, uint8_t)
#define MIDI_CMD_NOTE_OFF
LIBPBD_API void stacktrace(std::ostream &out, int levels=0)
#define MIDI_CMD_CHANNEL_PRESSURE
static bool midi_event_is_valid(const uint8_t *buffer, size_t len)
#define MIDI_CMD_PGM_CHANGE
LIBARDOUR_API uint64_t MidiIO
void silence(framecnt_t nframes, framecnt_t offset=0)
uint8_t * _data
timestamp, event, timestamp, event, ...
uint8_t * reserve(TimeType time, size_t size)
uint32_t write(TimeType time, Evoral::EventType type, uint32_t size, const uint8_t *buf)
bool merge_in_place(const MidiBuffer &other)
#define DEBUG_TRACE(bits, str)
void merge_from(const Buffer &src, framecnt_t nframes, framecnt_t dst_offset=0, framecnt_t src_offset=0)
void copy(const MidiBuffer ©)
LIBPBD_API uint64_t debug_bits
#define DEBUG_STR_APPEND(id, s)
bool push_back(const Evoral::MIDIEvent< TimeType > &event)
int cache_aligned_malloc(void **memptr, size_t size)
bool insert_event(const Evoral::MIDIEvent< TimeType > &event)
const uint8_t * buffer() const
void read_from(const Buffer &src, framecnt_t nframes, framecnt_t dst_offset=0, framecnt_t src_offset=0)
#define DEBUG_STR_DECL(id)
#define MIDI_CMD_NOTE_PRESSURE
std::string string_compose(const std::string &fmt, const T1 &o1)