From ef92349187b61349d2d5182f49f700183901f59e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 18 Nov 2009 13:25:13 +0000 Subject: [PATCH] bring back full mute control (pre/post/control/main) via mute button context click git-svn-id: svn://localhost/ardour2/branches/3.0@6116 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/route_ui.cc | 144 ++++++++++----------- gtk2_ardour/route_ui.h | 12 +- libs/ardour/ardour/mute_master.h | 2 + libs/ardour/ardour/rc_configuration_vars.h | 2 +- libs/ardour/ardour/route.h | 9 +- libs/ardour/mute_master.cc | 5 + libs/ardour/route.cc | 22 +++- libs/ardour/session.cc | 2 +- 8 files changed, 108 insertions(+), 90 deletions(-) diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 68c84bb1e7..5104601ba7 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -31,6 +31,7 @@ #include "pbd/stacktrace.h" #include "pbd/shiva.h" #include "pbd/controllable.h" +#include "pbd/enumwriter.h" #include "ardour_ui.h" #include "editor.h" @@ -96,6 +97,10 @@ RouteUI::init () mute_menu = 0; solo_menu = 0; sends_menu = 0; + pre_fader_mute_check = 0; + post_fader_mute_check = 0; + listen_mute_check = 0; + main_mute_check = 0; ignore_toggle = false; wait_for_release = false; route_active_menu_item = 0; @@ -806,52 +811,85 @@ RouteUI::build_mute_menu(void) mute_menu = new Menu; mute_menu->set_name ("ArdourContextMenu"); -#if FIX_ME_IN_3_0 MenuList& items = mute_menu->items(); - CheckMenuItem* check; - check = new CheckMenuItem(_("Pre Fader")); - init_mute_menu(PRE_FADER, check); - check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), PRE_FADER, check)); - _route->pre_fader_changed.connect(bind (mem_fun (*this, &RouteUI::pre_fader_toggle), check)); - items.push_back (CheckMenuElem(*check)); - check->show_all(); + pre_fader_mute_check = manage (new CheckMenuItem(_("Pre Fader"))); + init_mute_menu(MuteMaster::PreFader, pre_fader_mute_check); + pre_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PreFader, pre_fader_mute_check)); + items.push_back (CheckMenuElem(*pre_fader_mute_check)); + pre_fader_mute_check->show_all(); - check = new CheckMenuItem(_("Post Fader")); - init_mute_menu(POST_FADER, check); - check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), POST_FADER, check)); - _route->post_fader_changed.connect(bind (mem_fun (*this, &RouteUI::post_fader_toggle), check)); - items.push_back (CheckMenuElem(*check)); - check->show_all(); + post_fader_mute_check = manage (new CheckMenuItem(_("Post Fader"))); + init_mute_menu(MuteMaster::PostFader, post_fader_mute_check); + post_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PostFader, post_fader_mute_check)); + items.push_back (CheckMenuElem(*post_fader_mute_check)); + post_fader_mute_check->show_all(); - check = new CheckMenuItem(_("Control Outs")); - init_mute_menu(CONTROL_OUTS, check); - check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), CONTROL_OUTS, check)); - _route->control_outs_changed.connect(bind (mem_fun (*this, &RouteUI::control_outs_toggle), check)); - items.push_back (CheckMenuElem(*check)); - check->show_all(); + listen_mute_check = manage (new CheckMenuItem(_("Control Outs"))); + init_mute_menu(MuteMaster::Listen, listen_mute_check); + listen_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Listen, listen_mute_check)); + items.push_back (CheckMenuElem(*listen_mute_check)); + listen_mute_check->show_all(); + + main_mute_check = manage (new CheckMenuItem(_("Main Outs"))); + init_mute_menu(MuteMaster::Main, main_mute_check); + main_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Main, main_mute_check)); + items.push_back (CheckMenuElem(*main_mute_check)); + main_mute_check->show_all(); - check = new CheckMenuItem(_("Main Outs")); - init_mute_menu(MAIN_OUTS, check); - check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MAIN_OUTS, check)); - _route->main_outs_changed.connect(bind (mem_fun (*this, &RouteUI::main_outs_toggle), check)); - items.push_back (CheckMenuElem(*check)); - check->show_all(); -#endif //items.push_back (SeparatorElem()); // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn))); + + _route->mute_points_changed.connect (mem_fun (*this, &RouteUI::muting_change)); } void RouteUI::init_mute_menu(MuteMaster::MutePoint mp, CheckMenuItem* check) { - check->set_active (_route->mute_master()->muted_at (mp)); + check->set_active (_route->mute_points() & mp); } void -RouteUI::toggle_mute_menu(MuteMaster::MutePoint /*mp*/, Gtk::CheckMenuItem* /*check*/) +RouteUI::toggle_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check) { - // _route->set_mute_config(type, check->get_active(), this); + if (check->get_active()) { + _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() | mp)); + } else { + _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() & ~mp)); + } +} + +void +RouteUI::muting_change () +{ + ENSURE_GUI_THREAD(mem_fun (*this, &RouteUI::muting_change)); + + bool yn; + MuteMaster::MutePoint current = _route->mute_points (); + + yn = (current & MuteMaster::PreFader); + + if (pre_fader_mute_check->get_active() != yn) { + pre_fader_mute_check->set_active (yn); + } + + yn = (current & MuteMaster::PostFader); + + if (post_fader_mute_check->get_active() != yn) { + post_fader_mute_check->set_active (yn); + } + + yn = (current & MuteMaster::Listen); + + if (listen_mute_check->get_active() != yn) { + listen_mute_check->set_active (yn); + } + + yn = (current & MuteMaster::Main); + + if (main_mute_check->get_active() != yn) { + main_mute_check->set_active (yn); + } } void @@ -1164,52 +1202,6 @@ RouteUI::solo_isolated_toggle(void* /*src*/, Gtk::CheckMenuItem* check) } } -#ifdef FIX_THIS_FOR_3_0 -void -RouteUI::pre_fader_toggle(void* src, Gtk::CheckMenuItem* check) -{ - ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::pre_fader_toggle), src, check)); - - bool yn = _route->get_mute_config(PRE_FADER); - if (check->get_active() != yn) { - check->set_active (yn); - } -} - -void -RouteUI::post_fader_toggle(void* src, Gtk::CheckMenuItem* check) -{ - ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::post_fader_toggle), src, check)); - - bool yn = _route->get_mute_config(POST_FADER); - if (check->get_active() != yn) { - check->set_active (yn); - } -} - -void -RouteUI::control_outs_toggle(void* src, Gtk::CheckMenuItem* check) -{ - ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::control_outs_toggle), src, check)); - - bool yn = _route->get_mute_config(CONTROL_OUTS); - if (check->get_active() != yn) { - check->set_active (yn); - } -} - -void -RouteUI::main_outs_toggle(void* src, Gtk::CheckMenuItem* check) -{ - ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::main_outs_toggle), src, check)); - - bool yn = _route->get_mute_config(MAIN_OUTS); - if (check->get_active() != yn) { - check->set_active (yn); - } -} -#endif - void RouteUI::disconnect_input () { diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index 3b611d23a0..1b2aca1689 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -99,6 +99,7 @@ class RouteUI : public virtual AxisView Gtk::Menu* solo_menu; Gtk::Menu* sends_menu; + XMLNode *xml_node; void ensure_xml_node (); @@ -137,12 +138,13 @@ class RouteUI : public virtual AxisView void solo_isolated_toggle (void*, Gtk::CheckMenuItem*); void toggle_solo_isolated (Gtk::CheckMenuItem*); - void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*); - void pre_fader_toggle(void*, Gtk::CheckMenuItem*); - void post_fader_toggle(void*, Gtk::CheckMenuItem*); - void control_outs_toggle(void*, Gtk::CheckMenuItem*); - void main_outs_toggle(void*, Gtk::CheckMenuItem*); + Gtk::CheckMenuItem* pre_fader_mute_check; + Gtk::CheckMenuItem* post_fader_mute_check; + Gtk::CheckMenuItem* listen_mute_check; + Gtk::CheckMenuItem* main_mute_check; + void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*); + void muting_change (); void build_mute_menu(void); void init_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*); diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h index 70015f3a35..ef65e69aba 100644 --- a/libs/ardour/ardour/mute_master.h +++ b/libs/ardour/ardour/mute_master.h @@ -38,6 +38,8 @@ class MuteMaster : public AutomationControl Main = 0x8 }; + static const MutePoint AllPoints; + MuteMaster (Session& s, const std::string& name); ~MuteMaster() {} diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index f8e61bff79..b0e0c94b84 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -83,7 +83,7 @@ CONFIG_VARIABLE (bool, solo_control_is_listen_control, "solo-control-is-listen-c CONFIG_VARIABLE (bool, solo_latched, "solo-latched", true) CONFIG_VARIABLE (bool, latched_record_enable, "latched-record-enable", false) CONFIG_VARIABLE (bool, all_safe, "all-safe", false) -CONFIG_VARIABLE (bool, show_solo_mutes, "show-solo-mutes", false) +CONFIG_VARIABLE (bool, show_solo_mutes, "show-solo-mutes", true) CONFIG_VARIABLE (bool, solo_mute_override, "solo-mute-override", false) CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false) CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0) diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 4743058574..1a60e2f8cd 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -120,10 +120,11 @@ class Route : public SessionObject, public AutomatableControls void set_gain (gain_t val, void *src); void inc_gain (gain_t delta, void *src); + void set_mute_points (MuteMaster::MutePoint); + MuteMaster::MutePoint mute_points() const { return _mute_points; } void set_mute (bool yn, void* src); bool muted () const; - /* controls use set_solo() to modify this route's solo state */ @@ -232,10 +233,7 @@ class Route : public SessionObject, public AutomatableControls sigc::signal solo_isolated_changed; sigc::signal comment_changed; sigc::signal mute_changed; - sigc::signal pre_fader_changed; - sigc::signal post_fader_changed; - sigc::signal control_outs_changed; - sigc::signal main_outs_changed; + sigc::signal mute_points_changed; sigc::signal processors_changed; sigc::signal record_enable_changed; sigc::signal route_group_changed; @@ -360,6 +358,7 @@ class Route : public SessionObject, public AutomatableControls boost::shared_ptr _solo_control; boost::shared_ptr _mute_master; + MuteMaster::MutePoint _mute_points; RouteGroup* _route_group; std::string _comment; diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc index 224eccdd51..1d0b2dda06 100644 --- a/libs/ardour/mute_master.cc +++ b/libs/ardour/mute_master.cc @@ -27,6 +27,11 @@ using namespace ARDOUR; +const MuteMaster::MutePoint MuteMaster::AllPoints = MutePoint (MuteMaster::PreFader| + MuteMaster::PostFader| + MuteMaster::Listen| + MuteMaster::Main); + MuteMaster::MuteMaster (Session& s, const std::string& name) : AutomationControl (s, Evoral::Parameter (MuteAutomation), boost::shared_ptr(), name) , _mute_point (MutePoint (0)) diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 009adce9c8..38bed70dfa 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -130,6 +130,7 @@ Route::init () _pending_declick = true; _remote_control_id = 0; _in_configure_processors = false; + _mute_points = MuteMaster::AllPoints; _route_group = 0; @@ -583,6 +584,18 @@ Route::solo_isolated () const return _solo_isolated; } +void +Route::set_mute_points (MuteMaster::MutePoint mp) +{ + _mute_points = mp; + mute_points_changed (); /* EMIT SIGNAL */ + + if (_mute_master->muted()) { + _mute_master->mute_at (_mute_points); + mute_changed (this); /* EMIT SIGNAL */ + } +} + void Route::set_mute (bool yn, void *src) { @@ -592,8 +605,13 @@ Route::set_mute (bool yn, void *src) } if (muted() != yn) { - _mute_master->mute (yn); - mute_changed (src); + if (yn) { + _mute_master->mute_at (_mute_points); + } else { + _mute_master->clear_mute (); + } + + mute_changed (src); /* EMIT SIGNAL */ } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 6c26e99a9c..dfa9b90776 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2439,7 +2439,7 @@ Session::route_solo_changed (void* /*src*/, boost::weak_ptr wpr) if (!via_sends_only) { /* do it */ (*i)->mod_solo_level (delta); - } + } } }