diff options
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r-- | libs/ardour/ardour/buffer.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_model.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_ring_buffer.h | 31 | ||||
-rw-r--r-- | libs/ardour/ardour/smf_source.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 15 |
5 files changed, 38 insertions, 17 deletions
diff --git a/libs/ardour/ardour/buffer.h b/libs/ardour/ardour/buffer.h index 61e7a843f1..fe9516cb84 100644 --- a/libs/ardour/ardour/buffer.h +++ b/libs/ardour/ardour/buffer.h @@ -190,7 +190,8 @@ public: void read_from(const Buffer& src, nframes_t nframes, nframes_t offset); bool push_back(const ARDOUR::MidiEvent& event); - Byte* reserve(nframes_t time, size_t size); + bool push_back(const jack_midi_event_t& event); + Byte* reserve(double time, size_t size); const MidiEvent& operator[](size_t i) const { assert(i < _size); return _events[i]; } MidiEvent& operator[](size_t i) { assert(i < _size); return _events[i]; } diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h index 509504a472..c68ea668a5 100644 --- a/libs/ardour/ardour/midi_model.h +++ b/libs/ardour/ardour/midi_model.h @@ -41,7 +41,7 @@ public: void append(const MidiBuffer& data); /** Resizes vector if necessary (NOT realtime safe) */ - void append(const MidiEvent& ev); + void append(double time, size_t size, Byte* in_buffer); inline const MidiEvent& event_at(unsigned i) const { return _events[i]; } diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h index 657ec0852a..0ceedd7d74 100644 --- a/libs/ardour/ardour/midi_ring_buffer.h +++ b/libs/ardour/ardour/midi_ring_buffer.h @@ -26,6 +26,9 @@ namespace ARDOUR { +/* FIXME: this is probably too much inlined code */ + + /** A RingBuffer. * Read/Write realtime safe. * Single-reader Single-writer thread safe. @@ -226,17 +229,17 @@ public: : MidiRingBufferBase<Byte>(size) {} - size_t write(nframes_t time, size_t size, const Byte* buf); - bool read(nframes_t time, size_t* size, Byte* buf); + size_t write(double time, size_t size, const Byte* buf); + bool read(double* time, size_t* size, Byte* buf); size_t read(MidiBuffer& dst, nframes_t start, nframes_t end); }; inline bool -MidiRingBuffer::read(nframes_t time, size_t* size, Byte* buf) +MidiRingBuffer::read(double* time, size_t* size, Byte* buf) { - bool success = MidiRingBufferBase<Byte>::full_read(sizeof(nframes_t), (Byte*)time); + bool success = MidiRingBufferBase<Byte>::full_read(sizeof(double), (Byte*)time); if (success) success = MidiRingBufferBase<Byte>::full_read(sizeof(size_t), (Byte*)size); if (success) @@ -247,14 +250,14 @@ MidiRingBuffer::read(nframes_t time, size_t* size, Byte* buf) inline size_t -MidiRingBuffer::write(nframes_t time, size_t size, const Byte* buf) +MidiRingBuffer::write(double time, size_t size, const Byte* buf) { assert(size > 0); - if (write_space() < (sizeof(nframes_t) + sizeof(size_t) + size)) { + if (write_space() < (sizeof(double) + sizeof(size_t) + size)) { return 0; } else { - MidiRingBufferBase<Byte>::write(sizeof(nframes_t), (Byte*)&time); + MidiRingBufferBase<Byte>::write(sizeof(double), (Byte*)&time); MidiRingBufferBase<Byte>::write(sizeof(size_t), (Byte*)&size); MidiRingBufferBase<Byte>::write(size, buf); return size; @@ -262,6 +265,11 @@ MidiRingBuffer::write(nframes_t time, size_t size, const Byte* buf) } +/** Read a block of MIDI events from buffer. + * + * Timestamps of events returned are relative to start (ie event with stamp 0 + * occurred at start). + */ inline size_t MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end) { @@ -272,14 +280,14 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end) size_t count = 0; - while (read_space() > sizeof(nframes_t) + sizeof(size_t)) { + while (read_space() > sizeof(double) + sizeof(size_t)) { - full_peek(sizeof(nframes_t), (Byte*)&ev.time); + full_peek(sizeof(double), (Byte*)&ev.time); if (ev.time > end) break; - bool success = MidiRingBufferBase<Byte>::full_read(sizeof(nframes_t), (Byte*)&ev.time); + bool success = MidiRingBufferBase<Byte>::full_read(sizeof(double), (Byte*)&ev.time); if (success) success = MidiRingBufferBase<Byte>::full_read(sizeof(size_t), (Byte*)&ev.size); @@ -300,13 +308,14 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end) // priv_read_ptr); // } else { - printf("MRB - SKIPPING EVENT (with time %u)\n", ev.time); + printf("MRB - SKIPPING EVENT (with time %f)\n", ev.time); break; } ++count; assert(ev.time <= end); + ev.time -= start; } //printf("(R) read space: %zu\n", read_space()); diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index b4a0ada555..086c77537d 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -110,7 +110,7 @@ class SMFSource : public MidiSource { void write_chunk(char id[4], uint32_t length, void* data); size_t write_var_len(uint32_t val); uint32_t read_var_len() const; - int read_event(MidiEvent& ev) const; + int read_event(jack_midi_event_t& ev) const; static const uint16_t _ppqn = 19200; @@ -121,7 +121,7 @@ class SMFSource : public MidiSource { bool _allow_remove_if_empty; uint64_t _timeline_position; FILE* _fd; - nframes_t _last_ev_time; // last frame time written, relative to source start + double _last_ev_time; // last frame time written, relative to source start uint32_t _track_size; uint32_t _header_size; // size of SMF header, including MTrk chunk header diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 3dc4ae2693..d5f10410db 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -61,8 +61,19 @@ namespace ARDOUR { typedef unsigned char Byte; - struct MidiEvent : public jack_midi_event_t { - MidiEvent() { time = 0; size = 0; buffer = NULL; } + /** Identical to jack_midi_event_t, but with double timestamp + * + * time is either a frame time (from/to Jack) or a beat time (internal + * tempo time, used in MidiModel) depending on context. + */ + struct MidiEvent { + MidiEvent(double t=0, size_t s=0, Byte* b=NULL) + : time(t), size(s), buffer(b) + {} + + double time; /**< Sample index (or beat time) at which event is valid */ + size_t size; /**< Number of bytes of data in \a buffer */ + Byte* buffer; /**< Raw MIDI data */ }; enum IOChange { |