summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/JackDriver.cpp20
-rw-r--r--src/JackDriver.hpp2
-rw-r--r--src/Patchage.cpp122
-rw-r--r--src/Patchage.hpp16
-rw-r--r--src/patchage.ui300
5 files changed, 184 insertions, 276 deletions
diff --git a/src/JackDriver.cpp b/src/JackDriver.cpp
index b641d40..9c981ec 100644
--- a/src/JackDriver.cpp
+++ b/src/JackDriver.cpp
@@ -440,7 +440,7 @@ JackDriver::jack_client_registration_cb(const char* name, int registered, void*
JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
assert(me->_client);
- jack_reset_max_delayed_usecs(me->_client);
+ //jack_reset_max_delayed_usecs(me->_client);
if (registered) {
me->_events.push(PatchageEvent(PatchageEvent::CLIENT_CREATION, name));
@@ -456,7 +456,7 @@ JackDriver::jack_port_registration_cb(jack_port_id_t port_id, int registered, vo
JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
assert(me->_client);
- jack_reset_max_delayed_usecs(me->_client);
+ //jack_reset_max_delayed_usecs(me->_client);
if (registered) {
me->_events.push(PatchageEvent(PatchageEvent::PORT_CREATION, port_id));
@@ -472,7 +472,7 @@ JackDriver::jack_port_connect_cb(jack_port_id_t src, jack_port_id_t dst, int con
JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
assert(me->_client);
- jack_reset_max_delayed_usecs(me->_client);
+ //jack_reset_max_delayed_usecs(me->_client);
if (connect) {
me->_events.push(PatchageEvent(PatchageEvent::CONNECTION, src, dst));
@@ -488,7 +488,7 @@ JackDriver::jack_graph_order_cb(void* jack_driver)
JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
assert(me->_client);
- jack_reset_max_delayed_usecs(me->_client);
+ //jack_reset_max_delayed_usecs(me->_client);
return 0;
}
@@ -588,17 +588,9 @@ JackDriver::get_max_dsp_load()
const float max_delay = jack_get_max_delayed_usecs(_client);
const float rate = sample_rate();
const float size = buffer_size();
- const float period = size / rate * 1000000; // usec
-
- float max_load;
- if (max_delay > period) {
- max_load = 1.0;
- jack_reset_max_delayed_usecs(_client);
- } else {
- max_load = max_delay / period;
- }
+ const float period = size / rate * 1000000.0f; // usec
- return max_load;
+ return (max_delay > period) ? 1.0 : (max_delay / period);
}
void
diff --git a/src/JackDriver.hpp b/src/JackDriver.hpp
index 82c44be..d1cf395 100644
--- a/src/JackDriver.hpp
+++ b/src/JackDriver.hpp
@@ -73,7 +73,7 @@ public:
jack_client_t* client() { return _client; }
- float sample_rate() { return jack_get_sample_rate(_client); }
+ jack_nframes_t sample_rate() { return jack_get_sample_rate(_client); }
jack_nframes_t buffer_size();
bool set_buffer_size(jack_nframes_t size);
diff --git a/src/Patchage.cpp b/src/Patchage.cpp
index ac1a6e2..be8ff23 100644
--- a/src/Patchage.cpp
+++ b/src/Patchage.cpp
@@ -65,36 +65,6 @@ struct ProjectList_column_record : public Gtk::TreeModel::ColumnRecord {
Gtk::TreeModelColumn<Glib::ustring> label;
};
-/* Gtk helpers (resize combo boxes) */
-
-static void
-gtkmm_get_ink_pixel_size (Glib::RefPtr<Pango::Layout> layout,
- int& width,
- int& height)
-{
- Pango::Rectangle ink_rect = layout->get_ink_extents ();
-
- width = (ink_rect.get_width() + PANGO_SCALE / 2) / PANGO_SCALE;
- height = (ink_rect.get_height() + PANGO_SCALE / 2) / PANGO_SCALE;
-}
-
-static void
-gtkmm_set_width_for_given_text (Gtk::Widget &w, const gchar *text,
- gint hpadding/*, gint vpadding*/)
-
-{
- int old_width, old_height;
- w.get_size_request(old_width, old_height);
-
- int width, height;
- w.ensure_style ();
-
- gtkmm_get_ink_pixel_size (w.create_pango_layout (text), width, height);
- w.set_size_request(width + hpadding, old_height);//height + vpadding);
-}
-
-/* end Gtk helpers */
-
#define INIT_WIDGET(x) x(_xml, ((const char*)#x) + 1)
Patchage::Patchage(int argc, char** argv)
@@ -117,8 +87,6 @@ Patchage::Patchage(int argc, char** argv)
, _refresh(false)
, _enable_refresh(true)
, INIT_WIDGET(_about_win)
- , INIT_WIDGET(_buffer_size_combo)
- , INIT_WIDGET(_clear_load_but)
, INIT_WIDGET(_main_scrolledwin)
, INIT_WIDGET(_main_win)
, INIT_WIDGET(_main_xrun_progress)
@@ -134,19 +102,20 @@ Patchage::Patchage(int argc, char** argv)
, INIT_WIDGET(_menu_view_messages)
, INIT_WIDGET(_menu_view_projects)
, INIT_WIDGET(_menu_view_refresh)
- , INIT_WIDGET(_menu_view_toolbar)
+ , INIT_WIDGET(_menu_view_statusbar)
, INIT_WIDGET(_menu_zoom_in)
, INIT_WIDGET(_menu_zoom_out)
+ , INIT_WIDGET(_menu_zoom_full)
, INIT_WIDGET(_menu_zoom_normal)
, INIT_WIDGET(_messages_clear_but)
, INIT_WIDGET(_messages_close_but)
, INIT_WIDGET(_messages_win)
, INIT_WIDGET(_project_list_viewport)
+ , INIT_WIDGET(_latency_frames_label)
+ , INIT_WIDGET(_latency_ms_label)
, INIT_WIDGET(_sample_rate_label)
, INIT_WIDGET(_status_text)
- , INIT_WIDGET(_toolbar)
- , INIT_WIDGET(_zoom_full_but)
- , INIT_WIDGET(_zoom_normal_but)
+ , INIT_WIDGET(_statusbar)
{
_settings_filename = getenv("HOME");
_settings_filename += "/.patchagerc";
@@ -181,8 +150,6 @@ Patchage::Patchage(int argc, char** argv)
_about_win->property_logo_icon_name() = "patchage";
gtk_window_set_default_icon_name("patchage");
- gtkmm_set_width_for_given_text(*_buffer_size_combo, "4096 frames", 40);
-
_main_scrolledwin->add(*_canvas);
_main_scrolledwin->property_hadjustment().get_value()->set_step_increment(10);
@@ -191,15 +158,6 @@ Patchage::Patchage(int argc, char** argv)
_main_scrolledwin->signal_scroll_event().connect(
sigc::mem_fun(this, &Patchage::on_scroll));
- _buffer_size_combo->signal_changed().connect(
- sigc::mem_fun(this, &Patchage::buffer_size_changed));
- _clear_load_but->signal_clicked().connect(
- sigc::mem_fun(this, &Patchage::clear_load));
- _zoom_normal_but->signal_clicked().connect(sigc::bind(
- sigc::mem_fun(this, &Patchage::zoom), 1.0));
- _zoom_full_but->signal_clicked().connect(
- sigc::mem_fun(_canvas.get(), &PatchageCanvas::zoom_full));
-
#ifdef HAVE_LASH
_menu_open_session->signal_activate().connect(
sigc::mem_fun(this, &Patchage::show_load_project_dialog));
@@ -228,8 +186,8 @@ Patchage::Patchage(int argc, char** argv)
sigc::mem_fun(this, &Patchage::refresh));
_menu_view_arrange->signal_activate().connect(
sigc::mem_fun(this, &Patchage::on_arrange));
- _menu_view_toolbar->signal_activate().connect(
- sigc::mem_fun(this, &Patchage::on_view_toolbar));
+ _menu_view_statusbar->signal_activate().connect(
+ sigc::mem_fun(this, &Patchage::on_view_statusbar));
_menu_view_messages->signal_toggled().connect(
sigc::mem_fun(this, &Patchage::on_show_messages));
_menu_view_projects->signal_toggled().connect(
@@ -240,6 +198,8 @@ Patchage::Patchage(int argc, char** argv)
sigc::mem_fun(this, &Patchage::on_zoom_in));
_menu_zoom_out->signal_activate().connect(
sigc::mem_fun(this, &Patchage::on_zoom_out));
+ _menu_zoom_full->signal_activate().connect(
+ sigc::mem_fun(this, &Patchage::on_zoom_full));
_menu_zoom_normal->signal_activate().connect(
sigc::mem_fun(this, &Patchage::on_zoom_normal));
@@ -339,7 +299,7 @@ Patchage::attach()
refresh();
- update_toolbar();
+ update_statusbar();
}
bool
@@ -396,12 +356,27 @@ Patchage::idle_callback()
}
void
-Patchage::update_toolbar()
+Patchage::update_statusbar()
{
#if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS)
if (_enable_refresh && _jack_driver->is_attached()) {
_enable_refresh = false;
- _buffer_size_combo->set_active((int)log2f(_jack_driver->buffer_size()) - 5);
+
+ const jack_nframes_t buffer_size = _jack_driver->buffer_size();
+ const jack_nframes_t sample_rate = _jack_driver->sample_rate();
+
+ std::stringstream ss;
+ ss << buffer_size;
+ _latency_frames_label->set_text(ss.str());
+
+ ss.str("");
+ ss << (sample_rate / 1000);
+ _sample_rate_label->set_text(ss.str());
+
+ ss.str("");
+ ss << buffer_size * 1000 / sample_rate;
+ _latency_ms_label->set_text(ss.str());
+
_enable_refresh = true;
}
#endif
@@ -481,16 +456,6 @@ Patchage::store_window_location()
}
void
-Patchage::clear_load()
-{
-#if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS)
- _main_xrun_progress->set_fraction(0.0);
- _jack_driver->reset_xruns();
- _jack_driver->reset_max_dsp_load();
-#endif
-}
-
-void
Patchage::error_msg(const std::string& msg)
{
#if defined(LOG_TO_STATUS)
@@ -541,7 +506,7 @@ Patchage::connect_widgets()
{
#if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS)
_jack_driver->signal_attached.connect(
- sigc::mem_fun(this, &Patchage::update_toolbar));
+ sigc::mem_fun(this, &Patchage::update_statusbar));
_jack_driver->signal_attached.connect(sigc::bind(
sigc::mem_fun(*_menu_jack_connect, &Gtk::MenuItem::set_sensitive), false));
_jack_driver->signal_attached.connect(
@@ -636,6 +601,12 @@ Patchage::on_zoom_out()
}
void
+Patchage::on_zoom_full()
+{
+ _canvas->zoom_full();
+}
+
+void
Patchage::on_zoom_normal()
{
_canvas->set_zoom_and_font_size(1.0, _canvas->get_default_font_size());
@@ -701,12 +672,12 @@ Patchage::on_store_positions()
}
void
-Patchage::on_view_toolbar()
+Patchage::on_view_statusbar()
{
- if (_menu_view_toolbar->get_active())
- _toolbar->show();
+ if (_menu_view_statusbar->get_active())
+ _statusbar->show();
else
- _toolbar->hide();
+ _statusbar->hide();
}
bool
@@ -716,23 +687,6 @@ Patchage::on_scroll(GdkEventScroll* ev)
}
void
-Patchage::buffer_size_changed()
-{
-#if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS)
- const int selected = _buffer_size_combo->get_active_row_number();
-
- if (selected == -1) {
- update_toolbar();
- } else {
- jack_nframes_t buffer_size = 1 << (selected+5);
-
- if ( ! _jack_driver->set_buffer_size(buffer_size))
- update_toolbar(); // reset combo box to actual value
- }
-#endif
-}
-
-void
Patchage::enqueue_resize(boost::shared_ptr<FlowCanvas::Module> module)
{
if (module)
diff --git a/src/Patchage.hpp b/src/Patchage.hpp
index 0c61d0d..459e361 100644
--- a/src/Patchage.hpp
+++ b/src/Patchage.hpp
@@ -95,9 +95,10 @@ protected:
void on_show_messages();
void on_show_projects();
void on_store_positions();
- void on_view_toolbar();
+ void on_view_statusbar();
void on_zoom_in();
void on_zoom_out();
+ void on_zoom_full();
void on_zoom_normal();
bool on_scroll(GdkEventScroll* ev);
@@ -105,7 +106,7 @@ protected:
void zoom(double z);
bool idle_callback();
bool update_load();
- void update_toolbar();
+ void update_statusbar();
void buffer_size_changed();
@@ -145,8 +146,6 @@ protected:
bool _enable_refresh;
Widget<Gtk::AboutDialog> _about_win;
- Widget<Gtk::ComboBox> _buffer_size_combo;
- Widget<Gtk::ToolButton> _clear_load_but;
Widget<Gtk::ScrolledWindow> _main_scrolledwin;
Widget<Gtk::Window> _main_win;
Widget<Gtk::ProgressBar> _main_xrun_progress;
@@ -162,19 +161,20 @@ protected:
Widget<Gtk::CheckMenuItem> _menu_view_messages;
Widget<Gtk::CheckMenuItem> _menu_view_projects;
Widget<Gtk::MenuItem> _menu_view_refresh;
- Widget<Gtk::CheckMenuItem> _menu_view_toolbar;
+ Widget<Gtk::CheckMenuItem> _menu_view_statusbar;
Widget<Gtk::ImageMenuItem> _menu_zoom_in;
Widget<Gtk::ImageMenuItem> _menu_zoom_out;
+ Widget<Gtk::ImageMenuItem> _menu_zoom_full;
Widget<Gtk::ImageMenuItem> _menu_zoom_normal;
Widget<Gtk::Button> _messages_clear_but;
Widget<Gtk::Button> _messages_close_but;
Widget<Gtk::Dialog> _messages_win;
Widget<Gtk::Viewport> _project_list_viewport;
+ Widget<Gtk::Label> _latency_frames_label;
+ Widget<Gtk::Label> _latency_ms_label;
Widget<Gtk::Label> _sample_rate_label;
Widget<Gtk::TextView> _status_text;
- Widget<Gtk::Toolbar> _toolbar;
- Widget<Gtk::ToolButton> _zoom_full_but;
- Widget<Gtk::ToolButton> _zoom_normal_but;
+ Widget<Gtk::Statusbar> _statusbar;
};
#endif // PATCHAGE_PATCHAGE_HPP
diff --git a/src/patchage.ui b/src/patchage.ui
index c18e3cc..615225c 100644
--- a/src/patchage.ui
+++ b/src/patchage.ui
@@ -8,6 +8,7 @@
<child>
<object class="GtkVBox" id="main_vbox">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<child>
<object class="GtkMenuBar" id="menubar">
<property name="visible">True</property>
@@ -118,16 +119,6 @@
<child type="submenu">
<object class="GtkMenu" id="view_menu_menu">
<child>
- <object class="GtkCheckMenuItem" id="menu_view_toolbar">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Toolbar</property>
- <property name="use_underline">True</property>
- <property name="active">True</property>
- <accelerator key="T" signal="activate" modifiers="GDK_CONTROL_MASK"/>
- <signal name="activate" handler="on_menu_view_toolbar_activate"/>
- </object>
- </child>
- <child>
<object class="GtkCheckMenuItem" id="menu_view_projects">
<property name="visible">True</property>
<property name="label" translatable="yes">_Projects</property>
@@ -145,6 +136,16 @@
</object>
</child>
<child>
+ <object class="GtkCheckMenuItem" id="menu_view_statusbar">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Statusbar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <accelerator key="b" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <signal name="activate" handler="on_menu_view_toolbar_activate"/>
+ </object>
+ </child>
+ <child>
<object class="GtkSeparatorMenuItem" id="menuitem1">
<property name="visible">True</property>
</object>
@@ -168,6 +169,14 @@
</object>
</child>
<child>
+ <object class="GtkImageMenuItem" id="menu_zoom_full">
+ <property name="label">gtk-zoom-fit</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ <child>
<object class="GtkImageMenuItem" id="menu_zoom_normal">
<property name="label">gtk-zoom-100</property>
<property name="visible">True</property>
@@ -233,168 +242,12 @@
</packing>
</child>
<child>
- <object class="GtkToolbar" id="toolbar">
- <property name="visible">True</property>
- <property name="toolbar_style">icons</property>
- <property name="show_arrow">False</property>
- <property name="icon_size">1</property>
- <property name="icon_size_set">True</property>
- <child>
- <object class="GtkToolItem" id="toolitem28">
- <property name="visible">True</property>
- <property name="visible_vertical">False</property>
- <child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="yscale">0</property>
- <child>
- <object class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="label" translatable="yes"> Latency: </property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBoxEntry" id="buffer_size_combo">
- <property name="visible">True</property>
- <property name="border_width">1</property>
- </object>
- <packing>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="sample_rate_label">
- <property name="label" translatable="yes">48</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label9">
- <property name="xpad">1</property>
- <property name="label" translatable="yes">kHz</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="separatortoolitem3">
- <property name="visible">True</property>
- <property name="border_width">8</property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="clear_load_but">
- <property name="visible">True</property>
- <property name="stock_id">gtk-clear</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolItem" id="toolitem30">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="yscale">0</property>
- <child>
- <object class="GtkProgressBar" id="main_xrun_progress">
- <property name="visible">True</property>
- <property name="pulse_step">0.10000000149</property>
- <property name="text" translatable="yes">0 Dropouts</property>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="toolbutton1">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="draw">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="toolbutton2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="zoom_normal_but">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="stock_id">gtk-zoom-100</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="zoom_full_but">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="stock_id">gtk-zoom-fit</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
<object class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="position">204</property>
+ <property name="position_set">True</property>
<child>
<object class="GtkViewport" id="project_list_viewport">
<property name="visible">True</property>
@@ -416,8 +269,6 @@
<object class="GtkScrolledWindow" id="main_scrolledwin">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="is_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
@@ -435,6 +286,117 @@
</child>
</object>
<packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkStatusbar" id="statusbar">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Latency: </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="latency_frames_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">1024</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="frames_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> frames @ </property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="sample_rate_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">48</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> kHz (</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="latency_ms_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">21</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> ms)</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="main_xrun_progress">
+ <property name="visible">True</property>
+ <property name="show_text">True</property>
+ <property name="pulse_step">0.10000000149</property>
+ <property name="text" translatable="yes">0 Dropouts</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">1</property>
<property name="position">2</property>
</packing>
</child>