diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-02-01 03:33:52 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-02-01 03:33:52 +0000 |
commit | 85eb944c830a1400d73318a01da1e007be096377 (patch) | |
tree | 7f0efd8bb3010d7fee21f2555e1c5ecd5a71990b /gtk2_ardour/midi_tracer.cc | |
parent | beb4a36016140e49e11a267290306ce826e24fee (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.cc | 48 |
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()); } } |