diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index dd460e4b63..f32b0a38f1 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -466,6 +466,7 @@ Default(ardour_dark_theme) Default(ardour_light_theme) Default(ardour_dark_sae_theme) Default(ardour_light_sae_theme) +Default(ardour_menus) if env['VST']: Default(ardourlib) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 6b8b7fba0f..542ba5d388 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -516,6 +516,7 @@ + diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 76173e8447..204e52c34c 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -706,6 +706,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void toggle_GainReduceFastTransport(); void toggle_LatchedSolo(); void toggle_ShowSoloMutes(); + void toggle_SoloMuteOverride(); void toggle_LatchedRecordEnable (); void toggle_RegionEquivalentsOverlap (); void toggle_PrimaryClockDeltaEditCursor (); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index f9d47c0967..14158ab9af 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -511,6 +511,8 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_toggle_action (option_actions, X_("ShowSoloMutes"), _("Show solo muting"), mem_fun (*this, &ARDOUR_UI::toggle_ShowSoloMutes)); ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_toggle_action (option_actions, X_("SoloMuteOverride"), _("Override muting"), mem_fun (*this, &ARDOUR_UI::toggle_SoloMuteOverride)); + ActionManager::session_sensitive_actions.push_back (act); /* !!! REMEMBER THAT RADIO ACTIONS HAVE TO BE HANDLED WITH MORE FINESSE THAN SIMPLE TOGGLES !!! */ diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 7cfef62449..8923f5c9ba 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -553,6 +553,12 @@ ARDOUR_UI::toggle_ShowSoloMutes() ActionManager::toggle_config_state ("options", "ShowSoloMutes", &Configuration::set_show_solo_mutes, &Configuration::get_show_solo_mutes); } +void +ARDOUR_UI::toggle_SoloMuteOverride() +{ + ActionManager::toggle_config_state ("options", "SoloMuteOverride", &Configuration::set_solo_mute_override, &Configuration::get_solo_mute_override); +} + void ARDOUR_UI::toggle_PrimaryClockDeltaEditCursor() { @@ -1105,6 +1111,8 @@ ARDOUR_UI::parameter_changed (const char* parameter_name) ActionManager::map_some_state ("options", "LatchedSolo", &Configuration::get_solo_latched); } else if (PARAM_IS ("show-solo-mutes")) { ActionManager::map_some_state ("options", "ShowSoloMutes", &Configuration::get_show_solo_mutes); + } else if (PARAM_IS ("solo-mute-override")) { + ActionManager::map_some_state ("options", "SoloMuteOverride", &Configuration::get_solo_mute_override); } else if (PARAM_IS ("solo-model")) { map_solo_model (); } else if (PARAM_IS ("auto-play")) { diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index 534bd64be3..481dad6921 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -91,6 +91,7 @@ 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, solo_mute_override, "solo-mute-override", false) CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false) /* click */ diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 4c07b057ff..f80eb45fc7 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -116,7 +116,7 @@ class Route : public IO void set_solo_safe (bool yn, void *src); bool solo_safe() const { return _solo_safe; } - + void set_mute (bool yn, void *src); bool muted() const { return _muted; } bool solo_muted() const { return desired_solo_gain == 0.0; } @@ -247,6 +247,7 @@ class Route : public IO protected: friend class Session; + void catch_up_on_solo_mute_override (); void set_solo_mute (bool yn); void set_block_size (nframes_t nframes); bool has_external_redirects() const; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 0b845f6eeb..ac0c052fa1 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1479,6 +1479,7 @@ class Session : public PBD::StatefulDestructible void route_mute_changed (void *src); void route_solo_changed (void *src, boost::weak_ptr); void catch_up_on_solo (); + void catch_up_on_solo_mute_override (); void update_route_solo_state (); void modify_solo_mute (bool, bool); void strip_portname_for_solo (string& portname); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index a2cf025b85..92f6ca3acd 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -816,6 +816,24 @@ Route::set_solo (bool yn, void *src) _soloed = yn; solo_changed (src); /* EMIT SIGNAL */ _solo_control.Changed (); /* EMIT SIGNAL */ + } + + catch_up_on_solo_mute_override (); +} + +void +Route::catch_up_on_solo_mute_override () +{ + Glib::Mutex::Lock lm (declick_lock); + + if (_muted) { + if (Config->get_solo_mute_override()) { + desired_mute_gain = (_soloed?1.0:0.0); + } else { + desired_mute_gain = 0.0; + } + } else { + desired_mute_gain = 1.0; } } @@ -855,7 +873,12 @@ Route::set_mute (bool yn, void *src) _mute_control.Changed (); /* EMIT SIGNAL */ Glib::Mutex::Lock lm (declick_lock); - desired_mute_gain = (yn?0.0f:1.0f); + + if (_soloed && Config->get_solo_mute_override()){ + desired_mute_gain = 1.0f; + } else { + desired_mute_gain = (yn?0.0f:1.0f); + } } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 86e55845e4..04fb880bcb 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2302,8 +2302,6 @@ Session::update_route_solo_state () bool is_track = false; bool signal = false; - /* caller must hold RouteLock */ - /* this is where we actually implement solo by changing the solo mute setting of each track. */ @@ -2404,7 +2402,20 @@ Session::catch_up_on_solo () */ update_route_solo_state(); } - + +void +Session::catch_up_on_solo_mute_override () +{ + /* this is called whenever the param solo-mute-override is + changed. + */ + shared_ptr r = routes.reader (); + + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { + (*i)->catch_up_on_solo_mute_override (); + } +} + shared_ptr Session::route_by_name (string name) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 3b68f8fb44..2b7aca67a7 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3363,6 +3363,8 @@ Session::config_changed (const char* parameter_name) buf[1] = (Config->get_initial_program_change() & 0x7f); deliver_midi (_mmc_port, buf, 2); } + } else if (PARAM_IS ("solo-mute-override")) { + catch_up_on_solo_mute_override (); } set_dirty ();