summaryrefslogtreecommitdiff
path: root/gtk2_ardour/latency_gui.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-06-27 22:06:35 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-06-27 22:06:35 +0000
commitb5af3bb8e313e13166cc54c60a14e5492e674065 (patch)
treed27e045a17bae47e63cde89173a53fb30ffa298b /gtk2_ardour/latency_gui.cc
parent34be8c21198441a4f8ceac35da12250cafa2d1c2 (diff)
allow user tweaking of everything that might have inherent latency; add GUI for track level adjustment and widget that can be (but is not yet) embedded in a plugin GUI
git-svn-id: svn://localhost/ardour2/trunk@2075 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/latency_gui.cc')
-rw-r--r--gtk2_ardour/latency_gui.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/gtk2_ardour/latency_gui.cc b/gtk2_ardour/latency_gui.cc
new file mode 100644
index 0000000000..0146bfdaa8
--- /dev/null
+++ b/gtk2_ardour/latency_gui.cc
@@ -0,0 +1,167 @@
+#define __STDC_FORMAT_MACROS 1
+#include <inttypes.h>
+
+#include <ardour/latent.h>
+#include <gtkmm2ext/utils.h>
+
+#include "latency_gui.h"
+
+#include "i18n.h"
+
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace sigc;
+using namespace ARDOUR;
+
+
+static const gchar *_unit_strings[] = {
+ N_("sample"),
+ N_("msec"),
+ N_("period"),
+ 0
+};
+
+std::vector<std::string> LatencyGUI::unit_strings;
+
+void
+LatencyGUI::latency_printer (char *buf, unsigned int bufsize)
+{
+ double nframes = adjustment.get_value();
+
+ if (nframes < (sample_rate / 1000.0)) {
+ snprintf (buf, bufsize, "%" PRId64 " samples", (nframes64_t) rint (nframes));
+ } else {
+ snprintf (buf, bufsize, "%.2g msecs" , nframes / (sample_rate / 1000.0));
+ }
+}
+
+LatencyGUI::LatencyGUI (Latent& l, nframes64_t sr, nframes64_t psz)
+ : _latent (l),
+ initial_value (_latent.signal_latency()),
+ sample_rate (sr),
+ period_size (psz),
+ /* max 1 second, step by frames, page by msecs */
+ adjustment (initial_value, 0.0, sample_rate, 1.0, sample_rate / 1000.0f),
+ bc (adjustment, ignored, sigc::mem_fun (*this, &LatencyGUI::latency_printer)),
+ reset_button (_("Automatic"))
+{
+ Widget* w;
+
+ if (unit_strings.empty()) {
+ unit_strings = I18N (_unit_strings);
+ }
+
+ set_popdown_strings (units_combo, unit_strings);
+ units_combo.set_active_text (unit_strings.front());
+
+ w = manage (new Image (Stock::ADD, ICON_SIZE_BUTTON));
+ w->show ();
+ plus_button.add (*w);
+ w = manage (new Image (Stock::REMOVE, ICON_SIZE_BUTTON));
+ w->show ();
+ minus_button.add (*w);
+
+ hbox1.pack_start (bc, true, true);
+
+ hbox2.set_homogeneous (false);
+ hbox2.set_spacing (12);
+ hbox2.pack_start (reset_button);
+ hbox2.pack_start (minus_button);
+ hbox2.pack_start (plus_button);
+ hbox2.pack_start (units_combo, true, true);
+
+ minus_button.signal_clicked().connect (bind (mem_fun (*this, &LatencyGUI::change_latency_from_button), -1));
+ plus_button.signal_clicked().connect (bind (mem_fun (*this, &LatencyGUI::change_latency_from_button), 1));
+ reset_button.signal_clicked().connect (mem_fun (*this, &LatencyGUI::reset));
+
+ adjustment.signal_value_changed().connect (mem_fun (*this, &LatencyGUI::finish));
+
+ bc.set_size_request (-1, 25);
+ bc.set_style (BarController::LeftToRight);
+ bc.set_use_parent (true);
+ bc.set_name (X_("PluginSlider"));
+
+ set_spacing (12);
+ pack_start (hbox1, true, true);
+ pack_start (hbox2, true, true);
+}
+
+void
+LatencyGUI::finish ()
+{
+ nframes64_t new_value = (nframes64_t) adjustment.get_value();
+ if (new_value != initial_value) {
+ _latent.set_user_latency (new_value);
+ }
+}
+
+void
+LatencyGUI::reset ()
+{
+ _latent.set_user_latency (0);
+ adjustment.set_value (initial_value);
+}
+
+void
+LatencyGUI::refresh ()
+{
+ initial_value = _latent.signal_latency();
+ adjustment.set_value (initial_value);
+}
+
+void
+LatencyGUI::change_latency_from_button (int dir)
+{
+ Glib::ustring unitstr = units_combo.get_active_text();
+ double shift;
+
+ if (unitstr == unit_strings[0]) {
+ shift = 1;
+ } else if (unitstr == unit_strings[1]) {
+ shift = (sample_rate / 1000.0);
+ } else if (unitstr == unit_strings[2]) {
+ shift = period_size;
+ } else {
+ fatal << string_compose (_("programming error: %1 (%2)"), X_("illegal string in latency GUI units combo"), unitstr)
+ << endmsg;
+ /*NOTREACHED*/
+ }
+
+ if (dir > 0) {
+ adjustment.set_value (adjustment.get_value() + shift);
+ } else {
+ adjustment.set_value (adjustment.get_value() - shift);
+ }
+}
+
+LatencyDialog::LatencyDialog (const Glib::ustring& title, Latent& l, nframes64_t sr, nframes64_t psz)
+ : ArdourDialog (title, false, true),
+ lwidget (l, sr, psz)
+{
+
+ get_vbox()->pack_start (lwidget);
+ add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ add_button (Stock::APPLY, RESPONSE_REJECT);
+ add_button (Stock::OK, RESPONSE_ACCEPT);
+
+ show_all ();
+
+ while (true) {
+ int ret = run ();
+
+ switch (ret) {
+ case RESPONSE_ACCEPT:
+ return;
+ break;
+
+ case RESPONSE_REJECT:
+ lwidget.finish ();
+ break;
+ default:
+ return;
+ }
+ }
+}
+
+