enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / gtk2_ardour / midi_tracer.cc
index ea4b0c2d545cdaae2e87e20cebf337645689eb85..2f97e5b6d5076a59136a78ce420bf794fc692ae0 100644 (file)
@@ -23,6 +23,9 @@
 #include <sys/time.h>
 #include <time.h>
 
+#include "pbd/localtime_r.h"
+#include "pbd/timersub.h"
+
 #include "midi++/parser.h"
 
 #include "ardour/async_midi_port.h"
@@ -31,7 +34,7 @@
 
 #include "midi_tracer.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
@@ -40,13 +43,11 @@ using namespace Glib;
 
 MidiTracer::MidiTracer ()
        : ArdourWindow (_("MIDI Tracer"))
-       , parser (0)
        , line_count_adjustment (200, 1, 2000, 1, 10)
        , line_count_spinner (line_count_adjustment)
        , line_count_label (_("Line history: "))
        , autoscroll (true)
        , show_hex (true)
-       , collect (true)
        , show_delta_time (false)
        , _update_queued (0)
        , fifo (1024)
@@ -56,7 +57,7 @@ MidiTracer::MidiTracer ()
        , collect_button (_("Enabled"))
        , delta_time_button (_("Delta times"))
 {
-       ARDOUR::AudioEngine::instance()->PortRegisteredOrUnregistered.connect 
+       ARDOUR::AudioEngine::instance()->PortRegisteredOrUnregistered.connect
                (_manager_connection, invalidator (*this), boost::bind (&MidiTracer::ports_changed, this), gui_context());
 
        _last_receipt.tv_sec = 0;
@@ -130,7 +131,7 @@ MidiTracer::ports_changed ()
 {
        string const c = _port_combo.get_active_text ();
        _port_combo.clear ();
-       
+
        ARDOUR::PortManager::PortList pl;
        ARDOUR::AudioEngine::instance()->get_ports (ARDOUR::DataType::MIDI, pl);
 
@@ -178,8 +179,10 @@ MidiTracer::port_changed ()
 
                if (mp) {
                        mp->self_parser().any.connect_same_thread (_parser_connection, boost::bind (&MidiTracer::tracer, this, _1, _2, _3));
+                       mp->set_trace_on (true);
+                       traced_port = mp;
                }
-               
+
        } else {
                async->parser()->any.connect_same_thread (_parser_connection, boost::bind (&MidiTracer::tracer, this, _1, _2, _3));
        }
@@ -189,6 +192,11 @@ void
 MidiTracer::disconnect ()
 {
        _parser_connection.disconnect ();
+
+       if (traced_port) {
+               traced_port->set_trace_on (false);
+               traced_port.reset ();
+       }
 }
 
 void
@@ -212,7 +220,7 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
                s = snprintf (buf, bufsize, "+%02" PRId64 ":%06" PRId64, (int64_t) delta.tv_sec, (int64_t) delta.tv_usec);
                bufsize -= s;
        } else {
-               localtime_r (&tv.tv_sec, &now);
+               localtime_r ((const time_t*)&tv.tv_sec, &now);
                s = strftime (buf, bufsize, "%H:%M:%S", &now);
                bufsize -= s;
                s += snprintf (&buf[s], bufsize, ".%06" PRId64, (int64_t) tv.tv_usec);
@@ -272,9 +280,9 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
 
        case MIDI::pitchbend:
                if (show_hex) {
-                       s += snprintf (&buf[s], bufsize, "%16s chn %2d %02x\n", "Pitch Bend", (msg[0]&0xf)+1, (int) msg[1]);
+                       s += snprintf (&buf[s], bufsize, "%16s chn %2d %02x %02x\n", "Pitch Bend", (msg[0]&0xf)+1, (int) msg[1], (int) msg[2]);
                } else {
-                       s += snprintf (&buf[s], bufsize, "%16s chn %2d %-3d\n", "Pitch Bend", (msg[0]&0xf)+1, (int) msg[1]);
+                       s += snprintf (&buf[s], bufsize, "%16s chn %2d %-3d %-3d\n", "Pitch Bend", (msg[0]&0xf)+1, (int) msg[1], (int) msg[2]);
                }
                break;
 
@@ -402,6 +410,8 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
        // If you want to append more to the line, uncomment this first
        // bufsize -= s;
 
+       assert(s <= buffer_size); // clang dead-assignment
+
        fifo.write (&buf, 1);
 
        if (g_atomic_int_get (const_cast<gint*> (&_update_queued)) == 0) {