summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-10-20 18:50:29 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-10-20 18:50:29 +0000
commit3764eedca0d8ca8d666401c8bb8364705a64317e (patch)
treeeb666341e2b9a48c2cb8f2534725d6adfb33107e /gtk2_ardour
parent49b459f8d32ccabdac7cc0bacf3976557c00b2a6 (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')
-rw-r--r--gtk2_ardour/ardour3_styles.rc.in33
-rw-r--r--gtk2_ardour/ardour3_widget_list.rc2
-rw-r--r--gtk2_ardour/mixer_strip.cc25
-rw-r--r--gtk2_ardour/route_ui.cc119
-rw-r--r--gtk2_ardour/route_ui.h11
5 files changed, 187 insertions, 3 deletions
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<Route> 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<Route> 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> 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<InternalSend>(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<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) {
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 ();