using namespace Glib;
MidiTracer::MidiTracer ()
- : ArdourDialog (_("MIDI Tracer"))
+ : ArdourWindow (_("MIDI Tracer"))
, parser (0)
, line_count_adjustment (200, 1, 2000, 1, 10)
, line_count_spinner (line_count_adjustment)
- , line_count_label (_("Store this many lines: "))
+ , line_count_label (_("Line history: "))
, autoscroll (true)
, show_hex (true)
, collect (true)
+ , show_delta_time (false)
, _update_queued (0)
, fifo (1024)
, buffer_pool ("miditracer", buffer_size, 1024) // 1024 256 byte buffers
, autoscroll_button (_("Auto-Scroll"))
, base_button (_("Decimal"))
, collect_button (_("Enabled"))
+ , delta_time_button (_("Delta times"))
{
- get_vbox()->set_spacing (4);
-
Manager::instance()->PortsChanged.connect (_manager_connection, invalidator (*this), boost::bind (&MidiTracer::ports_changed, this), gui_context());
+ _last_receipt.tv_sec = 0;
+ _last_receipt.tv_usec = 0;
+
+ VBox* vbox = manage (new VBox);
+ vbox->set_spacing (4);
+
HBox* pbox = manage (new HBox);
+ pbox->set_spacing (6);
pbox->pack_start (*manage (new Label (_("Port:"))), false, false);
_port_combo.signal_changed().connect (sigc::mem_fun (*this, &MidiTracer::port_changed));
pbox->pack_start (_port_combo);
pbox->show_all ();
- get_vbox()->pack_start (*pbox, false, false);
+ vbox->pack_start (*pbox, false, false);
scroller.add (text);
- get_vbox()->set_border_width (12);
- get_vbox()->pack_start (scroller, true, true);
+ vbox->set_border_width (12);
+ vbox->pack_start (scroller, true, true);
text.show ();
text.set_name ("MidiTracerTextView");
line_count_label.show ();
line_count_box.show ();
- get_action_area()->add (line_count_box);
-
HBox* bbox = manage (new HBox);
+ bbox->add (line_count_box);
+ bbox->add (delta_time_button);
bbox->add (base_button);
bbox->add (collect_button);
bbox->add (autoscroll_button);
bbox->show ();
- get_action_area()->add (*bbox);
+ vbox->pack_start (*bbox, false, false);
+
+ add (*vbox);
base_button.signal_toggled().connect (sigc::mem_fun (*this, &MidiTracer::base_toggle));
collect_button.signal_toggled().connect (sigc::mem_fun (*this, &MidiTracer::collect_toggle));
autoscroll_button.signal_toggled().connect (sigc::mem_fun (*this, &MidiTracer::autoscroll_toggle));
+ delta_time_button.signal_toggled().connect (sigc::mem_fun (*this, &MidiTracer::delta_toggle));
base_button.show ();
collect_button.show ();
string const c = _port_combo.get_active_text ();
_port_combo.clear ();
- Manager::PortList const & p = Manager::instance()->get_midi_ports ();
- for (Manager::PortList::const_iterator i = p.begin(); i != p.end(); ++i) {
+ boost::shared_ptr<const Manager::PortList> p = Manager::instance()->get_midi_ports ();
+ for (Manager::PortList::const_iterator i = p->begin(); i != p->end(); ++i) {
_port_combo.append_text ((*i)->name());
}
size_t s;
gettimeofday (&tv, 0);
- localtime_r (&tv.tv_sec, &now);
buf = (char *) buffer_pool.alloc ();
bufsize = buffer_size;
- s = strftime (buf, bufsize, "%H:%M:%S", &now);
- bufsize -= s;
- s += snprintf (&buf[s], bufsize, ".%06" PRId64, (int64_t) tv.tv_usec);
- bufsize -= s;
+ if (_last_receipt.tv_sec != 0 && show_delta_time) {
+ struct timeval delta;
+ timersub (&tv, &_last_receipt, &delta);
+ 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);
+ s = strftime (buf, bufsize, "%H:%M:%S", &now);
+ bufsize -= s;
+ s += snprintf (&buf[s], bufsize, ".%06" PRId64, (int64_t) tv.tv_usec);
+ bufsize -= s;
+ }
+
+ _last_receipt = tv;
switch ((eventType) msg[0]&0xf0) {
case off:
show_hex = !base_button.get_active();
}
+void
+MidiTracer::delta_toggle ()
+{
+ show_delta_time = delta_time_button.get_active();
+}
+
void
MidiTracer::collect_toggle ()
{