Ardour  8.7-14-g57a6773833
solo_control.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2017 Paul Davis <paul@linuxaudiosystems.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #ifndef __ardour_solo_control_h__
20 #define __ardour_solo_control_h__
21 
22 #include <memory>
23 #include <string>
24 
27 
28 namespace ARDOUR {
29 
30 class Session;
31 class Soloable;
32 class Muteable;
33 
35 {
36  public:
37  SoloControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m, Temporal::TimeDomainProvider const &);
38 
39  double get_value () const;
40  double get_save_value() const { return self_soloed(); }
41 
42  bool can_solo() const;
43 
44  /* Export additional API so that objects that only get access
45  * to a Controllable/AutomationControl can do more fine-grained
46  * operations with respect to solo. Obviously, they would need
47  * to dynamic_cast<SoloControl> first.
48  *
49  * Solo state is not representable by a single scalar value,
50  * so set_value() and get_value() is not enough.
51  *
52  * This means that the Controllable is technically
53  * asymmetric. It is possible to call ::set_value (0.0) to
54  * disable (self)solo, and then call ::get_value() and get a
55  * return of 1.0 because the control is soloed by
56  * upstream/downstream or a master.
57  */
58 
59  void mod_solo_by_others_upstream (int32_t delta);
60  void mod_solo_by_others_downstream (int32_t delta);
61 
62  /* API to check different aspects of solo substate
63  */
64 
65  bool self_soloed () const {
66  return _self_solo;
67  }
68  bool soloed_by_masters () const {
69  return get_masters_value();
70  }
71  bool soloed_by_self_or_masters () const {
72  return self_soloed() || get_masters_value ();
73  }
74  bool soloed_by_others () const {
75  return _soloed_by_others_downstream || _soloed_by_others_upstream || get_masters_value ();
76  }
77  uint32_t soloed_by_others_upstream () const {
78  return _soloed_by_others_upstream;
79  }
80  uint32_t soloed_by_others_downstream () const {
81  return _soloed_by_others_downstream;
82  }
83  bool soloed() const { return self_soloed() || soloed_by_others(); }
84 
85  /* The session object needs to respond to solo
86  changes, but to do so accurately it needs to know if we transition
87  into or out of solo. The normal Changed signal doesn't make that
88  possible.
89  */
90 
91  int32_t transitioned_into_solo () const { return _transition_into_solo; }
92 
94 
95  int set_state (XMLNode const&, int);
96  XMLNode& get_state () const;
97 
98  protected:
100  void master_changed (bool from_self, GroupControlDisposition, std::weak_ptr<AutomationControl> m);
101  void pre_remove_master (std::shared_ptr<AutomationControl>);
102  void post_add_master (std::shared_ptr<AutomationControl>);
103 
104  private:
111 
112  void set_self_solo (bool yn);
114 };
115 
116 } /* namespace */
117 
118 #endif /* __libardour_solo_control_h__ */
bool soloed() const
Definition: solo_control.h:83
void post_add_master(std::shared_ptr< AutomationControl >)
double get_value() const
uint32_t soloed_by_others_downstream() const
Definition: solo_control.h:80
Muteable & _muteable
Definition: solo_control.h:106
void mod_solo_by_others_upstream(int32_t delta)
Soloable & _soloable
Definition: solo_control.h:105
int set_state(XMLNode const &, int)
XMLNode & get_state() const
void master_changed(bool from_self, GroupControlDisposition, std::weak_ptr< AutomationControl > m)
bool can_solo() const
uint32_t soloed_by_others_upstream() const
Definition: solo_control.h:77
uint32_t _soloed_by_others_downstream
Definition: solo_control.h:109
double get_save_value() const
Definition: solo_control.h:40
void pre_remove_master(std::shared_ptr< AutomationControl >)
bool soloed_by_self_or_masters() const
Definition: solo_control.h:71
bool soloed_by_masters() const
Definition: solo_control.h:68
void actually_set_value(double, PBD::Controllable::GroupControlDisposition group_override)
SoloControl(Session &session, std::string const &name, Soloable &soloable, Muteable &m, Temporal::TimeDomainProvider const &)
bool soloed_by_others() const
Definition: solo_control.h:74
int32_t _transition_into_solo
Definition: solo_control.h:110
void mod_solo_by_others_downstream(int32_t delta)
void set_self_solo(bool yn)
uint32_t _soloed_by_others_upstream
Definition: solo_control.h:108
int32_t transitioned_into_solo() const
Definition: solo_control.h:91
bool self_soloed() const
Definition: solo_control.h:65
Definition: xml++.h:114
GtkImageIconNameData name
Definition: gtkimage.h:6
#define LIBARDOUR_API
void session(lua_State *L)