/* ZynAddSubFX - a software synthesizer Control.h - Defines a variable that can be controled from a frontend Copyright (C) 2009 Harald Hvaal Author: Harald Hvaal This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _CONTROL_H_ #define _CONTROL_H_ #include class Control { public: /** * The parent is the logical owner of this control. Parent should only * be null for the root node. * The id is a string uniquely identifying this control within the * context of the parent control. No spaces or dots are allowed in this * id. * Children id's are denoted by ., so that one * can refer to any control in the hierarchy by separating them with * dots. Example: Main.AddSynth.FrequencyLFO.Amplitude */ Control(Control *parent, string id); /** * Will recursively get the XML representation for all the subcontrols. * Used for saving to file and copy-pasting settings */ string getXMLRepresentation(); /** * Set the value of this (and possibly subcomponents as well) based on * a xml description. */ void restoreFromXML(string xml); /** * Register a controluser. This will cause this user to be notified * whenever the contents of the control changes. */ void registerControlUser(ControlUser *user); /** * This should return a string representation of the controls internal * value */ virtual string getStringRepresentation() = 0; }; class FloatControl:public Control { public: /** * Set the value of this control. If the ControlUser variable is set, * then this user will not be updated with the new value. This is to * avoid setting a value being set back to the source that set it * (which would be redundant, or possibly causing infinite setValue * loops). * NOTE: this function is thread-safe (using a mutex internally) */ void setValue(float value, ControlUser *user = NULL); /** * Reimplemented from Control */ virtual string getStringRepresentation(); float value(); }; class ControlUser { public: /** * Pure virtual method, to notify the controluser that the value has * been changed internally, and needs to be read again. */ virtual void controlUpdated(Control *control) = 0; }; #endif /* _CONTROL_H_ */