summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/buffer.h3
-rw-r--r--libs/ardour/ardour/midi_model.h2
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h31
-rw-r--r--libs/ardour/ardour/smf_source.h4
-rw-r--r--libs/ardour/ardour/types.h15
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 {