summaryrefslogtreecommitdiff
path: root/gtk2_ardour/route_ui.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/route_ui.cc')
-rw-r--r--gtk2_ardour/route_ui.cc119
1 files changed, 118 insertions, 1 deletions
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 90de21d854..6607da3942 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -137,6 +137,22 @@ RouteUI::init ()
// show_sends_button->set_self_managed (true);
UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), "");
+ monitor_input_button = manage (new BindableToggleButton ());
+ // monitor_input_button->set_self_managed (true);
+ monitor_input_button->set_name ("MonitorInputButton");
+ monitor_input_button->add (monitor_input_button_label);
+ monitor_input_button_label.show ();
+ UI::instance()->set_tip (monitor_input_button, _("Monitor input"), "");
+ monitor_input_button->set_no_show_all (true);
+
+ monitor_disk_button = manage (new BindableToggleButton ());
+ // monitor_disk_button->set_self_managed (true);
+ monitor_disk_button->set_name ("MonitorDiskButton");
+ monitor_disk_button->add (monitor_disk_button_label);
+ monitor_disk_button_label.show ();
+ UI::instance()->set_tip (monitor_disk_button, _("Monitor playback"), "");
+ monitor_disk_button->set_no_show_all (true);
+
_session->SoloChanged.connect (_session_connections, invalidator (*this), boost::bind (&RouteUI::solo_changed_so_update_mute, this), gui_context());
_session->TransportStateChange.connect (_session_connections, invalidator (*this), boost::bind (&RouteUI::check_rec_enable_sensitivity, this), gui_context());
_session->RecordStateChanged.connect (_session_connections, invalidator (*this), boost::bind (&RouteUI::session_rec_enable_changed, this), gui_context());
@@ -153,6 +169,12 @@ RouteUI::init ()
solo_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::solo_release), false);
mute_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::mute_press), false);
mute_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::mute_release), false);
+
+ monitor_input_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_press), false);
+ monitor_input_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_release), false);
+
+ monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press), false);
+ monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release), false);
}
void
@@ -211,7 +233,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
t->RecordEnableChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
-
+
rec_enable_button->show();
rec_enable_button->set_controllable (t->rec_enable_control());
@@ -224,6 +246,11 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
}
+ if (is_track()) {
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
+ t->MonitoringChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::monitoring_changed, this), gui_context());
+ }
+
mute_button->unset_flags (Gtk::CAN_FOCUS);
solo_button->unset_flags (Gtk::CAN_FOCUS);
@@ -556,6 +583,96 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
}
void
+RouteUI::monitoring_changed ()
+{
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
+
+ if (!t) {
+ return;
+ }
+
+ MonitorChoice mc = t->monitoring();
+
+ if (mc & MonitorInput) {
+ monitor_input_button->set_active (true);
+ } else {
+ monitor_input_button->set_active (false);
+ }
+
+ if (mc & MonitorDisk) {
+ monitor_disk_button->set_active (true);
+ } else {
+ monitor_disk_button->set_active (false);
+ }
+}
+
+bool
+RouteUI::monitor_input_press(GdkEventButton* ev)
+{
+ return true;
+}
+
+bool
+RouteUI::monitor_input_release(GdkEventButton* ev)
+{
+ return monitor_release (ev, MonitorInput);
+}
+
+bool
+RouteUI::monitor_disk_press (GdkEventButton* ev)
+{
+ return true;
+}
+
+bool
+RouteUI::monitor_disk_release (GdkEventButton* ev)
+{
+ return monitor_release (ev, MonitorDisk);
+}
+
+bool
+RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
+{
+ if (ev->button != 1) {
+ return false;
+ }
+
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
+
+ if (!t) {
+ return true;
+ }
+
+ MonitorChoice mc;
+ boost::shared_ptr<RouteList> rl;
+
+ /* XXX for now, monitoring choices are orthogonal. cue monitoring
+ will follow in 3.X but requires mixing the input and playback (disk)
+ signal together, which requires yet more buffers.
+ */
+
+ if (t->monitoring() & monitor_choice) {
+ mc = MonitorChoice (t->monitoring() & ~monitor_choice);
+ } else {
+ /* this line will change when the options are non-orthogonal */
+ // mc = MonitorChoice (t->monitoring() | monitor_choice);
+ mc = monitor_choice;
+ }
+
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
+ rl = _session->get_routes ();
+
+ } else {
+ rl.reset (new RouteList);
+ rl->push_back (route());
+ }
+
+ _session->set_monitoring (rl, mc, Session::rt_cleanup, true);
+
+ return true;
+}
+
+void
RouteUI::build_record_menu ()
{
if (record_menu) {