Ardour  8.12
controllable.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2017 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2008-2009 David Robillard <d@drobilla.net>
4  * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
5  * Copyright (C) 2014 Ben Loftis <ben@harrisonconsoles.com>
6  * Copyright (C) 2015-2019 Robin Gareus <robin@gareus.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef __pbd_controllable_h__
24 #define __pbd_controllable_h__
25 
26 #include <memory>
27 #include <string>
28 #include <set>
29 
30 #include "pbd/libpbd_visibility.h"
31 #include "pbd/signals.h"
32 #include <glibmm/threads.h>
33 
34 
36 
37 class XMLNode;
38 
39 namespace PBD {
40 
41 class Controllable;
42 typedef std::set<std::shared_ptr<Controllable>> ControllableSet;
43 
72 class LIBPBD_API Controllable : public PBD::StatefulDestructible, public std::enable_shared_from_this<Controllable>
73 {
74 public:
75  enum Flag {
76  Toggle = 0x01,
77  GainLike = 0x02,
78  RealTime = 0x04,
79  NotAutomatable = 0x08,
80  InlineControl = 0x10,
81  HiddenControl = 0x20,
82  MonitorControl = 0x40,
83  };
84 
85  Controllable (const std::string& name, Flag f = Flag (0));
86 
95  ForGroup
96  };
97 
110  virtual void set_value (double value, GroupControlDisposition group_override) = 0;
111 
115  virtual double get_value (void) const = 0;
116 
122  virtual double get_save_value () const { return get_value(); }
123 
125  virtual double internal_to_interface (double i, bool rotary = false) const {
126  /* by default, the interface range is just a linear
127  * interpolation between lower and upper values */
128  return (i-lower())/(upper() - lower());
129  }
130 
131  virtual double interface_to_internal (double i, bool rotary = false) const {
132  return lower() + i*(upper() - lower());
133  }
134 
136  virtual float get_interface(bool rotary=false) const { return (internal_to_interface(get_value(), rotary)); }
137 
138  virtual void set_interface (float fraction, bool rotary=false, GroupControlDisposition gcd = NoGroup);
139 
140  virtual std::string get_user_string() const { return std::string(); }
141 
142  PBD::Signal0<void> LearningFinished;
143 
144  static PBD::Signal1<bool, std::weak_ptr<PBD::Controllable> > StartLearning;
145  static PBD::Signal1<void, std::weak_ptr<PBD::Controllable> > StopLearning;
146 
147  static PBD::Signal1<void, std::weak_ptr<PBD::Controllable> > GUIFocusChanged;
148  static PBD::Signal1<void, std::weak_ptr<PBD::Controllable> > ControlTouched;
149 
150  PBD::Signal2<void,bool,PBD::Controllable::GroupControlDisposition> Changed;
151 
152  int set_state (const XMLNode&, int version);
153  virtual XMLNode& get_state () const;
154 
155  std::string name() const { return _name; }
156 
157  bool touching () const { return _touching; }
158  PBD::Signal0<void> TouchChanged;
159 
160  bool is_toggle() const { return _flags & Toggle; }
161  bool is_gain_like() const { return _flags & GainLike; }
162 
163  virtual double lower() const { return 0.0; }
164  virtual double upper() const { return 1.0; }
165  virtual double normal() const { return 0.0; } //the default value
166 
167  Flag flags() const { return _flags; }
168  void set_flags (Flag f);
169 
170  void set_flag (Flag f);
171  void clear_flag (Flag f);
172 
173  static std::shared_ptr<Controllable> by_id (const PBD::ID&);
174  static void dump_registry ();
176 
177  static const std::string xml_node_name;
178 
179 protected:
180  void set_touching (bool yn) {
181  if (_touching == yn) { return; }
182  _touching = yn;
183  TouchChanged (); /* EMIT SIGNAL */
184  }
185 
186 private:
187  std::string _name;
188  std::string _units;
190  bool _touching;
191 
192  typedef std::set<PBD::Controllable*> Controllables;
193 
195  static Glib::Threads::RWLock registry_lock;
197 
198  static void add (Controllable&);
199  static void remove (Controllable*);
200 };
201 
202 }
203 
204 #endif /* __pbd_controllable_h__ */
PBD::Signal2< void, bool, PBD::Controllable::GroupControlDisposition > Changed
Definition: controllable.h:150
PBD::Signal0< void > LearningFinished
Definition: controllable.h:142
void set_touching(bool yn)
Definition: controllable.h:180
virtual XMLNode & get_state() const
static void dump_registry()
Controllable(const std::string &name, Flag f=Flag(0))
void clear_flag(Flag f)
_flags &= ~f;
Flag flags() const
Definition: controllable.h:167
virtual double interface_to_internal(double i, bool rotary=false) const
Definition: controllable.h:131
static ScopedConnectionList registry_connections
Definition: controllable.h:194
static void remove(Controllable *)
static PBD::Signal1< bool, std::weak_ptr< PBD::Controllable > > StartLearning
Definition: controllable.h:144
static std::shared_ptr< Controllable > by_id(const PBD::ID &)
virtual double get_save_value() const
Definition: controllable.h:122
bool is_gain_like() const
Definition: controllable.h:161
std::string name() const
Definition: controllable.h:155
virtual std::string get_user_string() const
Definition: controllable.h:140
std::string _units
Definition: controllable.h:188
std::set< PBD::Controllable * > Controllables
Definition: controllable.h:192
static ControllableSet registered_controllables()
virtual void set_value(double value, GroupControlDisposition group_override)=0
virtual double lower() const
Definition: controllable.h:163
virtual double normal() const
Definition: controllable.h:165
std::string _name
Definition: controllable.h:187
virtual double get_value(void) const =0
virtual float get_interface(bool rotary=false) const
Definition: controllable.h:136
int set_state(const XMLNode &, int version)
virtual double internal_to_interface(double i, bool rotary=false) const
Definition: controllable.h:125
virtual void set_interface(float fraction, bool rotary=false, GroupControlDisposition gcd=NoGroup)
static const std::string xml_node_name
Definition: controllable.h:177
static PBD::Signal1< void, std::weak_ptr< PBD::Controllable > > StopLearning
Definition: controllable.h:145
bool touching() const
Definition: controllable.h:157
static PBD::Signal1< void, std::weak_ptr< PBD::Controllable > > GUIFocusChanged
Definition: controllable.h:147
static void add(Controllable &)
static PBD::Signal1< void, std::weak_ptr< PBD::Controllable > > ControlTouched
Definition: controllable.h:148
void set_flags(Flag f)
static Controllables registry
Definition: controllable.h:196
static Glib::Threads::RWLock registry_lock
Definition: controllable.h:195
bool is_toggle() const
Definition: controllable.h:160
void set_flag(Flag f)
_flags |= f;
virtual double upper() const
Definition: controllable.h:164
PBD::Signal0< void > TouchChanged
Definition: controllable.h:158
Definition: id.h:35
Definition: xml++.h:114
GtkImageIconNameData name
Definition: gtkimage.h:6
#define LIBPBD_API
std::shared_ptr< PBD::Controllable > Controllable
Definition: console1.h:80
Definition: axis_view.h:42
std::set< std::shared_ptr< Controllable > > ControllableSet
Definition: controllable.h:41