class MidiBuffer : public Buffer
{
public:
+ typedef nframes_t TimeType;
+
MidiBuffer(size_t capacity);
~MidiBuffer();
void copy(const MidiBuffer& copy);
- bool push_back(const Evoral::MIDIEvent& event);
+ bool push_back(const Evoral::MIDIEvent<TimeType>& event);
bool push_back(const jack_midi_event_t& event);
- uint8_t* reserve(double time, size_t size);
+ uint8_t* reserve(TimeType time, size_t size);
void resize(size_t);
bool merge(const MidiBuffer& a, const MidiBuffer& b);
bool merge_in_place(const MidiBuffer &other);
- template<typename B, typename E>
+ template<typename BufferType, typename MIDIEventType>
struct iterator_base {
- iterator_base<B,E>(B& b, size_t o) : buffer(b), offset(o) {}
- inline E operator*() const {
- uint8_t* ev_start = buffer._data + offset + sizeof(Evoral::EventTime);
- return E(EventTypeMap::instance().midi_event_type(*ev_start),
- *(Evoral::EventTime*)(buffer._data + offset),
- Evoral::midi_event_size(*ev_start) + 1, ev_start);
+ iterator_base<BufferType, MIDIEventType>(BufferType& b, size_t o) : buffer(b), offset(o) {}
+ inline MIDIEventType operator*() const {
+ uint8_t* ev_start = buffer._data + offset + sizeof(TimeType);
+ int event_size = Evoral::midi_event_size(ev_start);
+ assert(event_size >= 0);
+ return MIDIEventType(EventTypeMap::instance().midi_event_type(*ev_start),
+ *((TimeType*)(buffer._data + offset)),
+ event_size, ev_start);
}
- inline iterator_base<B,E>& operator++() {
- uint8_t* ev_start = buffer._data + offset + sizeof(Evoral::EventTime);
- offset += sizeof(Evoral::EventTime) + Evoral::midi_event_size(*ev_start) + 1;
+ inline iterator_base<BufferType, MIDIEventType>& operator++() {
+ uint8_t* ev_start = buffer._data + offset + sizeof(TimeType);
+ int event_size = Evoral::midi_event_size(ev_start);
+ assert(event_size >= 0);
+ offset += sizeof(TimeType) + event_size;
return *this;
}
- inline bool operator!=(const iterator_base<B,E>& other) const {
+ inline bool operator!=(const iterator_base<BufferType, MIDIEventType>& other) const {
return (&buffer != &other.buffer) || (offset != other.offset);
}
- B& buffer;
- size_t offset;
+ BufferType& buffer;
+ size_t offset;
};
- typedef iterator_base<MidiBuffer, Evoral::MIDIEvent> iterator;
- typedef iterator_base<const MidiBuffer, const Evoral::MIDIEvent> const_iterator;
+ typedef iterator_base< MidiBuffer, Evoral::MIDIEvent<TimeType> > iterator;
+ typedef iterator_base< const MidiBuffer, const Evoral::MIDIEvent<TimeType> > const_iterator;
iterator begin() { return iterator(*this, 0); }
iterator end() { return iterator(*this, _size); }
const_iterator end() const { return const_iterator(*this, _size); }
private:
- friend class iterator_base<MidiBuffer, Evoral::MIDIEvent>;
- friend class iterator_base<const MidiBuffer, const Evoral::MIDIEvent>;
+ friend class iterator_base< MidiBuffer, Evoral::MIDIEvent<TimeType> >;
+ friend class iterator_base< const MidiBuffer, const Evoral::MIDIEvent<TimeType> >;
size_t _size; ///< Size in bytes of used portion of _data
uint8_t* _data; ///< timestamp, event, timestamp, event, ...