remove muted-by-others, a concept that turns out to have been a red herring; add auditioning alert button to monitor section; start adding exclusive solo button to monitor section
git-svn-id: svn://localhost/ardour2/branches/3.0@7052 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
823bad3049
commit
bf6de6da77
@ -328,18 +328,15 @@ style "solo_button" = "small_button"
|
|||||||
style "solo_button_alternate" = "small_button"
|
style "solo_button_alternate" = "small_button"
|
||||||
{
|
{
|
||||||
#
|
#
|
||||||
# this is the "solo-safe" solo theme
|
# this is the "solo-isolated" solo theme
|
||||||
#
|
#
|
||||||
|
|
||||||
bg[NORMAL] = { 0.19, 0.97, 0.69 } # solo-safe
|
bg[ACTIVE] = { 0.66, 0.97, 0.19 }
|
||||||
bg[ACTIVE] = { 0.19, 0.97, 0.69 } # solo-safe
|
|
||||||
bg[SELECTED] = { 0.19, 0.97, 0.69 } # solo-safe
|
|
||||||
bg[PRELIGHT] = { 0.19, 0.97, 0.69 } # solo-safe
|
|
||||||
|
|
||||||
fg[ACTIVE] = { 0, 0, 0 }
|
fg[ACTIVE] = { 1.0, 0, 0 }
|
||||||
fg[SELECTED] = { 0, 0, 0 }
|
fg[SELECTED] = { 1.0, 0, 0 }
|
||||||
fg[NORMAL] = { 0, 0, 0 }
|
fg[NORMAL] = { 1.0, 0, 0 }
|
||||||
fg[PRELIGHT] = { 0, 0, 0 }
|
fg[PRELIGHT] = { 1.0, 0, 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
style "solo_button_alternate2" = "small_button"
|
style "solo_button_alternate2" = "small_button"
|
||||||
|
@ -51,7 +51,8 @@ MonitorSection::MonitorSection (Session* s)
|
|||||||
, dim_all_button (_("dim"))
|
, dim_all_button (_("dim"))
|
||||||
, mono_button (_("mono"))
|
, mono_button (_("mono"))
|
||||||
, rude_solo_button (_("soloing"))
|
, rude_solo_button (_("soloing"))
|
||||||
|
, rude_audition_button (_("auditioning"))
|
||||||
|
, exclusive_solo_button (_("Exclusive solo"))
|
||||||
{
|
{
|
||||||
Glib::RefPtr<Action> act;
|
Glib::RefPtr<Action> act;
|
||||||
|
|
||||||
@ -90,10 +91,16 @@ MonitorSection::MonitorSection (Session* s)
|
|||||||
rude_solo_button.set_name ("TransportSoloAlert");
|
rude_solo_button.set_name ("TransportSoloAlert");
|
||||||
rude_solo_button.show ();
|
rude_solo_button.show ();
|
||||||
|
|
||||||
ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MonitorSection::solo_blink));
|
rude_audition_button.set_name ("TransportAuditioningAlert");
|
||||||
|
rude_audition_button.show ();
|
||||||
|
|
||||||
|
ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MonitorSection::do_blink));
|
||||||
|
|
||||||
rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo), false);
|
rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo), false);
|
||||||
UI::instance()->set_tip (rude_solo_button, _("When active, something is soloed.\nClick to de-solo everything"));
|
UI::instance()->set_tip (rude_solo_button, _("When active, something is soloed.\nClick to de-solo everything"));
|
||||||
|
|
||||||
|
rude_audition_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_audition), false);
|
||||||
|
UI::instance()->set_tip (rude_audition_button, _("When active, auditioning is active.\nClick to stop the audition"));
|
||||||
|
|
||||||
solo_model_box.set_spacing (6);
|
solo_model_box.set_spacing (6);
|
||||||
solo_model_box.pack_start (solo_in_place_button, false, false);
|
solo_model_box.pack_start (solo_in_place_button, false, false);
|
||||||
@ -151,9 +158,13 @@ MonitorSection::MonitorSection (Session* s)
|
|||||||
|
|
||||||
solo_packer->pack_start (*spin_packer, true, true);
|
solo_packer->pack_start (*spin_packer, true, true);
|
||||||
|
|
||||||
|
exclusive_solo_button.set_name (X_("MonitorCutButton"));
|
||||||
|
|
||||||
upper_packer.set_spacing (12);
|
upper_packer.set_spacing (12);
|
||||||
upper_packer.pack_start (rude_solo_button, false, false);
|
upper_packer.pack_start (rude_solo_button, false, false);
|
||||||
|
upper_packer.pack_start (rude_audition_button, false, false);
|
||||||
upper_packer.pack_start (solo_model_box, false, false);
|
upper_packer.pack_start (solo_model_box, false, false);
|
||||||
|
upper_packer.pack_start (exclusive_solo_button, false, false);
|
||||||
upper_packer.pack_start (*solo_packer, false, false);
|
upper_packer.pack_start (*solo_packer, false, false);
|
||||||
|
|
||||||
act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all"));
|
act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all"));
|
||||||
@ -807,6 +818,32 @@ MonitorSection::map_state ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MonitorSection::do_blink (bool onoff)
|
||||||
|
{
|
||||||
|
solo_blink (onoff);
|
||||||
|
audition_blink (onoff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MonitorSection::audition_blink (bool onoff)
|
||||||
|
{
|
||||||
|
if (_session == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_session->is_auditioning()) {
|
||||||
|
if (onoff) {
|
||||||
|
rude_audition_button.set_state (STATE_ACTIVE);
|
||||||
|
} else {
|
||||||
|
rude_audition_button.set_state (STATE_NORMAL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rude_audition_button.set_active (false);
|
||||||
|
rude_audition_button.set_state (STATE_NORMAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MonitorSection::solo_blink (bool onoff)
|
MonitorSection::solo_blink (bool onoff)
|
||||||
{
|
{
|
||||||
@ -840,6 +877,15 @@ MonitorSection::cancel_solo (GdkEventButton* ev)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MonitorSection::cancel_audition (GdkEventButton* ev)
|
||||||
|
{
|
||||||
|
if (_session) {
|
||||||
|
_session->cancel_audition();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MonitorSection::solo_cut_changed ()
|
MonitorSection::solo_cut_changed ()
|
||||||
{
|
{
|
||||||
|
@ -113,9 +113,14 @@ class MonitorSection : public RouteUI
|
|||||||
BindableToggleButton dim_all_button;
|
BindableToggleButton dim_all_button;
|
||||||
BindableToggleButton mono_button;
|
BindableToggleButton mono_button;
|
||||||
BindableToggleButton rude_solo_button;
|
BindableToggleButton rude_solo_button;
|
||||||
|
BindableToggleButton rude_audition_button;
|
||||||
|
BindableToggleButton exclusive_solo_button;
|
||||||
|
|
||||||
|
void do_blink (bool);
|
||||||
void solo_blink (bool);
|
void solo_blink (bool);
|
||||||
|
void audition_blink (bool);
|
||||||
bool cancel_solo (GdkEventButton*);
|
bool cancel_solo (GdkEventButton*);
|
||||||
|
bool cancel_audition (GdkEventButton*);
|
||||||
void solo_cut_changed ();
|
void solo_cut_changed ();
|
||||||
void update_solo_model ();
|
void update_solo_model ();
|
||||||
void parameter_changed (std::string);
|
void parameter_changed (std::string);
|
||||||
|
@ -294,7 +294,7 @@ RouteUI::mute_press (GdkEventButton* ev)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_mute_release = new SoloMuteRelease (_route->self_muted ());
|
_mute_release = new SoloMuteRelease (_route->muted ());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev->button == 1 || Keyboard::is_button2_event (ev)) {
|
if (ev->button == 1 || Keyboard::is_button2_event (ev)) {
|
||||||
@ -305,7 +305,7 @@ RouteUI::mute_press (GdkEventButton* ev)
|
|||||||
_mute_release->routes = _session->get_routes ();
|
_mute_release->routes = _session->get_routes ();
|
||||||
}
|
}
|
||||||
|
|
||||||
_session->set_mute (_session->get_routes(), !_route->self_muted());
|
_session->set_mute (_session->get_routes(), !_route->muted());
|
||||||
|
|
||||||
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
|
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
|
||||||
|
|
||||||
@ -318,7 +318,7 @@ RouteUI::mute_press (GdkEventButton* ev)
|
|||||||
_mute_release->routes = _session->get_routes ();
|
_mute_release->routes = _session->get_routes ();
|
||||||
}
|
}
|
||||||
|
|
||||||
_session->set_mute (_session->get_routes(), !_route->self_muted(), Session::rt_cleanup, true);
|
_session->set_mute (_session->get_routes(), !_route->muted(), Session::rt_cleanup, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -332,7 +332,7 @@ RouteUI::mute_press (GdkEventButton* ev)
|
|||||||
_mute_release->routes = rl;
|
_mute_release->routes = rl;
|
||||||
}
|
}
|
||||||
|
|
||||||
_session->set_mute (rl, !_route->self_muted());
|
_session->set_mute (rl, !_route->muted());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -835,7 +835,7 @@ RouteUI::mute_visual_state (Session* s, boost::shared_ptr<Route> r)
|
|||||||
|
|
||||||
if (Config->get_show_solo_mutes()) {
|
if (Config->get_show_solo_mutes()) {
|
||||||
|
|
||||||
if (r->self_muted ()) {
|
if (r->muted ()) {
|
||||||
/* full mute */
|
/* full mute */
|
||||||
return 2;
|
return 2;
|
||||||
} else if (s->soloing() && !r->soloed() && !r->solo_isolated()) {
|
} else if (s->soloing() && !r->soloed() && !r->solo_isolated()) {
|
||||||
@ -847,7 +847,7 @@ RouteUI::mute_visual_state (Session* s, boost::shared_ptr<Route> r)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (r->self_muted()) {
|
if (r->muted()) {
|
||||||
/* full mute */
|
/* full mute */
|
||||||
return 2;
|
return 2;
|
||||||
} else {
|
} else {
|
||||||
@ -866,7 +866,7 @@ RouteUI::update_mute_display ()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool model = _route->self_muted();
|
bool model = _route->muted();
|
||||||
bool view = mute_button->get_active();
|
bool view = mute_button->get_active();
|
||||||
|
|
||||||
/* first make sure the button's "depressed" visual
|
/* first make sure the button's "depressed" visual
|
||||||
|
@ -46,12 +46,8 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful
|
|||||||
MuteMaster (Session& s, const std::string& name);
|
MuteMaster (Session& s, const std::string& name);
|
||||||
~MuteMaster() {}
|
~MuteMaster() {}
|
||||||
|
|
||||||
bool self_muted() const { return _self_muted && (_mute_point != MutePoint (0)); }
|
bool muted() const { return _muted && (_mute_point != MutePoint (0)); }
|
||||||
bool muted_by_others() const { return _muted_by_others && (_mute_point != MutePoint (0)); }
|
bool muted_at (MutePoint mp) const { return _muted && (_mute_point & mp); }
|
||||||
bool muted() const { return (_self_muted || (_muted_by_others > 0)) && (_mute_point != MutePoint (0)); }
|
|
||||||
bool muted_at (MutePoint mp) const { return (_self_muted || (_muted_by_others > 0)) && (_mute_point & mp); }
|
|
||||||
bool self_muted_at (MutePoint mp) const { return _self_muted && (_mute_point & mp); }
|
|
||||||
bool muted_by_others_at (MutePoint mp) const { return (_muted_by_others > 0) && (_mute_point & mp); }
|
|
||||||
|
|
||||||
bool muted_pre_fader() const { return muted_at (PreFader); }
|
bool muted_pre_fader() const { return muted_at (PreFader); }
|
||||||
bool muted_post_fader() const { return muted_at (PostFader); }
|
bool muted_post_fader() const { return muted_at (PostFader); }
|
||||||
@ -60,9 +56,7 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful
|
|||||||
|
|
||||||
gain_t mute_gain_at (MutePoint) const;
|
gain_t mute_gain_at (MutePoint) const;
|
||||||
|
|
||||||
void set_self_muted (bool yn) { _self_muted = yn; }
|
void set_muted (bool yn) { _muted = yn; }
|
||||||
void mod_muted_by_others (int delta);
|
|
||||||
void clear_muted_by_others ();
|
|
||||||
|
|
||||||
void mute_at (MutePoint);
|
void mute_at (MutePoint);
|
||||||
void unmute_at (MutePoint);
|
void unmute_at (MutePoint);
|
||||||
@ -71,7 +65,7 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful
|
|||||||
void set_mute_points (MutePoint);
|
void set_mute_points (MutePoint);
|
||||||
MutePoint mute_points() const { return _mute_point; }
|
MutePoint mute_points() const { return _mute_point; }
|
||||||
|
|
||||||
void set_solo_level (SoloLevel);
|
void set_soloed (bool);
|
||||||
void set_solo_ignore (bool yn) { _solo_ignore = yn; }
|
void set_solo_ignore (bool yn) { _solo_ignore = yn; }
|
||||||
|
|
||||||
PBD::Signal0<void> MutePointChanged;
|
PBD::Signal0<void> MutePointChanged;
|
||||||
@ -81,9 +75,8 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
volatile MutePoint _mute_point;
|
volatile MutePoint _mute_point;
|
||||||
volatile bool _self_muted;
|
volatile bool _muted;
|
||||||
volatile uint32_t _muted_by_others;
|
volatile bool _soloed;
|
||||||
volatile SoloLevel _solo_level;
|
|
||||||
volatile bool _solo_ignore;
|
volatile bool _solo_ignore;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -126,14 +126,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
|
|||||||
MuteMaster::MutePoint mute_points() const { return _mute_points; }
|
MuteMaster::MutePoint mute_points() const { return _mute_points; }
|
||||||
|
|
||||||
bool muted () const;
|
bool muted () const;
|
||||||
bool self_muted () const;
|
|
||||||
bool muted_by_others () const;
|
|
||||||
|
|
||||||
bool path_muted_by_others() const { return _path_muted_by_others > 0; }
|
|
||||||
void mod_path_muted_by_others (int delta);
|
|
||||||
|
|
||||||
void set_mute (bool yn, void* src);
|
void set_mute (bool yn, void* src);
|
||||||
void mod_muted_by_others (int delta);
|
|
||||||
|
|
||||||
/* controls use set_solo() to modify this route's solo state
|
/* controls use set_solo() to modify this route's solo state
|
||||||
*/
|
*/
|
||||||
@ -437,7 +430,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
|
|||||||
boost::shared_ptr<MuteControllable> _mute_control;
|
boost::shared_ptr<MuteControllable> _mute_control;
|
||||||
boost::shared_ptr<MuteMaster> _mute_master;
|
boost::shared_ptr<MuteMaster> _mute_master;
|
||||||
MuteMaster::MutePoint _mute_points;
|
MuteMaster::MutePoint _mute_points;
|
||||||
volatile uint32_t _path_muted_by_others;
|
|
||||||
|
|
||||||
std::string _comment;
|
std::string _comment;
|
||||||
bool _have_internal_generator;
|
bool _have_internal_generator;
|
||||||
|
@ -306,13 +306,6 @@ namespace ARDOUR {
|
|||||||
PreFaderListen
|
PreFaderListen
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SoloLevel {
|
|
||||||
NotSoloed,
|
|
||||||
DownstreamSoloed,
|
|
||||||
UpstreamSoloed,
|
|
||||||
SelfSoloed
|
|
||||||
};
|
|
||||||
|
|
||||||
enum AutoConnectOption {
|
enum AutoConnectOption {
|
||||||
ManualConnect = 0x0,
|
ManualConnect = 0x0,
|
||||||
AutoConnectPhysical = 0x1,
|
AutoConnectPhysical = 0x1,
|
||||||
|
@ -38,8 +38,8 @@ const MuteMaster::MutePoint MuteMaster::AllPoints = MutePoint (MuteMaster::PreFa
|
|||||||
MuteMaster::MuteMaster (Session& s, const std::string&)
|
MuteMaster::MuteMaster (Session& s, const std::string&)
|
||||||
: SessionHandleRef (s)
|
: SessionHandleRef (s)
|
||||||
, _mute_point (AllPoints)
|
, _mute_point (AllPoints)
|
||||||
, _self_muted (false)
|
, _muted (false)
|
||||||
, _muted_by_others (0)
|
, _soloed (false)
|
||||||
, _solo_ignore (false)
|
, _solo_ignore (false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -49,7 +49,6 @@ MuteMaster::mute_at (MutePoint mp)
|
|||||||
{
|
{
|
||||||
if ((_mute_point & mp) != mp) {
|
if ((_mute_point & mp) != mp) {
|
||||||
_mute_point = MutePoint (_mute_point | mp);
|
_mute_point = MutePoint (_mute_point | mp);
|
||||||
cerr << "Mute point set, now " << _mute_point << endl;
|
|
||||||
MutePointChanged (); // EMIT SIGNAL
|
MutePointChanged (); // EMIT SIGNAL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,53 +58,25 @@ MuteMaster::unmute_at (MutePoint mp)
|
|||||||
{
|
{
|
||||||
if ((_mute_point & mp) == mp) {
|
if ((_mute_point & mp) == mp) {
|
||||||
_mute_point = MutePoint (_mute_point & ~mp);
|
_mute_point = MutePoint (_mute_point & ~mp);
|
||||||
cerr << "Mute point unset, now " << _mute_point << endl;
|
|
||||||
MutePointChanged (); // EMIT SIGNAL
|
MutePointChanged (); // EMIT SIGNAL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MuteMaster::clear_muted_by_others ()
|
MuteMaster::set_soloed (bool yn)
|
||||||
{
|
{
|
||||||
_muted_by_others = 0;
|
_soloed = yn;
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MuteMaster::mod_muted_by_others (int32_t delta)
|
|
||||||
{
|
|
||||||
if (delta < 0) {
|
|
||||||
if (_muted_by_others >= (uint32_t) abs (delta)) {
|
|
||||||
_muted_by_others += delta;
|
|
||||||
} else {
|
|
||||||
_muted_by_others = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_muted_by_others += delta;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MuteMaster::set_solo_level (SoloLevel l)
|
|
||||||
{
|
|
||||||
_solo_level = l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gain_t
|
gain_t
|
||||||
MuteMaster::mute_gain_at (MutePoint mp) const
|
MuteMaster::mute_gain_at (MutePoint mp) const
|
||||||
{
|
{
|
||||||
gain_t gain;
|
gain_t gain;
|
||||||
const SoloLevel l = _solo_level;
|
|
||||||
|
|
||||||
// cerr << "solo level = " << _solo_level << " selfmuted " << self_muted_at (mp) << " omute " << muted_by_others_at (mp) << endl;
|
|
||||||
|
|
||||||
if (Config->get_solo_mute_override()) {
|
if (Config->get_solo_mute_override()) {
|
||||||
if ((l == SelfSoloed) || (l == UpstreamSoloed)) {
|
if (_soloed) {
|
||||||
gain = 1.0;
|
gain = 1.0;
|
||||||
} else if (self_muted_at (mp)) { // self-muted
|
} else if (muted_at (mp)) { // self-muted
|
||||||
gain = Config->get_solo_mute_gain ();
|
|
||||||
} else if (l == DownstreamSoloed) {
|
|
||||||
gain = 1.0;
|
|
||||||
} else if (muted_by_others_at (mp)) { // muted by others
|
|
||||||
gain = Config->get_solo_mute_gain ();
|
gain = Config->get_solo_mute_gain ();
|
||||||
} else {
|
} else {
|
||||||
if (!_solo_ignore && _session.soloing()) {
|
if (!_solo_ignore && _session.soloing()) {
|
||||||
@ -115,13 +86,9 @@ MuteMaster::mute_gain_at (MutePoint mp) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (self_muted_at (mp)) { // self-muted
|
if (muted_at (mp)) { // self-muted
|
||||||
gain = Config->get_solo_mute_gain ();
|
gain = Config->get_solo_mute_gain ();
|
||||||
} else if ((l == SelfSoloed) || (l == UpstreamSoloed)) {
|
} else if (_soloed) {
|
||||||
gain = 1.0;
|
|
||||||
} else if (muted_by_others_at (mp)) { // muted by others
|
|
||||||
gain = Config->get_solo_mute_gain ();
|
|
||||||
} else if (l == DownstreamSoloed) { // soloed by others
|
|
||||||
gain = 1.0;
|
gain = 1.0;
|
||||||
} else {
|
} else {
|
||||||
if (!_solo_ignore && _session.soloing()) {
|
if (!_solo_ignore && _session.soloing()) {
|
||||||
@ -132,8 +99,6 @@ MuteMaster::mute_gain_at (MutePoint mp) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cerr << "\tgain = " << gain << endl;
|
|
||||||
|
|
||||||
return gain;
|
return gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +108,6 @@ MuteMaster::set_mute_points (const std::string& mute_point)
|
|||||||
MutePoint old = _mute_point;
|
MutePoint old = _mute_point;
|
||||||
|
|
||||||
_mute_point = (MutePoint) string_2_enum (mute_point, _mute_point);
|
_mute_point = (MutePoint) string_2_enum (mute_point, _mute_point);
|
||||||
cerr << "Mute point set from string, now " << _mute_point << endl;
|
|
||||||
|
|
||||||
if (old != _mute_point) {
|
if (old != _mute_point) {
|
||||||
MutePointChanged(); /* EMIT SIGNAL */
|
MutePointChanged(); /* EMIT SIGNAL */
|
||||||
@ -155,7 +119,6 @@ MuteMaster::set_mute_points (MutePoint mp)
|
|||||||
{
|
{
|
||||||
if (_mute_point != mp) {
|
if (_mute_point != mp) {
|
||||||
_mute_point = mp;
|
_mute_point = mp;
|
||||||
cerr << "Mute point set from mp, now " << _mute_point << endl;
|
|
||||||
MutePointChanged (); /* EMIT SIGNAL */
|
MutePointChanged (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,21 +130,12 @@ MuteMaster::set_state (const XMLNode& node, int /*version*/)
|
|||||||
|
|
||||||
if ((prop = node.property ("mute-point")) != 0) {
|
if ((prop = node.property ("mute-point")) != 0) {
|
||||||
_mute_point = (MutePoint) string_2_enum (prop->value(), _mute_point);
|
_mute_point = (MutePoint) string_2_enum (prop->value(), _mute_point);
|
||||||
cerr << "Mute point set from STATE string, now " << _mute_point << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((prop = node.property ("muted")) != 0) {
|
if ((prop = node.property ("muted")) != 0) {
|
||||||
_self_muted = string_is_affirmative (prop->value());
|
_muted = string_is_affirmative (prop->value());
|
||||||
} else {
|
} else {
|
||||||
_self_muted = (_mute_point != MutePoint (0));
|
_muted = (_mute_point != MutePoint (0));
|
||||||
}
|
|
||||||
|
|
||||||
if ((prop = node.property ("muted-by-others")) != 0) {
|
|
||||||
if (sscanf (prop->value().c_str(), "%u", &_muted_by_others) != 1) {
|
|
||||||
_muted_by_others = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_muted_by_others = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -192,11 +146,6 @@ MuteMaster::get_state()
|
|||||||
{
|
{
|
||||||
XMLNode* node = new XMLNode (X_("MuteMaster"));
|
XMLNode* node = new XMLNode (X_("MuteMaster"));
|
||||||
node->add_property ("mute-point", enum_2_string (_mute_point));
|
node->add_property ("mute-point", enum_2_string (_mute_point));
|
||||||
node->add_property ("muted", (_self_muted ? X_("yes") : X_("no")));
|
node->add_property ("muted", (_muted ? X_("yes") : X_("no")));
|
||||||
|
|
||||||
char buf[32];
|
|
||||||
snprintf (buf, sizeof (buf), "%u", _muted_by_others);
|
|
||||||
node->add_property ("muted-by-others", buf);
|
|
||||||
|
|
||||||
return *node;
|
return *node;
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,6 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
|
|||||||
, _mute_control (new MuteControllable (X_("mute"), *this))
|
, _mute_control (new MuteControllable (X_("mute"), *this))
|
||||||
, _mute_master (new MuteMaster (sess, name))
|
, _mute_master (new MuteMaster (sess, name))
|
||||||
, _mute_points (MuteMaster::AllPoints)
|
, _mute_points (MuteMaster::AllPoints)
|
||||||
, _path_muted_by_others (false)
|
|
||||||
, _have_internal_generator (false)
|
, _have_internal_generator (false)
|
||||||
, _physically_connected (false)
|
, _physically_connected (false)
|
||||||
, _graph_level (-1)
|
, _graph_level (-1)
|
||||||
@ -617,13 +616,26 @@ Route::mod_solo_by_others_upstream (int32_t delta)
|
|||||||
_soloed_by_others_upstream += delta;
|
_soloed_by_others_upstream += delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* push the inverse solo change to everything that feeds us.
|
/* push the inverse solo change to everything that feeds us.
|
||||||
|
|
||||||
|
This is important for solo-within-group. When we solo 1 track out of N that
|
||||||
|
feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
|
||||||
|
on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
|
||||||
|
tracks that feed it. This will silence them if they were audible because
|
||||||
|
of a bus solo, but the newly soloed track will still be audible (because
|
||||||
|
it is self-soloed).
|
||||||
|
|
||||||
|
but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
|
||||||
|
not in reverse.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
|
if (delta > 0) {
|
||||||
boost::shared_ptr<Route> sr = i->r.lock();
|
for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
|
||||||
if (sr) {
|
boost::shared_ptr<Route> sr = i->r.lock();
|
||||||
sr->mod_solo_by_others_downstream (-delta);
|
if (sr) {
|
||||||
|
sr->mod_solo_by_others_downstream (-delta);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -655,19 +667,7 @@ Route::mod_solo_by_others_downstream (int32_t delta)
|
|||||||
void
|
void
|
||||||
Route::set_mute_master_solo ()
|
Route::set_mute_master_solo ()
|
||||||
{
|
{
|
||||||
SoloLevel level;
|
_mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
|
||||||
|
|
||||||
if (self_soloed()) {
|
|
||||||
level = SelfSoloed;
|
|
||||||
} else if (soloed_by_others_upstream()) {
|
|
||||||
level = UpstreamSoloed;
|
|
||||||
} else if (soloed_by_others_downstream()) {
|
|
||||||
level = DownstreamSoloed;
|
|
||||||
} else {
|
|
||||||
level = NotSoloed;
|
|
||||||
}
|
|
||||||
|
|
||||||
_mute_master->set_solo_level (level);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -745,8 +745,8 @@ Route::set_mute (bool yn, void *src)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self_muted() != yn) {
|
if (muted() != yn) {
|
||||||
_mute_master->set_self_muted (yn);
|
_mute_master->set_muted (yn);
|
||||||
mute_changed (src); /* EMIT SIGNAL */
|
mute_changed (src); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -754,47 +754,7 @@ Route::set_mute (bool yn, void *src)
|
|||||||
bool
|
bool
|
||||||
Route::muted () const
|
Route::muted () const
|
||||||
{
|
{
|
||||||
return self_muted() || muted_by_others();
|
return _mute_master->muted();
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Route::self_muted() const
|
|
||||||
{
|
|
||||||
return _mute_master->self_muted ();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Route::muted_by_others() const
|
|
||||||
{
|
|
||||||
return _mute_master->muted_by_others ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Route::mod_muted_by_others (int delta)
|
|
||||||
{
|
|
||||||
if (_solo_isolated) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool old = muted ();
|
|
||||||
_mute_master->mod_muted_by_others (delta);
|
|
||||||
if (old != muted()) {
|
|
||||||
mute_changed (this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Route::mod_path_muted_by_others (int32_t delta)
|
|
||||||
{
|
|
||||||
if (delta < 0) {
|
|
||||||
if (_path_muted_by_others >= (uint32_t) abs (delta)) {
|
|
||||||
_path_muted_by_others += delta;
|
|
||||||
} else {
|
|
||||||
_path_muted_by_others = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_path_muted_by_others += delta;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -3069,7 +3029,7 @@ Route::MuteControllable::set_value (float val)
|
|||||||
float
|
float
|
||||||
Route::MuteControllable::get_value (void) const
|
Route::MuteControllable::get_value (void) const
|
||||||
{
|
{
|
||||||
return route.self_muted() ? 1.0f : 0.0f;
|
return route.muted() ? 1.0f : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2251,7 +2251,7 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
|
|||||||
error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
|
error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<RouteList> r = routes.reader ();
|
shared_ptr<RouteList> r = routes.reader ();
|
||||||
int32_t delta;
|
int32_t delta;
|
||||||
|
|
||||||
@ -2260,21 +2260,19 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
|
|||||||
} else {
|
} else {
|
||||||
delta = -1;
|
delta = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delta == 1 && !Config->get_solo_latched()) {
|
||||||
|
/* new solo: disable all other solos */
|
||||||
|
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
||||||
|
if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
(*i)->set_solo (false, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
solo_update_disabled = true;
|
solo_update_disabled = true;
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
solo a route:
|
|
||||||
for anything in the signal path for this route, increment its soloed-by-other count
|
|
||||||
for anything not in the signal path for this route, increment its muted-by-other count
|
|
||||||
|
|
||||||
unsolo a route:
|
|
||||||
for anything in the signal path for this route, decrement its soloed-by-other count
|
|
||||||
for anything not in the signal path for this route, decrement its muted-by-other count
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
RouteList uninvolved;
|
RouteList uninvolved;
|
||||||
|
|
||||||
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
||||||
@ -2287,15 +2285,6 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
|
|||||||
|
|
||||||
in_signal_flow = false;
|
in_signal_flow = false;
|
||||||
|
|
||||||
/* feed-backwards (other route to solo change route):
|
|
||||||
|
|
||||||
if (*i) feeds the one whose solo status changed
|
|
||||||
it should be soloed by other if the change was -> solo OR de-soloed by other if change was -> !solo
|
|
||||||
else
|
|
||||||
do nothing
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((*i)->feeds (route, &via_sends_only)) {
|
if ((*i)->feeds (route, &via_sends_only)) {
|
||||||
if (!via_sends_only) {
|
if (!via_sends_only) {
|
||||||
(*i)->mod_solo_by_others_downstream (delta);
|
(*i)->mod_solo_by_others_downstream (delta);
|
||||||
@ -2303,14 +2292,6 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* feed-forward (solo change route to other routes):
|
|
||||||
|
|
||||||
if the route whose solo status changed feeds (*i)
|
|
||||||
do nothing
|
|
||||||
else
|
|
||||||
mute if the change was -> solo OR demute if change was -> !solo
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (route->feeds (*i, &via_sends_only)) {
|
if (route->feeds (*i, &via_sends_only)) {
|
||||||
(*i)->mod_solo_by_others_upstream (delta);
|
(*i)->mod_solo_by_others_upstream (delta);
|
||||||
in_signal_flow = true;
|
in_signal_flow = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user