/[svn]/linuxsampler/trunk/src/drivers/DeviceParameter.h
ViewVC logotype

Annotation of /linuxsampler/trunk/src/drivers/DeviceParameter.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2434 - (hide annotations) (download) (as text)
Thu Mar 7 19:23:24 2013 UTC (11 years, 1 month ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 46723 byte(s)
* Started to spread new C++ keyword "override" over the code base
  (keyword introduced with C++11 standard).

1 schoenebeck 123 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 2414 * Copyright (C) 2005 - 2013 Christian Schoenebeck *
7 schoenebeck 123 * *
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 *
19     * along with this program; if not, write to the Free Software *
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21     * MA 02111-1307 USA *
22     ***************************************************************************/
23    
24     #ifndef __LS_DEVICE_PARAMETER_H__
25     #define __LS_DEVICE_PARAMETER_H__
26    
27     #include <map>
28     #include <vector>
29    
30     #include "../common/global.h"
31     #include "../common/optional.h"
32 schoenebeck 880 #include "../common/Exception.h"
33 schoenebeck 207 #include "Device.h"
34 schoenebeck 123
35     namespace LinuxSampler {
36 schoenebeck 2414
37     /////////////////////////////////////////////////////////////////
38     // "Runtime" parameters
39 schoenebeck 123
40     // TODO: All plurar parameter classes (except for String) have to be added (namely DeviceRuntimeParameterBools, DeviceRuntimeParameterInts, DeviceRuntimeParameterFloats, DeviceCreationParameterBools, DeviceCreationParameterInts, DeviceCreationParameterFloats), I ignored them for the moment, because they were not that necessary.
41    
42 schoenebeck 2414 /** @brief Abstracet base class for all driver parameters of the sampler.
43     *
44     * All audio / MIDI drivers for the sampler are using dynamic driver
45     * parameters based on this base class. The main purpose behind this
46     * concept is to be able to write GUI frontends for the sampler, which
47     * don't need to know about specific drivers the sampler provides, nor the
48     * exact list of parameters those drivers offer. Instead a frontend can
49     * use this API to retrieve what kind of parameters the respective
50     * available drivers offer at runtime. This way new drivers can be added
51     * or existing ones being changed arbitrarily to the sampler at any time,
52     * without a GUI frontend to be changed or recompiled.
53     *
54     * There are various parameter classes deriving from this base class, which
55     * implement convenient handling for the various common value types like
56     * bool, int, float, String. A driver would rather use one of those
57     * type specialized classes, instead of this abstract base class. Because
58     * the methods of this very base parameter class here are generalized being
59     * encoded in String type for all parameter types.
60     *
61     * Besides that, there are 2 distinct sets of parameter types:
62     * - "Runtime" parameters which can be set and changed by the user (i.e.
63     * with a GUI frontend) at any time.
64     * - "Creation" parameters which can only be set by the user before a
65     * driver is instantiated (a driver instance is called a "device" in
66     * the sampler's terms). After the driver is instantiated, "creation"
67     * parameters are read only for the life time of a driver (device)
68     * instance. Typical example for a "creation" parameter would be an
69     * audio driver that allows to select a specific sound card.
70     *
71     * @see DeviceCreationParameter
72     */
73 schoenebeck 123 class DeviceRuntimeParameter {
74     public:
75 schoenebeck 2414 /**
76     * Some name reflecting the parameter's value type, like "BOOL,
77     * "INT", "FLOAT", "STRING", "STRINGS". Upon the value returned
78     * here, the object can be casted to the respective implementing
79     * parameter class.
80     */
81     virtual String Type() = 0;
82    
83     /**
84     * A human readable description, explaining the exact purpose of
85     * the driver parameter. The text returned here can be used to
86     * display the user in a GUI frontend some helping text, that
87     * explains what the parameter actually does.
88     */
89     virtual String Description() = 0;
90    
91     /**
92     * Whether the parameter is read only. Not to be confused with
93     * "creation" parameters! A driver parameter which returns true
94     * here can never be set or altered at any time. Not even at
95     * instanciation time of the driver! A typical example would be
96     * a parameter "SAMPLERATE" for a specific sound card, where the
97     * specific sound card does not allow to switch the sound card's
98     * sample rate in any way. Yet the value returned by the parameter
99     * (read only) might be different, depending on the actual sound
100     * card the user selected with the audio driver.
101     */
102     virtual bool Fix() = 0;
103    
104     /**
105     * Whether the parameter only allows to set one scalar value, or
106     * if @c true is returned here, the parameter allows to manage a
107     * list of values instead. A typical example of multiplicity
108     * parameter is i.e. a "ROUTING" parameter, that would allow a
109     * user to interconnect the sampler with other apps and devices
110     * with drivers that support such concepts (like JACK and ALSA MIDI
111     * do).
112     */
113     virtual bool Multiplicity() = 0;
114    
115     /**
116     * The driver parameter might (optionally) return a minimum value
117     * for the parameter. If some actual value is returned here, the
118     * sampler automatically performs bounds checking of parameter
119     * values to be set for such a parameter and a GUI frontend might
120     * display a spin box in such a case to the user, honoring the
121     * returned minimum value.
122     *
123     * You probably don't want to call this method directly, but instead
124     * cast this object to the respective deriving parameter class like
125     * DeviceRuntimeParameterInt, and use its RangeMinAsInt() method
126     * instead, which conveniently returns a value in its value type.
127     * So you don't need to parse this return value here.
128     */
129     virtual optional<String> RangeMin() = 0;
130    
131     /**
132     * The driver parameter might (optionally) return a maximum value
133     * for the parameter. If some actual value is returned here, the
134     * sampler automatically performs bounds checking of parameter
135     * values to be set for such a parameter and a GUI frontend might
136     * display a spin box in such a case to the user, honoring the
137     * returned maximum value.
138     *
139     * You probably don't want to call this method directly, but instead
140     * cast this object to the respective deriving parameter class like
141     * DeviceRuntimeParameterInt, and use its RangeMaxAsInt() method
142     * instead, which conveniently returns a value in its value type.
143     * So you don't need to parse this return value here.
144     */
145     virtual optional<String> RangeMax() = 0;
146    
147     /**
148     * The driver parameter might (optionally) return a list of
149     * possible values for this parameter, encoded as comma separated
150     * list. For example an audio driver might return "44100,96000" for
151     * a "SAMPLERATE" parameter for a specific sound card.
152     *
153     * You probably don't want to call this method directly, but instead
154     * cast this object to the respective deriving parameter class like
155     * DeviceRuntimeParameterInt, and use its PossibilitiesAsInt() method
156     * instead, which conveniently returns a vector in its value type.
157     * So you don't need to parse this return value here.
158     */
159 schoenebeck 123 virtual optional<String> Possibilities() = 0;
160 schoenebeck 2414
161     /**
162     * The current value of this parameter (encoded as String).
163     * You might want to cast to the respective deriving parameter
164     * class like DeviceRuntimeParameterInt and use its method
165     * ValueAsInt() for not being forced to parse the String here.
166     */
167     virtual String Value() = 0;
168    
169     /**
170     * Alter the parameter with the value given by @a val. The
171     * respective deriving parameter class automatically parses the
172     * String value supplied here, and converts it into its native
173     * value type like int, float or String vector ("Strings").
174     *
175     * @param - new parameter value encoded as string
176     * @throws Exception - if @a val is out of bounds, not encoded
177     * correctly in its string representation or
178     * any other reason the driver might not want
179     * to accept the given value.
180     */
181     virtual void SetValue(String val) throw (Exception) = 0;
182    
183     /** @brief Destructor.
184     *
185     * Virtual base destructor which enforces that all destructors of
186     * all deriving classes are called automatically upon object
187     * destruction.
188     */
189 persson 1248 virtual ~DeviceRuntimeParameter(){};
190 schoenebeck 123 };
191    
192 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c bool.
193     *
194     * Implements a "runtime" driver parameter for value type @c bool.
195     * A driver offering a parameter of type @c bool would derive its
196     * parameter class from this class and implement the abstract method
197     * OnSetValue() to react on a parameter value being set.
198     *
199     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
200     * about "runtime" parameters vs. "creation" parameters.
201     *
202     * @see DeviceCreationParameterBool
203     */
204 schoenebeck 123 class DeviceRuntimeParameterBool : public DeviceRuntimeParameter {
205     public:
206 schoenebeck 2414 /** @brief Constructor for value type @c bool.
207     *
208     * Sets an initial value for the parameter.
209     *
210     * @param bVal - initial boolean value
211     */
212 schoenebeck 123 DeviceRuntimeParameterBool(bool bVal);
213 schoenebeck 2414
214     /////////////////////////////////////////////////////////////////
215     // derived methods, implementing type "BOOL"
216     // (usually not to be overriden by descendant)
217    
218 schoenebeck 2434 virtual String Type() OVERRIDE;
219     virtual bool Multiplicity() OVERRIDE;
220     virtual optional<String> RangeMin() OVERRIDE;
221     virtual optional<String> RangeMax() OVERRIDE;
222     virtual optional<String> Possibilities() OVERRIDE;
223     virtual String Value() OVERRIDE;
224     virtual void SetValue(String val) throw (Exception) OVERRIDE;
225 schoenebeck 2414
226     /////////////////////////////////////////////////////////////////
227     // convenience methods for type "BOOL"
228     // (usually not to be overriden by descendant)
229 schoenebeck 123
230     virtual bool ValueAsBool();
231 schoenebeck 880 virtual void SetValue(bool b) throw (Exception);
232 schoenebeck 123
233 schoenebeck 2414 /////////////////////////////////////////////////////////////////
234     // abstract methods
235     // (these have to be implemented by the descendant)
236    
237     /**
238     * Must be implemented be a driver's parameter class to react on
239     * the parameter value being set / altered.
240     *
241     * @param b - new parameter value set by the user
242     * @throws Exception - might be thrown by the driver in case it
243     * cannot handle the supplied parameter value
244     * for whatever reason
245     */
246 schoenebeck 880 virtual void OnSetValue(bool b) throw (Exception) = 0;
247 schoenebeck 123 protected:
248     bool bVal;
249     };
250    
251 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c int.
252     *
253     * Implements a "runtime" driver parameter for value type @c int.
254     * A driver offering a parameter of type @c int would derive its
255     * parameter class from this class and implement the abstract methods
256     * OnSetValue(), RangeMinAsInt(), RangeMaxAsInt(), PossibilitiesAsInt().
257     *
258     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
259     * about "runtime" parameters vs. "creation" parameters.
260     *
261     * @see DeviceCreationParameterInt
262     */
263 schoenebeck 123 class DeviceRuntimeParameterInt : public DeviceRuntimeParameter {
264     public:
265 schoenebeck 2414 /** @brief Constructor for value type @c int.
266     *
267     * Sets an initial value for the parameter.
268     *
269     * @param iVal - initial integer value
270     */
271 schoenebeck 123 DeviceRuntimeParameterInt(int iVal);
272 schoenebeck 2414
273     /////////////////////////////////////////////////////////////////
274     // derived methods, implementing type "INT"
275     // (usually not to be overriden by descendant)
276    
277 schoenebeck 2434 virtual String Type() OVERRIDE;
278     virtual bool Multiplicity() OVERRIDE;
279     virtual optional<String> RangeMin() OVERRIDE;
280     virtual optional<String> RangeMax() OVERRIDE;
281     virtual optional<String> Possibilities() OVERRIDE;
282     virtual String Value() OVERRIDE;
283     virtual void SetValue(String val) throw (Exception) OVERRIDE;
284 schoenebeck 2414
285     /////////////////////////////////////////////////////////////////
286     // convenience methods for type "INT"
287     // (usually not to be overriden by descendant)
288 schoenebeck 123
289     virtual int ValueAsInt();
290 schoenebeck 880 virtual void SetValue(int i) throw (Exception);
291 schoenebeck 2414
292     /////////////////////////////////////////////////////////////////
293     // abstract methods
294     // (these have to be implemented by the descendant)
295 schoenebeck 123
296 schoenebeck 2414 /**
297     * Must be implemented by descendant, returning a minimum int value
298     * for the parameter. If a minimum value does not make sense for
299     * the specific driver parameter, then the implementation should
300     * return @c optional<int>::nothing.
301     */
302     virtual optional<int> RangeMinAsInt() = 0;
303    
304     /**
305     * Must be implemented by descendant, returning a maximum int value
306     * for the parameter. If a maximum value does not make sense for
307     * the specific driver parameter, then the implementation should
308     * return @c optional<int>::nothing.
309     */
310     virtual optional<int> RangeMaxAsInt() = 0;
311    
312     /**
313     * Must be implemented by descendant, returning a list of possible
314     * int values for the parameter. If a list of possible values does
315     * not make sense, the implementation should return an empty
316     * vector.
317     */
318 schoenebeck 123 virtual std::vector<int> PossibilitiesAsInt() = 0;
319 schoenebeck 2414
320     /**
321     * Must be implemented be a driver's parameter class to react on
322     * the parameter value being set / altered.
323     *
324     * @param i - new parameter value set by the user
325     * @throws Exception - might be thrown by the driver in case it
326     * cannot handle the supplied parameter value
327     * for whatever reason
328     */
329     virtual void OnSetValue(int i) throw (Exception) = 0;
330 schoenebeck 123 protected:
331     int iVal;
332     };
333    
334 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c float.
335     *
336     * Implements a "runtime" driver parameter for value type @c float.
337     * A driver offering a parameter of type @c float would derive its
338     * parameter class from this class and implement the abstract methods
339     * OnSetValue(), RangeMinAsFloat(), RangeMaxAsFloat() and
340     * PossibilitiesAsFloat().
341     *
342     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
343     * about "runtime" parameters vs. "creation" parameters.
344     *
345     * @see DeviceCreationParameterFloat
346     */
347 schoenebeck 123 class DeviceRuntimeParameterFloat : public DeviceRuntimeParameter {
348     public:
349 schoenebeck 2414 /** @brief Constructor for value type @c float.
350     *
351     * Sets an initial value for the parameter.
352     *
353     * @param fVal - initial float value
354     */
355 schoenebeck 123 DeviceRuntimeParameterFloat(float fVal);
356 schoenebeck 2414
357     /////////////////////////////////////////////////////////////////
358     // derived methods, implementing type "FLOAT"
359     // (usually not to be overriden by descendant)
360    
361 schoenebeck 2434 virtual String Type() OVERRIDE;
362     virtual bool Multiplicity() OVERRIDE;
363     virtual optional<String> RangeMin() OVERRIDE;
364     virtual optional<String> RangeMax() OVERRIDE;
365     virtual optional<String> Possibilities() OVERRIDE;
366     virtual String Value() OVERRIDE;
367     virtual void SetValue(String val) throw (Exception) OVERRIDE;
368 schoenebeck 123
369 schoenebeck 2414 /////////////////////////////////////////////////////////////////
370     // convenience methods for type "FLOAT"
371     // (usually not to be overriden by descendant)
372    
373 schoenebeck 123 virtual float ValueAsFloat();
374 schoenebeck 880 virtual void SetValue(float f) throw (Exception);
375 schoenebeck 2414
376     /////////////////////////////////////////////////////////////////
377     // abstract methods
378     // (these have to be implemented by the descendant)
379 schoenebeck 123
380 schoenebeck 2414 /**
381     * Must be implemented by descendant, returning a minimum float
382     * value for the parameter. If a minimum value does not make sense
383     * for the specific driver parameter, then the implementation
384     * should return @c optional<float>::nothing.
385     */
386     virtual optional<float> RangeMinAsFloat() = 0;
387    
388     /**
389     * Must be implemented by descendant, returning a maximum float
390     * value for the parameter. If a maximum value does not make sense
391     * for the specific driver parameter, then the implementation
392     * should return @c optional<float>::nothing.
393     */
394     virtual optional<float> RangeMaxAsFloat() = 0;
395    
396     /**
397     * Must be implemented by descendant, returning a list of possible
398     * float values for the parameter. If a list of possible values
399     * does not make sense, the implementation should return an empty
400     * vector.
401     */
402     virtual std::vector<float> PossibilitiesAsFloat() = 0;
403    
404     /**
405     * Must be implemented be a driver's parameter class to react on
406     * the parameter value being set / altered.
407     *
408     * @param f - new parameter value set by the user
409     * @throws Exception - might be thrown by the driver in case it
410     * cannot handle the supplied parameter value
411     * for whatever reason
412     */
413     virtual void OnSetValue(float f) = 0;
414 schoenebeck 123 protected:
415     float fVal;
416     };
417    
418 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c String.
419     *
420     * Implements a "runtime" driver parameter for value type @c String.
421     * A driver offering a parameter of type @c String would derive its
422     * parameter class from this class and implement the abstract methods
423     * OnSetValue() and PossibilitiesAsString().
424     *
425     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
426     * about "runtime" parameters vs. "creation" parameters.
427     *
428     * @see DeviceCreationParameterString
429     */
430 schoenebeck 123 class DeviceRuntimeParameterString : public DeviceRuntimeParameter {
431     public:
432 schoenebeck 2414 /** @brief Constructor for value type @c String.
433     *
434     * Sets an initial value for the parameter.
435     *
436     * @param sVal - initial String value
437     */
438 schoenebeck 123 DeviceRuntimeParameterString(String sVal);
439 schoenebeck 2414
440     /// @brief Destructor.
441 schoenebeck 361 virtual ~DeviceRuntimeParameterString(){}
442 schoenebeck 2414
443     /////////////////////////////////////////////////////////////////
444     // derived methods, implementing type "STRING"
445     // (usually not to be overriden by descendant)
446    
447 schoenebeck 2434 virtual String Type() OVERRIDE;
448     virtual bool Multiplicity() OVERRIDE;
449     virtual optional<String> RangeMin() OVERRIDE;
450     virtual optional<String> RangeMax() OVERRIDE;
451     virtual optional<String> Possibilities() OVERRIDE;
452     virtual String Value() OVERRIDE;
453     virtual void SetValue(String val) throw (Exception) OVERRIDE;
454 schoenebeck 2414
455     /////////////////////////////////////////////////////////////////
456     // convenience methods for type "STRING"
457     // (usually not to be overriden by descendant)
458 schoenebeck 123
459 schoenebeck 214 virtual String ValueAsString();
460 schoenebeck 880 virtual void SetValueAsString(String s) throw (Exception);
461 schoenebeck 2414
462     /////////////////////////////////////////////////////////////////
463     // abstract methods
464     // (these have to be implemented by the descendant)
465 schoenebeck 214
466 schoenebeck 2414 /**
467     * Must be implemented by descendant, returning a list of possible
468     * String values for the parameter. If a list of possible values
469     * does not make sense, the implementation should return an empty
470     * vector.
471     */
472 schoenebeck 123 virtual std::vector<String> PossibilitiesAsString() = 0;
473 schoenebeck 2414
474     /**
475     * Must be implemented be a driver's parameter class to react on
476     * the parameter value being set / altered.
477     *
478     * @param s - new parameter value set by the user
479     * @throws Exception - might be thrown by the driver in case it
480     * cannot handle the supplied parameter value
481     * for whatever reason
482     */
483     virtual void OnSetValue(String s) = 0;
484 schoenebeck 123 protected:
485     String sVal;
486     };
487    
488 schoenebeck 2414 /** @brief Abstract base class for driver parameters of a @c String list type.
489     *
490     * Implements a "runtime" driver parameter for multiple values of type
491     * @c String. A driver offering a parameter of a @c String list type would
492     * derive its parameter class from this class and implement the abstract
493     * methods OnSetValue() and PossibilitiesAsString().
494     *
495     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
496     * about "runtime" parameters vs. "creation" parameters.
497     *
498     * @see DeviceCreationParameterStrings
499     */
500 schoenebeck 123 class DeviceRuntimeParameterStrings : public DeviceRuntimeParameter {
501     public:
502 schoenebeck 2414 /** @brief Constructor for value type @c String.
503     *
504     * Sets an initial list of values for the parameter.
505     *
506     * @param sVal - initial String value
507     */
508 schoenebeck 123 DeviceRuntimeParameterStrings(std::vector<String> vS);
509 schoenebeck 2414
510     /// @brief Destructor.
511 schoenebeck 361 virtual ~DeviceRuntimeParameterStrings(){}
512 schoenebeck 2414
513     /////////////////////////////////////////////////////////////////
514     // derived methods, implementing type "STRINGS"
515     // (usually not to be overriden by descendant)
516    
517 schoenebeck 2434 virtual String Type() OVERRIDE;
518     virtual bool Multiplicity() OVERRIDE;
519     virtual optional<String> RangeMin() OVERRIDE;
520     virtual optional<String> RangeMax() OVERRIDE;
521     virtual optional<String> Possibilities() OVERRIDE;
522     virtual String Value() OVERRIDE;
523     virtual void SetValue(String val) throw (Exception) OVERRIDE;
524 schoenebeck 2414
525     /////////////////////////////////////////////////////////////////
526     // convenience methods for type "STRINGS"
527     // (usually not to be overriden by descendant)
528 schoenebeck 123
529     virtual std::vector<String> ValueAsStrings();
530 schoenebeck 880 virtual void SetValue(std::vector<String> vS) throw (Exception);
531 schoenebeck 2414
532     /////////////////////////////////////////////////////////////////
533     // abstract methods
534     // (these have to be implemented by the descendant)
535 schoenebeck 123
536 schoenebeck 2414 /**
537     * Must be implemented by descendant, returning a list of possible
538     * String values for the parameter. If a list of possible values
539     * does not make sense, the implementation should return an empty
540     * vector.
541     */
542     virtual std::vector<String> PossibilitiesAsString() = 0;
543    
544     /**
545     * Must be implemented be a driver's parameter class to react on
546     * the parameter value being set / altered.
547     *
548     * @param vS - new parameter values set by the user
549     * @throws Exception - might be thrown by the driver in case it
550     * cannot handle the supplied parameter values
551     * for whatever reason
552     */
553     virtual void OnSetValue(std::vector<String> vS) = 0;
554 schoenebeck 123 protected:
555     std::vector<String> sVals;
556     };
557    
558 schoenebeck 2414
559     /////////////////////////////////////////////////////////////////
560     // "Creation" parameters
561 schoenebeck 123
562 schoenebeck 2414 /** @brief Abstract base class for parameters at driver instanciation time.
563     *
564     * Device "creation" parameters are special parameters, that are meant to be only
565     * set when a device (driver instance) is created. After device creation those
566     * parameters act as read only parameters. See DeviceRuntimeParameter for a
567     * discussion about this topic.
568     *
569     * In addition to "runtime" parameters, "creation" parameters also handle
570     * additional meta informations required in the specific situations of
571     * creating a device (driver instance). For example "creation" parameters
572     * might indicate whether they MUST be provided explicitly
573     * ( @c Mandatory() ) by the user (i.e. a parameter "CARD" selecting a
574     * specific sound card) for being able to create an instance of the driver.
575     * And "creation" parameters might indicate being dependent to other
576     * parameters, i.e. a parameter "SAMPLERATE" might depend on a parameter
577     * "CARD", to be able to actually provide a list of meaningful
578     * possibilities for sample rates the respective sound card supports.
579     */
580 schoenebeck 123 class DeviceCreationParameter : public DeviceRuntimeParameter {
581     public:
582 schoenebeck 2414 /// @brief Constructor.
583     DeviceCreationParameter ( void ) { pDevice = NULL; }
584    
585     /**
586     * Whether the parameter must be supplied by the user at device
587     * creation time. If this method return @c false, then the
588     * parameter is optional
589     */
590     virtual bool Mandatory() = 0;
591    
592     /**
593     * Might return a comma separated list of parameter names this
594     * parameter depends on. See this class's introduction about a
595     * discussion of parameters with dependencies. If this method
596     * returns @c optional<String>::nothing, then it does not have any
597     * dependencies to other parameters.
598     *
599     * This method already provides an implementation, which usually is
600     * not overridden by descendants. A descendant would rather
601     * implement DependsAsParameters() instead.
602     *
603     * @see DependsAsParameters()
604     */
605     virtual optional<String> Depends();
606    
607     /**
608     * Might return a unique key-value pair list (map) reflecting the
609     * dependencies of this parameter to other parameters. Each entry
610     * in the map consists of a key-value pair, the key being the
611     * parameter name of the respective dependent parameter, and the
612     * value being an instance of the dependency parameter of that name.
613     *
614     * A descendant MUST implement this method, informing about its
615     * dependencies. If the parameter does not have any dependencies it
616     * should return an empty map.
617     *
618     * See this class's introduction about a discussion of parameters
619     * with dependencies.
620     */
621 schoenebeck 123 virtual std::map<String,DeviceCreationParameter*> DependsAsParameters() = 0;
622 schoenebeck 2414
623     /**
624     * Might return a default value for this parameter. The default
625     * value will be used if the user does not provide a specific value
626     * for this parameter at device creation time. If the parameter
627     * does not have a reasonable default value, it will return
628     * @c optional<String>::nothing.
629     *
630     * This method already provides an implementation, which usually is
631     * not overridden by descendants. A descendant would rather
632     * implement the other Default() method taking arguments.
633     */
634     virtual optional<String> Default();
635    
636     /**
637     * Might return a default value for this parameter. The default
638     * value will be used if the user does not provide a specific value
639     * for this parameter at device creation time.
640     *
641     * This method must be implemented by descendants. If the parameter
642     * does not have a reasonable default value, it should return
643     * @c optional<String>::nothing.
644     *
645     * As arguments, the parameters are passed to this method
646     * automatically, which the user already provided. For example a
647     * parameter "CARD" the user already did set for selecting a
648     * specific sound card. So such arguments resolve dependencies
649     * of this parameter.
650     *
651     * @param Parameters - other parameters which the user already
652     * supplied
653     */
654     virtual optional<String> Default(std::map<String,String> Parameters) = 0;
655    
656     /**
657     * Might return a minimum value for this parameter. If the
658     * parameter does not have a reasonable minimum value, it will
659     * return @c optional<String>::nothing.
660     *
661     * This method already provides an implementation, which usually is
662     * not overridden by descendants. A descendant would rather
663     * implement the other RangeMin() method taking arguments.
664     */
665     virtual optional<String> RangeMin();
666    
667     /**
668     * Might return a minimum value for this parameter.
669     *
670     * This method must be implemented by descendants. If the parameter
671     * does not have a reasonable minimum value, it should return
672     * @c optional<String>::nothing.
673     *
674     * As arguments, the parameters are passed to this method
675     * automatically, which the user already provided. For example a
676     * parameter "CARD" the user already did set for selecting a
677     * specific sound card. So such arguments resolve dependencies
678     * of this parameter.
679     *
680     * @param Parameters - other parameters which the user already
681     * supplied
682     */
683     virtual optional<String> RangeMin(std::map<String,String> Parameters) = 0;
684    
685     /**
686     * Might return a maximum value for this parameter. If the
687     * parameter does not have a reasonable maximum value, it will
688     * return @c optional<String>::nothing.
689     *
690     * This method already provides an implementation, which usually is
691     * not overridden by descendants. A descendant would rather
692     * implement the other RangeMax() method taking arguments.
693     */
694     virtual optional<String> RangeMax();
695    
696     /**
697     * Might return a maximum value for this parameter.
698     *
699     * This method must be implemented by descendants. If the parameter
700     * does not have a reasonable maximum value, it should return
701     * @c optional<String>::nothing.
702     *
703     * As arguments, the parameters are passed to this method
704     * automatically, which the user already provided. For example a
705     * parameter "CARD" the user already did set for selecting a
706     * specific sound card. So such arguments resolve dependencies
707     * of this parameter.
708     *
709     * @param Parameters - other parameters which the user already
710     * supplied
711     */
712     virtual optional<String> RangeMax(std::map<String,String> Parameters) = 0;
713    
714     /**
715     * Might return a comma separated list as String with possible
716     * values for this parameter. If the parameter does not have
717     * reasonable, specific possible values, it will return
718     * @c optional<String>::nothing.
719     *
720     * This method already provides an implementation, which usually is
721     * not overridden by descendants. A descendant would rather
722     * implement the other Possibilities() method taking arguments.
723     */
724     virtual optional<String> Possibilities();
725    
726     /**
727     * Might return a comma separated list as String with possible
728     * values for this parameter.
729     *
730     * This method must be implemented by descendants. If the parameter
731     * does not have reasonable, specific possible values, it should
732     * return @c optional<String>::nothing.
733     *
734     * As arguments, the parameters are passed to this method
735     * automatically, which the user already provided. For example a
736     * parameter "CARD" the user already did set for selecting a
737     * specific sound card. So such arguments resolve dependencies
738     * of this parameter.
739     *
740     * @param Parameters - other parameters which the user already
741     * supplied
742     */
743     virtual optional<String> Possibilities(std::map<String,String> Parameters) = 0;
744    
745     /**
746     * Sets the internal device pointer to a specific device (driver
747     * instance) for this parameter object. Descendants usually use
748     * that internal pointer to interact with their specific driver
749     * implementation class.
750     */
751     void Attach(Device* pDevice) { this->pDevice = pDevice; }
752 senkov 174 protected:
753 schoenebeck 207 Device* pDevice;
754 schoenebeck 123 };
755    
756 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c Bool.
757     *
758     * Implements a "creation" driver parameter for value type @c bool.
759     * A driver offering a parameter of type @c bool would derive its
760     * parameter class from this class and implement the abstract methods
761     * OnSetValue() and DefaultAsBool().
762     *
763     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
764     * about "runtime" parameters vs. "creation" parameters.
765     *
766     * @see DeviceRuntimeParameterBool
767     */
768 schoenebeck 123 class DeviceCreationParameterBool : public DeviceCreationParameter {
769     public:
770 senkov 174 DeviceCreationParameterBool(bool bVal = false);
771 schoenebeck 880 DeviceCreationParameterBool(String val) throw (Exception);
772 schoenebeck 2434 virtual String Type() OVERRIDE;
773     virtual bool Multiplicity() OVERRIDE;
774     virtual optional<String> Default(std::map<String,String> Parameters) OVERRIDE;
775     virtual optional<String> RangeMin(std::map<String,String> Parameters) OVERRIDE;
776     virtual optional<String> RangeMax(std::map<String,String> Parameters) OVERRIDE;
777     virtual optional<String> Possibilities(std::map<String,String> Parameters) OVERRIDE;
778     virtual String Value() OVERRIDE;
779     virtual void SetValue(String val) throw (Exception) OVERRIDE;
780 schoenebeck 123
781     virtual bool ValueAsBool();
782 schoenebeck 880 virtual void SetValue(bool b) throw (Exception);
783 schoenebeck 123
784     virtual optional<bool> DefaultAsBool(std::map<String,String> Parameters) = 0;
785 schoenebeck 880 virtual void OnSetValue(bool b) throw (Exception) = 0;
786 schoenebeck 123 protected:
787     bool bVal;
788 senkov 128 void InitWithDefault();
789 schoenebeck 123 private:
790     };
791    
792 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c int.
793     *
794     * Implements a "creation" driver parameter for value type @c int.
795     * A driver offering a parameter of type @c int would derive its
796     * parameter class from this class and implement the abstract methods
797     * OnSetValue(), PossibilitiesAsInt(), RangeMinAsInt(), RangeMaxAsInt()
798     * and DefaultAsInt().
799     *
800     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
801     * about "runtime" parameters vs. "creation" parameters.
802     *
803     * @see DeviceRuntimeParameterInt
804     */
805 schoenebeck 123 class DeviceCreationParameterInt : public DeviceCreationParameter {
806     public:
807 senkov 174 DeviceCreationParameterInt(int iVal = 0);
808 schoenebeck 880 DeviceCreationParameterInt(String val) throw (Exception);
809 schoenebeck 2434 virtual String Type() OVERRIDE;
810     virtual bool Multiplicity() OVERRIDE;
811     virtual optional<String> Default(std::map<String,String> Parameters) OVERRIDE;
812     virtual optional<String> RangeMin(std::map<String,String> Parameters) OVERRIDE;
813     virtual optional<String> RangeMax(std::map<String,String> Parameters) OVERRIDE;
814     virtual optional<String> Possibilities(std::map<String,String> Parameters) OVERRIDE;
815     virtual String Value() OVERRIDE;
816     virtual void SetValue(String val) throw (Exception) OVERRIDE;
817 schoenebeck 123
818     virtual int ValueAsInt();
819 schoenebeck 880 virtual void SetValue(int i) throw (Exception);
820 schoenebeck 123
821     virtual optional<int> DefaultAsInt(std::map<String,String> Parameters) = 0;
822     virtual optional<int> RangeMinAsInt(std::map<String,String> Parameters) = 0;
823     virtual optional<int> RangeMaxAsInt(std::map<String,String> Parameters) = 0;
824     virtual std::vector<int> PossibilitiesAsInt(std::map<String,String> Parameters) = 0;
825 schoenebeck 880 virtual void OnSetValue(int i) throw (Exception) = 0;
826 schoenebeck 123 protected:
827     int iVal;
828 senkov 128 void InitWithDefault();
829 schoenebeck 123 private:
830     };
831    
832 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c float.
833     *
834     * Implements a "creation" driver parameter for value type @c float.
835     * A driver offering a parameter of type @c float would derive its
836     * parameter class from this class and implement the abstract methods
837     * OnSetValue(), PossibilitiesAsFloat(), RangeMinAsFloat(),
838     * RangeMaxAsFloat() and DefaultAsFloat().
839     *
840     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
841     * about "runtime" parameters vs. "creation" parameters.
842     *
843     * @see DeviceRuntimeParameterFloat
844     */
845 schoenebeck 123 class DeviceCreationParameterFloat : public DeviceCreationParameter {
846     public:
847 senkov 174 DeviceCreationParameterFloat(float fVal = 0.0);
848 schoenebeck 880 DeviceCreationParameterFloat(String val) throw (Exception);
849 schoenebeck 2434 virtual String Type() OVERRIDE;
850     virtual bool Multiplicity() OVERRIDE;
851     virtual optional<String> Default(std::map<String,String> Parameters) OVERRIDE;
852     virtual optional<String> RangeMin(std::map<String,String> Parameters) OVERRIDE;
853     virtual optional<String> RangeMax(std::map<String,String> Parameters) OVERRIDE;
854     virtual optional<String> Possibilities(std::map<String,String> Parameters) OVERRIDE;
855     virtual String Value() OVERRIDE;
856     virtual void SetValue(String val) throw (Exception) OVERRIDE;
857 schoenebeck 123
858     virtual float ValueAsFloat();
859 schoenebeck 880 virtual void SetValue(float f) throw (Exception);
860 schoenebeck 123
861     virtual optional<float> DefaultAsFloat(std::map<String,String> Parameters) = 0;
862     virtual optional<float> RangeMinAsFloat(std::map<String,String> Parameters) = 0;
863     virtual optional<float> RangeMaxAsFloat(std::map<String,String> Parameters) = 0;
864     virtual std::vector<float> PossibilitiesAsFloat(std::map<String,String> Parameters) = 0;
865 schoenebeck 880 virtual void OnSetValue(float f) throw (Exception) = 0;
866 schoenebeck 123 protected:
867     float fVal;
868 senkov 128 void InitWithDefault();
869 schoenebeck 123 private:
870     };
871    
872 schoenebeck 2414 /** @brief Abstract base class for driver parameters of type @c String.
873     *
874     * Implements a "creation" driver parameter for value type @c String.
875     * A driver offering a parameter of type @c String would derive its
876     * parameter class from this class and implement the abstract methods
877     * OnSetValue(), PossibilitiesAsString() and DefaultAsString().
878     *
879     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
880     * about "runtime" parameters vs. "creation" parameters.
881     *
882     * @see DeviceRuntimeParameterString
883     */
884 schoenebeck 123 class DeviceCreationParameterString : public DeviceCreationParameter {
885     public:
886 senkov 174 DeviceCreationParameterString(String sVal = String());
887 schoenebeck 361 virtual ~DeviceCreationParameterString(){}
888 schoenebeck 2434 virtual String Type() OVERRIDE;
889     virtual bool Multiplicity() OVERRIDE;
890     virtual optional<String> Default(std::map<String,String> Parameters) OVERRIDE;
891     virtual optional<String> RangeMin(std::map<String,String> Parameters) OVERRIDE;
892     virtual optional<String> RangeMax(std::map<String,String> Parameters) OVERRIDE;
893     virtual optional<String> Possibilities(std::map<String,String> Parameters) OVERRIDE;
894     virtual String Value() OVERRIDE;
895     virtual void SetValue(String val) throw (Exception) OVERRIDE;
896 schoenebeck 123
897 schoenebeck 214 virtual String ValueAsString();
898 schoenebeck 880 virtual void SetValueAsString(String s) throw (Exception);
899 schoenebeck 214
900 schoenebeck 212 virtual optional<String> DefaultAsString(std::map<String,String> Parameters) = 0;
901 schoenebeck 123 virtual std::vector<String> PossibilitiesAsString(std::map<String,String> Parameters) = 0;
902 schoenebeck 880 virtual void OnSetValue(String s) throw (Exception) = 0;
903 schoenebeck 123 protected:
904     String sVal;
905 senkov 128 void InitWithDefault();
906 schoenebeck 123 private:
907     };
908    
909 schoenebeck 2414 /** @brief Abstract base class for driver parameters of a @c String list type.
910     *
911     * Implements a "creation" driver parameter for @c String value types.
912     * A driver offering a parameter allowing to set multiple values of type
913     * @c String would derive its parameter class from this class and implement
914     * the abstract methods OnSetValue(), PossibilitiesAsString() and
915     * DefaultAsStrings().
916     *
917     * See DeviceCreationParameter and DeviceRuntimeParameter for a discussion
918     * about "runtime" parameters vs. "creation" parameters.
919     *
920     * @see DeviceRuntimeParameterStrings
921     */
922 schoenebeck 123 class DeviceCreationParameterStrings : public DeviceCreationParameter {
923     public:
924     DeviceCreationParameterStrings();
925     DeviceCreationParameterStrings(std::vector<String> sVals);
926 schoenebeck 880 DeviceCreationParameterStrings(String val) throw (Exception);
927 schoenebeck 361 virtual ~DeviceCreationParameterStrings(){}
928 schoenebeck 2434 virtual String Type() OVERRIDE;
929     virtual bool Multiplicity() OVERRIDE;
930     virtual optional<String> Default(std::map<String,String> Parameters) OVERRIDE;
931     virtual optional<String> RangeMin(std::map<String,String> Parameters) OVERRIDE;
932     virtual optional<String> RangeMax(std::map<String,String> Parameters) OVERRIDE;
933     virtual optional<String> Possibilities(std::map<String,String> Parameters) OVERRIDE;
934     virtual String Value() OVERRIDE;
935     virtual void SetValue(String val) throw (Exception) OVERRIDE;
936 schoenebeck 123
937     virtual std::vector<String> ValueAsStrings();
938 schoenebeck 880 virtual void SetValue(std::vector<String> vS) throw (Exception);
939 schoenebeck 123
940 schoenebeck 212 virtual std::vector<String> DefaultAsStrings(std::map<String,String> Parameters) = 0;
941 schoenebeck 123 virtual std::vector<String> PossibilitiesAsString(std::map<String,String> Parameters) = 0;
942 schoenebeck 880 virtual void OnSetValue(std::vector<String> vS) throw (Exception) = 0;
943 schoenebeck 123 protected:
944     std::vector<String> sVals;
945 senkov 128 void InitWithDefault();
946 schoenebeck 123 private:
947     };
948    
949     } // namespace LinuxSampler
950    
951     #endif // __LS_DEVICE_PARAMETER_H__

  ViewVC Help
Powered by ViewVC