summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_tracer.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-02-01 03:33:52 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-02-01 03:33:52 +0000
commit85eb944c830a1400d73318a01da1e007be096377 (patch)
tree7f0efd8bb3010d7fee21f2555e1c5ecd5a71990b /gtk2_ardour/midi_tracer.cc
parentbeb4a36016140e49e11a267290306ce826e24fee (diff)
improve efficiency of MIDI tracer window with a lock-free FIFO and lock-free msg pool and buffered queing; use a monospace font too
git-svn-id: svn://localhost/ardour2/branches/3.0@6603 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_tracer.cc')
-rw-r--r--gtk2_ardour/midi_tracer.cc48
1 files changed, 35 insertions, 13 deletions
diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc
index f294b73ce1..e78271e01d 100644
--- a/gtk2_ardour/midi_tracer.cc
+++ b/gtk2_ardour/midi_tracer.cc
@@ -25,6 +25,9 @@ MidiTracer::MidiTracer (const std::string& name, Parser& p)
, autoscroll (true)
, show_hex (true)
, collect (true)
+ , update_queued (false)
+ , fifo (1024)
+ , buffer_pool ("miditracer", buffer_size, 1024) // 1024 256 byte buffers
, autoscroll_button (_("Auto-Scroll"))
, base_button (_("Decimal"))
, collect_button (_("Enabled"))
@@ -34,6 +37,7 @@ MidiTracer::MidiTracer (const std::string& name, Parser& p)
get_vbox()->pack_start (scroller, true, true);
text.show ();
+ text.set_name ("MidiTracerTextView");
scroller.show ();
scroller.set_size_request (400, 400);
@@ -65,6 +69,7 @@ MidiTracer::MidiTracer (const std::string& name, Parser& p)
connect ();
}
+
MidiTracer::~MidiTracer()
{
}
@@ -87,7 +92,7 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
{
stringstream ss;
struct timeval tv;
- char buf[256];
+ char* buf;
struct tm now;
size_t bufsize;
size_t s;
@@ -95,11 +100,14 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
gettimeofday (&tv, 0);
localtime_r (&tv.tv_sec, &now);
- s = strftime (buf, sizeof (buf), "%H:%M:%S", &now);
- bufsize = sizeof (buf) - s;
- s += snprintf (&buf[s], bufsize, ".%-9" PRId64, (int64_t) tv.tv_usec);
- bufsize = sizeof (buf) - s;
-
+ buf = (char *) buffer_pool.alloc ();
+ bufsize = buffer_size;
+
+ s = strftime (buf, bufsize, "%H:%M:%S", &now);
+ bufsize -= s;
+ s = snprintf (&buf[s], bufsize, ".%-9" PRId64, (int64_t) tv.tv_usec);
+ bufsize -= s;
+
switch ((eventType) msg[0]&0xf0) {
case off:
if (show_hex) {
@@ -182,10 +190,10 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
s += snprintf (&buf[s], bufsize, "%16s %02x\n", "Sysex", (int) msg[1]);
break;
}
- bufsize = sizeof (buf) - s;
+ bufsize -= s;
} else {
s += snprintf (&buf[s], bufsize, " %16s (%d) = [", "Sysex", (int) len);
- bufsize = sizeof (buf) - s;
+ bufsize -= s;
for (unsigned int i = 0; i < len && s < sizeof (buf)-3; ++i) {
if (i > 0) {
@@ -237,14 +245,22 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
}
// If you want to append more to the line, uncomment this first
- // bufsize = sizeof (buf) - s;
+ // bufsize -= s;
+
+ fifo.write (&buf, 1);
- gui_context()->call_slot (boost::bind (&MidiTracer::add_string, this, string (buf)));
+ if (!update_queued) {
+ gui_context()->call_slot (boost::bind (&MidiTracer::update, this));
+ update_queued = true;
+ }
}
void
-MidiTracer::add_string (std::string s)
+MidiTracer::update ()
{
+ bool updated = false;
+ update_queued = false;
+
RefPtr<TextBuffer> buf (text.get_buffer());
int excess = buf->get_line_count() - line_count_adjustment.get_value();
@@ -253,9 +269,15 @@ MidiTracer::add_string (std::string s)
buf->erase (buf->begin(), buf->get_iter_at_line (excess));
}
- buf->insert (buf->end(), s);
+ char *str;
+
+ while (fifo.read (&str, 1)) {
+ buf->insert (buf->end(), string (str));
+ buffer_pool.release (str);
+ updated = true;
+ }
- if (autoscroll) {
+ if (updated && autoscroll) {
scroller.get_vadjustment()->set_value (scroller.get_vadjustment()->get_upper());
}
}