X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fcontrollable.h;h=d9cd21d28dc24e3a455f2d8801793686b2fed9b9;hb=a1a8794dadc0ab972f441481594b53117df1ca92;hp=28dd4b7a31293d738c55873474569be1aa7535d5;hpb=c83389b8ec5fef9553a401e6123b7e55702af9e2;p=ardour.git diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h index 28dd4b7a31..d9cd21d28d 100644 --- a/libs/pbd/pbd/controllable.h +++ b/libs/pbd/pbd/controllable.h @@ -2,7 +2,7 @@ Copyright (C) 2000-2007 Paul Davis This program is free software; you can redistribute it and/or modify -v it under the terms of the GNU General Public License as published by + it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -25,7 +25,7 @@ v it under the terms of the GNU General Public License as published by #include #include "pbd/signals.h" -#include +#include #include "pbd/statefuldestructible.h" @@ -35,14 +35,34 @@ namespace PBD { class Controllable : public PBD::StatefulDestructible { public: - Controllable (const std::string& name, const std::string& uri); - virtual ~Controllable() { Destroyed (this); } + enum Flag { + Toggle = 0x1, + GainLike = 0x2, + }; - void set_uri (const std::string&); - const std::string& uri() const { return _uri; } + Controllable (const std::string& name, Flag f = Flag (0)); + virtual ~Controllable() { Destroyed (this); } - virtual void set_value (float) = 0; - virtual float get_value (void) const = 0; + /* 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; @@ -59,27 +79,34 @@ class Controllable : public PBD::StatefulDestructible { XMLNode& get_state (); std::string name() const { return _name; } - bool touching () const { return _touching; } - + + bool touching () const { return _touching; } void set_touching (bool yn) { _touching = yn; } + bool is_toggle() const { return _flags & Toggle; } + bool is_gain_like() const { return _flags & GainLike; } + + virtual double lower() const { return 0.0; } + virtual double upper() const { return 1.0; } + + 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 Controllable* by_uri (const std::string&); - + static const std::string xml_node_name; private: std::string _name; - std::string _uri; + + Flag _flags; bool _touching; static void add (Controllable&); static void remove (Controllable*); typedef std::set Controllables; - typedef std::map ControllablesByURI; - static Glib::StaticRWLock registry_lock; + static Glib::Threads::RWLock registry_lock; static Controllables registry; - static ControllablesByURI registry_by_uri; }; /* a utility class for the occasions when you need but do not have @@ -89,11 +116,11 @@ class Controllable : public PBD::StatefulDestructible { class IgnorableControllable : public Controllable { public: - IgnorableControllable () : PBD::Controllable ("ignoreMe", std::string()) {} + IgnorableControllable () : PBD::Controllable ("ignoreMe") {} ~IgnorableControllable () {} - void set_value (float /*v*/) {} - float get_value () const { return 0.0; } + void set_value (double /*v*/) {} + double get_value () const { return 0.0; } }; }