X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fcontrollable.h;h=eb4b7ff14291c00df03b9b1c7b42720d28371a55;hb=130df9c2b195e82ba223ef8541802d775e947610;hp=ed41af1be85fa8b2691511092c1e25f2bdf68136;hpb=2e8f80e37a7d20deb3f138cd72c26f8c6de9d1ab;p=ardour.git diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h index ed41af1be8..eb4b7ff142 100644 --- a/libs/pbd/pbd/controllable.h +++ b/libs/pbd/pbd/controllable.h @@ -22,54 +22,108 @@ #include #include +#include -#include -#include +#include "pbd/libpbd_visibility.h" +#include "pbd/signals.h" +#include -#include +#include "pbd/statefuldestructible.h" class XMLNode; namespace PBD { -class Controllable : public PBD::StatefulDestructible { +class LIBPBD_API Controllable : public PBD::StatefulDestructible { public: - Controllable (std::string name); - virtual ~Controllable() { Destroyed (this); } - - virtual void set_value (float) = 0; - virtual float get_value (void) const = 0; + enum Flag { + Toggle = 0x1, + GainLike = 0x2, + }; - virtual bool can_send_feedback() const { return true; } + Controllable (const std::string& name, Flag f = Flag (0)); + virtual ~Controllable() { Destroyed (this); } - sigc::signal LearningFinished; + /* We express Controllable values in one of three ways: + * 1. `user' --- as presented to the user (e.g. dB, Hz, etc.) + * 2. `interface' --- as used in some cases for the UI representation + * (in order to make controls behave logarithmically). + * 3. `internal' --- as passed to a processor, track, plugin, or whatever. + * + * Note that in some cases user and processor may be the same + * (and interface different) e.g. frequency, which is presented + * to the user and passed to the processor in linear terms, but + * which needs log scaling in the interface. + * + * In other cases, user and interface may be the same (and processor different) + * e.g. gain, which is presented to the user in log terms (dB) + * but passed to the processor as a linear quantity. + */ + + /** Set `internal' value */ + virtual void set_value (double) = 0; + /** @return `internal' value */ + virtual double get_value (void) const = 0; + + PBD::Signal0 LearningFinished; + static PBD::Signal3 CreateBinding; + static PBD::Signal1 DeleteBinding; + + static PBD::Signal1 StartLearning; + static PBD::Signal1 StopLearning; + + static PBD::Signal1 Destroyed; + + PBD::Signal0 Changed; + + int set_state (const XMLNode&, int version); + XMLNode& get_state (); - static sigc::signal StartLearning; - static sigc::signal StopLearning; + std::string name() const { return _name; } - static sigc::signal Destroyed; + bool touching () const { return _touching; } + void set_touching (bool yn) { _touching = yn; } - sigc::signal Changed; + bool is_toggle() const { return _flags & Toggle; } + bool is_gain_like() const { return _flags & GainLike; } - int set_state (const XMLNode&); - XMLNode& get_state (); + virtual double lower() const { return 0.0; } + virtual double upper() const { return 1.0; } - std::string name() const { return _name; } + Flag flags() const { return _flags; } + void set_flags (Flag f); static Controllable* by_id (const PBD::ID&); static Controllable* by_name (const std::string&); - + static const std::string xml_node_name; private: std::string _name; - void add (); - void remove (); + Flag _flags; + bool _touching; + + static void add (Controllable&); + static void remove (Controllable*); typedef std::set Controllables; - static Glib::Mutex* registry_lock; + static Glib::Threads::RWLock registry_lock; static Controllables registry; }; +/* a utility class for the occasions when you need but do not have + a Controllable +*/ + +class LIBPBD_API IgnorableControllable : public Controllable +{ + public: + IgnorableControllable () : PBD::Controllable ("ignoreMe") {} + ~IgnorableControllable () {} + + void set_value (double /*v*/) {} + double get_value () const { return 0.0; } +}; + } #endif /* __pbd_controllable_h__ */