summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_ring_buffer.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-04-04 21:43:40 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-04-04 21:43:40 +0000
commitab376e10a7ce04bcdbeff04f1b7281bf143558a8 (patch)
treefc92403fac2cfd6cdda133c13c8474883387854a /libs/ardour/midi_ring_buffer.cc
parent806b94bec1a8c43a1d2f42b5af6b235699339b2f (diff)
reimplement MidiRingBuffer::dump()
git-svn-id: svn://localhost/ardour2/branches/3.0@9283 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_ring_buffer.cc')
-rw-r--r--libs/ardour/midi_ring_buffer.cc90
1 files changed, 44 insertions, 46 deletions
diff --git a/libs/ardour/midi_ring_buffer.cc b/libs/ardour/midi_ring_buffer.cc
index a69b353995..27361c0b95 100644
--- a/libs/ardour/midi_ring_buffer.cc
+++ b/libs/ardour/midi_ring_buffer.cc
@@ -164,7 +164,6 @@ MidiRingBuffer<T>::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame
return count;
}
-#if 0
template<typename T>
void
MidiRingBuffer<T>::dump(ostream& str)
@@ -179,70 +178,69 @@ MidiRingBuffer<T>::dump(ostream& str)
T ev_time;
Evoral::EventType ev_type;
uint32_t ev_size;
- size_t read_ptr = g_atomic_int_get (&this->_read_ptr);
- str << "Dump @ " << read_ptr << endl;
+ RingBufferNPT<uint8_t>::rw_vector vec;
+ RingBufferNPT<uint8_t>::get_read_vector (&vec);
- while (1) {
- uint8_t* wp;
- uint8_t* data;
- size_t write_ptr;
+ if (vec.len[0] == 0) {
+ return;
+ }
-#define space(r,w) ((w > r) ? (w - r) : ((w - r + this->_size) % this->_size))
+ str << this << ": Dump size = " << vec.len[0] + vec.len[1]
+ << " r@ " << RingBufferNPT<uint8_t>::get_read_ptr()
+ << " w@" << RingBufferNPT<uint8_t>::get_write_ptr() << endl;
- write_ptr = g_atomic_int_get (&this->_write_ptr);
- if (space (read_ptr, write_ptr) < sizeof (T)) {
- break;
- }
- wp = &this->_buf[read_ptr];
- memcpy (&ev_time, wp, sizeof (T));
- read_ptr = (read_ptr + sizeof (T)) % this->_size;
- str << "time " << ev_time;
+ uint8_t *buf = new uint8_t[vec.len[0] + vec.len[1]];
+ memcpy (buf, vec.buf[0], vec.len[0]);
- write_ptr = g_atomic_int_get (&this->_write_ptr);
- if (space (read_ptr, write_ptr) < sizeof (ev_type)) {
- break;
- }
+ if (vec.len[1]) {
+ memcpy (buf+vec.len[1], vec.buf[1], vec.len[1]);
+ }
- wp = &this->_buf[read_ptr];
- memcpy (&ev_type, wp, sizeof (ev_type));
- read_ptr = (read_ptr + sizeof (ev_type)) % this->_size;
- str << " type " << ev_type;
+ uint8_t* data = buf;
+ const uint8_t* end = buf + vec.len[0] + vec.len[1];
- write_ptr = g_atomic_int_get (&this->_write_ptr);
- if (space (read_ptr, write_ptr) < sizeof (ev_size)) {
- str << "!OUT!\n";
- break;
- }
+ while (data < end) {
+
+ memcpy (&ev_time, data, sizeof (T));
+ data += sizeof (T);
+ str << "\ttime " << ev_time;
- wp = &this->_buf[read_ptr];
- memcpy (&ev_size, wp, sizeof (ev_size));
- read_ptr = (read_ptr + sizeof (ev_size)) % this->_size;
- str << " size " << ev_size;
+ if (data >= end) {
+ str << "(incomplete)\n ";
+ break;
+ }
- write_ptr = g_atomic_int_get (&this->_write_ptr);
- if (space (read_ptr, write_ptr) < ev_size) {
- str << "!OUT!\n";
- break;
- }
+ memcpy (&ev_type, data, sizeof (ev_type));
+ data += sizeof (ev_type);
+ str << " type " << ev_type;
- data = new uint8_t[ev_size];
+ if (data >= end) {
+ str << "(incomplete)\n";
+ break;
+ }
+
+ memcpy (&ev_size, data, sizeof (ev_size));
+ data += sizeof (ev_size);
+ str << " size " << ev_size;
- wp = &this->_buf[read_ptr];
- memcpy (data, wp, ev_size);
- read_ptr = (read_ptr + ev_size) % this->_size;
+ if (data >= end) {
+ str << "(incomplete)\n";
+ break;
+ }
- for (uint32_t i = 0; i != ev_size; ++i) {
+ for (uint32_t i = 0; i != ev_size && data < end; ++i) {
str << ' ' << hex << (int) data[i] << dec;
}
- str << endl;
+ data += ev_size;
- delete [] data;
+ str << endl;
}
+
+ delete [] buf;
}
-#endif
template class MidiRingBuffer<framepos_t>;