From 3764eedca0d8ca8d666401c8bb8364705a64317e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 20 Oct 2011 18:50:29 +0000 Subject: 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 --- gtk2_ardour/ardour3_styles.rc.in | 33 ++++++++++ gtk2_ardour/ardour3_widget_list.rc | 2 + gtk2_ardour/mixer_strip.cc | 25 +++++++- gtk2_ardour/route_ui.cc | 119 ++++++++++++++++++++++++++++++++++++- gtk2_ardour/route_ui.h | 11 ++++ 5 files changed, 187 insertions(+), 3 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 5607e7c7df..f29a4ef5f9 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -148,6 +148,27 @@ style "mixer_track_rec_enable_button_active" = "track_rec_enable_button_active" ythickness = 0 } +style "monitor_input_button" = "small_button" +{ + fg[NORMAL] = darker(@@COLPREFIX@_fg) + fg[PRELIGHT] = darker(@@COLPREFIX@_fg) + bg[NORMAL] = mix(0.1,@@COLPREFIX@_bright_indicator,darker(@@COLPREFIX@_bg)) + bg[PRELIGHT] = mix(0.1,@@COLPREFIX@_bright_indicator,darker(@@COLPREFIX@_bg)) + + fg[ACTIVE] = @@COLPREFIX@_fg + bg[ACTIVE] = @@COLPREFIX@_bright_indicator +} + +style "monitor_disk_button" = "small_button" +{ + fg[NORMAL] = darker(@@COLPREFIX@_fg) + fg[PRELIGHT] = darker(@@COLPREFIX@_fg) + bg[NORMAL] = mix(0.1,@@COLPREFIX@_bright_indicator,darker(@@COLPREFIX@_bg)) + bg[PRELIGHT] = mix(0.1,@@COLPREFIX@_bright_indicator,darker(@@COLPREFIX@_bg)) + + fg[ACTIVE] = @@COLPREFIX@_fg + bg[ACTIVE] = @@COLPREFIX@_bright_indicator +} style "solo_button" = "small_button" { @@ -247,6 +268,18 @@ style "mixer_solo_button_active" = "solo_button_active" ythickness = 0 } +style "mixer_monitor_input_button" = "monitor_input_button" +{ + xthickness = 0 + ythickness = 0 +} + +style "mixer_monitor_disk_button" = "monitor_disk_button" +{ + xthickness = 0 + ythickness = 0 +} + style "monitor_opt_button" = "small_button" { bg[NORMAL] = mix(0.1,@@COLPREFIX@_not_so_bright_indicator,@@COLPREFIX@_bg) diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index d6d5ec8c03..ad2a640725 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -80,6 +80,8 @@ widget "*MixerSoloButton" style:highest "mixer_solo_button" widget "*MixerSoloButton-alternate" style:highest "mixer_solo_button_alternate" widget "*MixerSoloButton-alternate2" style:highest "mixer_solo_button_alternate2" widget "*MixerSoloButton-active" style:highest "mixer_solo_button_active" +widget "*MixerMonitorInputButton" style:highest "mixer_monitor_input_button" +widget "*MixerMonitorDiskButton" style:highest "mixer_monitor_disk_button" widget "*TrackLoopButton*" style:highest "track_loop_button" widget "*PanAutomationLineSelector*" style:highest "multiline_combo" widget "*EditorTimeButton*" style:highest "time_button" diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 15550f4cd4..c069151bbe 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -87,7 +87,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer) , panners (sess) , button_table (3, 1) , solo_led_table (2, 2) - , middle_button_table (1, 2) + , middle_button_table (2, 2) , bottom_button_table (1, 2) , meter_point_label (_("pre")) , midi_input_enable_button (0) @@ -112,7 +112,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr rt , gpm (sess, 250) , panners (sess) , button_table (3, 1) - , middle_button_table (1, 2) + , middle_button_table (2, 2) , bottom_button_table (1, 2) , meter_point_label (_("pre")) , midi_input_enable_button (0) @@ -184,6 +184,9 @@ MixerStrip::init () mute_button->set_name ("MixerMuteButton"); solo_button->set_name ("MixerSoloButton"); + monitor_input_button->set_name ("MixerMonitorInputButton"); + monitor_disk_button->set_name ("MixerMonitorInputButton"); + solo_isolated_led = manage (new LED); solo_isolated_led->show (); solo_isolated_led->set_diameter (6); @@ -235,6 +238,8 @@ MixerStrip::init () middle_button_table.set_spacings (0); middle_button_table.attach (*mute_button, 0, 1, 0, 1); middle_button_table.attach (*solo_button, 1, 2, 0, 1); + middle_button_table.attach (*monitor_input_button, 0, 1, 1, 2); + middle_button_table.attach (*monitor_disk_button, 1, 2, 1, 2); bottom_button_table.set_col_spacings (0); bottom_button_table.set_homogeneous (true); @@ -396,6 +401,14 @@ MixerStrip::set_route (boost::shared_ptr rt) global_vpacker.pack_start (*spacer, false, false); } + if (is_track()) { + monitor_input_button->show (); + monitor_disk_button->show (); + } else { + monitor_input_button->hide(); + monitor_disk_button->hide (); + } + if (is_midi_track()) { if (midi_input_enable_button == 0) { Image* img = manage (new Image (get_icon (X_("midi_socket_small")))); @@ -1643,6 +1656,8 @@ MixerStrip::drop_send () rec_enable_button->set_sensitive (true); solo_isolated_led->set_sensitive (true); solo_safe_led->set_sensitive (true); + monitor_input_button->set_sensitive (true); + monitor_disk_button->set_sensitive (true); } void @@ -1679,6 +1694,8 @@ MixerStrip::show_send (boost::shared_ptr send) rec_enable_button->set_sensitive (false); solo_isolated_led->set_sensitive (false); solo_safe_led->set_sensitive (false); + monitor_input_button->set_sensitive (false); + monitor_disk_button->set_sensitive (false); if (boost::dynamic_pointer_cast(send)) { output_button.set_sensitive (false); @@ -1714,6 +1731,8 @@ MixerStrip::set_button_names () case Wide: rec_enable_button_label.set_text (_("Rec")); mute_button_label.set_text (_("Mute")); + monitor_input_button_label.set_text (_("In")); + monitor_disk_button_label.set_text (_("Disk")); if (_route && _route->solo_safe()) { solo_button_label.set_text (X_("!")); } else { @@ -1735,6 +1754,8 @@ MixerStrip::set_button_names () default: rec_enable_button_label.set_text (_("R")); mute_button_label.set_text (_("M")); + monitor_input_button_label.set_text (_("I")); + monitor_disk_button_label.set_text (_("D")); if (_route && _route->solo_safe()) { solo_button_label.set_text (X_("!")); if (!Config->get_solo_control_is_listen_control()) { 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 rp) boost::shared_ptr t = boost::dynamic_pointer_cast(_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 rp) } + if (is_track()) { + boost::shared_ptr t = boost::dynamic_pointer_cast(_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); @@ -555,6 +582,96 @@ RouteUI::rec_enable_press(GdkEventButton* ev) return true; } +void +RouteUI::monitoring_changed () +{ + boost::shared_ptr t = boost::dynamic_pointer_cast(_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 t = boost::dynamic_pointer_cast(_route); + + if (!t) { + return true; + } + + MonitorChoice mc; + boost::shared_ptr 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 () { diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index e5f240ff5b..d084ec696a 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -94,6 +94,8 @@ class RouteUI : public virtual AxisView BindableToggleButton* solo_button; BindableToggleButton* rec_enable_button; /* audio tracks */ BindableToggleButton* show_sends_button; /* busses */ + BindableToggleButton* monitor_input_button; + BindableToggleButton* monitor_disk_button; LED* solo_safe_led; LED* solo_isolated_led; @@ -101,6 +103,8 @@ class RouteUI : public virtual AxisView Gtk::Label solo_button_label; Gtk::Label mute_button_label; Gtk::Label rec_enable_button_label; + Gtk::Label monitor_input_button_label; + Gtk::Label monitor_disk_button_label; void send_blink (bool); sigc::connection send_blink_connection; @@ -121,6 +125,13 @@ class RouteUI : public virtual AxisView bool show_sends_press(GdkEventButton*); bool show_sends_release(GdkEventButton*); + bool monitor_release(GdkEventButton*, ARDOUR::MonitorChoice); + bool monitor_input_press(GdkEventButton*); + bool monitor_input_release(GdkEventButton*); + bool monitor_disk_press(GdkEventButton*); + bool monitor_disk_release(GdkEventButton*); + void monitoring_changed (); + void step_gain_up (); void step_gain_down (); void page_gain_up (); -- cgit v1.2.3