diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-10-20 18:50:29 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-10-20 18:50:29 +0000 |
commit | 3764eedca0d8ca8d666401c8bb8364705a64317e (patch) | |
tree | eb666341e2b9a48c2cb8f2534725d6adfb33107e /gtk2_ardour/route_ui.cc | |
parent | 49b459f8d32ccabdac7cc0bacf3976557c00b2a6 (diff) |
add initial implementation of explicit monitor (input|disk) control. some behaviour to be worked out, still
git-svn-id: svn://localhost/ardour2/branches/3.0@10256 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/route_ui.cc')
-rw-r--r-- | gtk2_ardour/route_ui.cc | 119 |
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) { |