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
This commit is contained in:
parent
9931171b69
commit
ef92349187
@ -31,6 +31,7 @@
|
|||||||
#include "pbd/stacktrace.h"
|
#include "pbd/stacktrace.h"
|
||||||
#include "pbd/shiva.h"
|
#include "pbd/shiva.h"
|
||||||
#include "pbd/controllable.h"
|
#include "pbd/controllable.h"
|
||||||
|
#include "pbd/enumwriter.h"
|
||||||
|
|
||||||
#include "ardour_ui.h"
|
#include "ardour_ui.h"
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
@ -96,6 +97,10 @@ RouteUI::init ()
|
|||||||
mute_menu = 0;
|
mute_menu = 0;
|
||||||
solo_menu = 0;
|
solo_menu = 0;
|
||||||
sends_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;
|
ignore_toggle = false;
|
||||||
wait_for_release = false;
|
wait_for_release = false;
|
||||||
route_active_menu_item = 0;
|
route_active_menu_item = 0;
|
||||||
@ -806,52 +811,85 @@ RouteUI::build_mute_menu(void)
|
|||||||
mute_menu = new Menu;
|
mute_menu = new Menu;
|
||||||
mute_menu->set_name ("ArdourContextMenu");
|
mute_menu->set_name ("ArdourContextMenu");
|
||||||
|
|
||||||
#if FIX_ME_IN_3_0
|
|
||||||
MenuList& items = mute_menu->items();
|
MenuList& items = mute_menu->items();
|
||||||
CheckMenuItem* check;
|
|
||||||
|
|
||||||
check = new CheckMenuItem(_("Pre Fader"));
|
pre_fader_mute_check = manage (new CheckMenuItem(_("Pre Fader")));
|
||||||
init_mute_menu(PRE_FADER, check);
|
init_mute_menu(MuteMaster::PreFader, pre_fader_mute_check);
|
||||||
check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), PRE_FADER, check));
|
pre_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PreFader, pre_fader_mute_check));
|
||||||
_route->pre_fader_changed.connect(bind (mem_fun (*this, &RouteUI::pre_fader_toggle), check));
|
items.push_back (CheckMenuElem(*pre_fader_mute_check));
|
||||||
items.push_back (CheckMenuElem(*check));
|
pre_fader_mute_check->show_all();
|
||||||
check->show_all();
|
|
||||||
|
|
||||||
check = new CheckMenuItem(_("Post Fader"));
|
post_fader_mute_check = manage (new CheckMenuItem(_("Post Fader")));
|
||||||
init_mute_menu(POST_FADER, check);
|
init_mute_menu(MuteMaster::PostFader, post_fader_mute_check);
|
||||||
check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), POST_FADER, check));
|
post_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PostFader, post_fader_mute_check));
|
||||||
_route->post_fader_changed.connect(bind (mem_fun (*this, &RouteUI::post_fader_toggle), check));
|
items.push_back (CheckMenuElem(*post_fader_mute_check));
|
||||||
items.push_back (CheckMenuElem(*check));
|
post_fader_mute_check->show_all();
|
||||||
check->show_all();
|
|
||||||
|
|
||||||
check = new CheckMenuItem(_("Control Outs"));
|
listen_mute_check = manage (new CheckMenuItem(_("Control Outs")));
|
||||||
init_mute_menu(CONTROL_OUTS, check);
|
init_mute_menu(MuteMaster::Listen, listen_mute_check);
|
||||||
check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), CONTROL_OUTS, check));
|
listen_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Listen, listen_mute_check));
|
||||||
_route->control_outs_changed.connect(bind (mem_fun (*this, &RouteUI::control_outs_toggle), check));
|
items.push_back (CheckMenuElem(*listen_mute_check));
|
||||||
items.push_back (CheckMenuElem(*check));
|
listen_mute_check->show_all();
|
||||||
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 (SeparatorElem());
|
||||||
// items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn)));
|
// 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
|
void
|
||||||
RouteUI::init_mute_menu(MuteMaster::MutePoint mp, CheckMenuItem* check)
|
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
|
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
|
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
|
void
|
||||||
RouteUI::disconnect_input ()
|
RouteUI::disconnect_input ()
|
||||||
{
|
{
|
||||||
|
@ -99,6 +99,7 @@ class RouteUI : public virtual AxisView
|
|||||||
Gtk::Menu* solo_menu;
|
Gtk::Menu* solo_menu;
|
||||||
Gtk::Menu* sends_menu;
|
Gtk::Menu* sends_menu;
|
||||||
|
|
||||||
|
|
||||||
XMLNode *xml_node;
|
XMLNode *xml_node;
|
||||||
void ensure_xml_node ();
|
void ensure_xml_node ();
|
||||||
|
|
||||||
@ -137,12 +138,13 @@ class RouteUI : public virtual AxisView
|
|||||||
void solo_isolated_toggle (void*, Gtk::CheckMenuItem*);
|
void solo_isolated_toggle (void*, Gtk::CheckMenuItem*);
|
||||||
void toggle_solo_isolated (Gtk::CheckMenuItem*);
|
void toggle_solo_isolated (Gtk::CheckMenuItem*);
|
||||||
|
|
||||||
void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
|
Gtk::CheckMenuItem* pre_fader_mute_check;
|
||||||
void pre_fader_toggle(void*, Gtk::CheckMenuItem*);
|
Gtk::CheckMenuItem* post_fader_mute_check;
|
||||||
void post_fader_toggle(void*, Gtk::CheckMenuItem*);
|
Gtk::CheckMenuItem* listen_mute_check;
|
||||||
void control_outs_toggle(void*, Gtk::CheckMenuItem*);
|
Gtk::CheckMenuItem* main_mute_check;
|
||||||
void main_outs_toggle(void*, Gtk::CheckMenuItem*);
|
|
||||||
|
|
||||||
|
void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
|
||||||
|
void muting_change ();
|
||||||
void build_mute_menu(void);
|
void build_mute_menu(void);
|
||||||
void init_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
|
void init_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
|
||||||
|
|
||||||
|
@ -38,6 +38,8 @@ class MuteMaster : public AutomationControl
|
|||||||
Main = 0x8
|
Main = 0x8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const MutePoint AllPoints;
|
||||||
|
|
||||||
MuteMaster (Session& s, const std::string& name);
|
MuteMaster (Session& s, const std::string& name);
|
||||||
~MuteMaster() {}
|
~MuteMaster() {}
|
||||||
|
|
||||||
|
@ -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, solo_latched, "solo-latched", true)
|
||||||
CONFIG_VARIABLE (bool, latched_record_enable, "latched-record-enable", false)
|
CONFIG_VARIABLE (bool, latched_record_enable, "latched-record-enable", false)
|
||||||
CONFIG_VARIABLE (bool, all_safe, "all-safe", 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, solo_mute_override, "solo-mute-override", false)
|
||||||
CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false)
|
CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false)
|
||||||
CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0)
|
CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0)
|
||||||
|
@ -120,10 +120,11 @@ class Route : public SessionObject, public AutomatableControls
|
|||||||
void set_gain (gain_t val, void *src);
|
void set_gain (gain_t val, void *src);
|
||||||
void inc_gain (gain_t delta, 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);
|
void set_mute (bool yn, void* src);
|
||||||
bool muted () const;
|
bool muted () const;
|
||||||
|
|
||||||
|
|
||||||
/* controls use set_solo() to modify this route's solo state
|
/* controls use set_solo() to modify this route's solo state
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -232,10 +233,7 @@ class Route : public SessionObject, public AutomatableControls
|
|||||||
sigc::signal<void,void*> solo_isolated_changed;
|
sigc::signal<void,void*> solo_isolated_changed;
|
||||||
sigc::signal<void,void*> comment_changed;
|
sigc::signal<void,void*> comment_changed;
|
||||||
sigc::signal<void,void*> mute_changed;
|
sigc::signal<void,void*> mute_changed;
|
||||||
sigc::signal<void,void*> pre_fader_changed;
|
sigc::signal<void> mute_points_changed;
|
||||||
sigc::signal<void,void*> post_fader_changed;
|
|
||||||
sigc::signal<void,void*> control_outs_changed;
|
|
||||||
sigc::signal<void,void*> main_outs_changed;
|
|
||||||
sigc::signal<void> processors_changed;
|
sigc::signal<void> processors_changed;
|
||||||
sigc::signal<void,void*> record_enable_changed;
|
sigc::signal<void,void*> record_enable_changed;
|
||||||
sigc::signal<void,void*> route_group_changed;
|
sigc::signal<void,void*> route_group_changed;
|
||||||
@ -360,6 +358,7 @@ class Route : public SessionObject, public AutomatableControls
|
|||||||
|
|
||||||
boost::shared_ptr<SoloControllable> _solo_control;
|
boost::shared_ptr<SoloControllable> _solo_control;
|
||||||
boost::shared_ptr<MuteMaster> _mute_master;
|
boost::shared_ptr<MuteMaster> _mute_master;
|
||||||
|
MuteMaster::MutePoint _mute_points;
|
||||||
|
|
||||||
RouteGroup* _route_group;
|
RouteGroup* _route_group;
|
||||||
std::string _comment;
|
std::string _comment;
|
||||||
|
@ -27,6 +27,11 @@
|
|||||||
|
|
||||||
using namespace ARDOUR;
|
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)
|
MuteMaster::MuteMaster (Session& s, const std::string& name)
|
||||||
: AutomationControl (s, Evoral::Parameter (MuteAutomation), boost::shared_ptr<AutomationList>(), name)
|
: AutomationControl (s, Evoral::Parameter (MuteAutomation), boost::shared_ptr<AutomationList>(), name)
|
||||||
, _mute_point (MutePoint (0))
|
, _mute_point (MutePoint (0))
|
||||||
|
@ -130,6 +130,7 @@ Route::init ()
|
|||||||
_pending_declick = true;
|
_pending_declick = true;
|
||||||
_remote_control_id = 0;
|
_remote_control_id = 0;
|
||||||
_in_configure_processors = false;
|
_in_configure_processors = false;
|
||||||
|
_mute_points = MuteMaster::AllPoints;
|
||||||
|
|
||||||
_route_group = 0;
|
_route_group = 0;
|
||||||
|
|
||||||
@ -583,6 +584,18 @@ Route::solo_isolated () const
|
|||||||
return _solo_isolated;
|
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
|
void
|
||||||
Route::set_mute (bool yn, void *src)
|
Route::set_mute (bool yn, void *src)
|
||||||
{
|
{
|
||||||
@ -592,8 +605,13 @@ Route::set_mute (bool yn, void *src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (muted() != yn) {
|
if (muted() != yn) {
|
||||||
_mute_master->mute (yn);
|
if (yn) {
|
||||||
mute_changed (src);
|
_mute_master->mute_at (_mute_points);
|
||||||
|
} else {
|
||||||
|
_mute_master->clear_mute ();
|
||||||
|
}
|
||||||
|
|
||||||
|
mute_changed (src); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2439,7 +2439,7 @@ Session::route_solo_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
|
|||||||
if (!via_sends_only) {
|
if (!via_sends_only) {
|
||||||
/* do it */
|
/* do it */
|
||||||
(*i)->mod_solo_level (delta);
|
(*i)->mod_solo_level (delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user