CSL  6.0
SpeakerLayout.h
Go to the documentation of this file.
1 //
2 // SpeakerLayout.h -- Class for loading and parsing loudspeaker position information used
3 // by the Spatializer and Auralizer classes.
4 // See the copyright notice and acknowledgment of authors in the file COPYRIGHT
5 // Created by Jorge Castellanos on 6/16/06. Hacked 8/09 by STP.
6 //
7 
8 #ifndef SPEAKERLAYOUT_H
9 #define SPEAKERLAYOUT_H
10 
11 #include "CSL_Core.h"
12 #include "CPoint.h"
13 
14 namespace csl {
15 
16 class Speaker; // Forward declaration. See below.
17 
18 /**
19 A speaker layout holds a set of loudspeakers.
20 Each speaker has a position (in a space, where measurements are assumed to be from the center point of the space (also the center of the coordinate system).
21 To simplify usage, a default layout will be created when instantiating any object that uses the speaker layout.
22 If the user does not specify a layout then the default layout is used.
23 Any layout can be set to become default (by calling setDefaultSpeakerLayout()) so new objects that require a SpeakerLayout
24 make use of this prefered layout without the need of passing it explicitly per instance.
25 Using multiple layouts is still possible by passing the desired layout to the object that will use it.
26 In that case, this object will go with this layout instead of the default.
27 
28 Conventions used in this code:
29 Coordinate system:
30  - Left oriented
31  - Internal angle representation: spherical radians
32  - Azimuth = 0 on the x/z plane and increasing towards the positive y direction
33  - Elevation = 0 on x/y plane and increasing towards the positive z direction
34 
35 the layout is a passive object, meaning that it doesn't deal with processing any audio data. It only provides speaker positions.
36 An "ActiveSpeakerLayout" is active and can be used as a UnitGenerator that compensates for speaker positions, etc.
37 
38 */
39 class SpeakerLayout : public Model {
40 public:
41  // Constructors & destructor:
42  SpeakerLayout(const char *filePath = NULL); ///< Creates an empty speaker layout. Optionally reads loudspeaker layout from file.
43  virtual ~SpeakerLayout(); ///< destructor
44 
45  /// Reads the speaker listing file according to the specification
46  void readSpeakerFile(const char *filePath);
47 
48  /// Returns a pointer to the default layout. If no default exists, it creates one.
50  /// Use it to set a layout as default. Clients (e.g. a Panner) can then make use of this layout.
51  static void setDefaultSpeakerLayout(SpeakerLayout *defaultLayout);
52 
53  /// Add a speaker specifying its position in degrees from the center of the listening space.
54  void addSpeaker(float azimuth, float elevation = 0.0, float radius = 1.0);
55  /// Add a WFS speaker
56  void addSpeaker(float x, float y, float z, float xNorm, float yNorm, float zNorm, float gain);
57 
58  unsigned numSpeakers() const { return mSpeakers.size(); }; ///< Returns the number of loudspeakers in the layout
59 
60  /// Sets speaker distances to a fixed distance from the center of the listening space.
61  /// @param radius is optional. If not set, it finds the best radius by analyzing the layout.
62  void normalizeSpeakerDistances(float radius = 0);
63 
64  /// Returns the speaker at the specified index.
65  Speaker *speakerAtIndex(unsigned speakerIndex) const { return mSpeakers[speakerIndex]; };
66 
67  bool isPeriphonic() { return (mDimensions == 3); }; ///< If any of the speakers in the layout has an elevation other than 0, it returns true.
68  void dump();
69 
70 protected:
71  vector<Speaker *> mSpeakers; ///< Vector of pointers to the loudspeakers
72 
73 
74 private:
75  unsigned mDimensions;
76 // void cartesianToSphericalRadians(); // convert speaker layout given in cartesian coordinates to spherical radians
78  float *mSpeakerDistanceDeltas; ///< Holds the diference of the optimal speaker distance and the real one. Only used if distances are normalized.
79 
80 public:
81  SpeakerLayout &operator=(const SpeakerLayout &layout); ///< Overloaded "=" operator allows copying the layout.
82 };
83 
84 /// Standard "Stereo Speaker Layout", where two speakers are positioned 30¼ left, 30¼ right and no elevation (0¼).
85 
87 public:
89 };
90 
91 /// "Headphone Layout", where two phones are positioned 90¼ left, 90¼ right and no elevation (0¼).
92 
94 public:
96 };
97 
98 
99 /// Represents a speaker as a position relative to the center of a space.
100 class Speaker {
101 public:
102  /// Speaker constructor.
103  /// The speaker class should only be used by the speaker layout. Clients should modify speakers using the Speaker layout
104  /// and not deal with speakers directly. The speaker positions have to be specified in (spherical) radians.
105  Speaker(float azimuth, float elevation, float radius = 1.0);
106 
107  // constructor with normal point. x,y,z are position, xNorm,yNorm,zNorm are a point to which the speaker is facing. converted to a normalized vector by Speaker class.
108  Speaker(float x, float y, float z, float xNorm, float yNorm, float zNorm, float gain = 1.0);
109 
110  ~Speaker() { };
111 
112  CPoint position() { return mPosition; }; // Return the position of the speaker.
113  float azimuth() { return mPosition.theta(); };
114  float elevation() { return mPosition.ele(); };
115  float radius() { return mPosition.r(); };
116  void setRadius(float radius); ///< Specify the distance from the center of the coordinate space to the speaker.
117 
118  CPoint normal() { return mNormal; }; // Return the normal of the speaker.
119  float speakerGain() { return mGain;};
120 
121  void dump(); ///< Print speaker information.
122 
123 protected:
125  CPoint mNormal; // normal vector for speaker
126  float mGain; // a speaker dependant gain, defaults to 1.
127 };
128 
129 }
130 
131 #endif
static SpeakerLayout * sDefaultSpeakerLayout
Definition: SpeakerLayout.h:77
virtual ~SpeakerLayout()
destructor
The Model/Observable/Subject class; instances of its subclasses should send themselves, this->changed(some_data); on "relevant" state changes; the code they inherit (from Model) manages updating the list of observer/dependent objects in that they each receive update(some_data); and can access the model-passed data (the model might pass "this").
Definition: CGestalt.h:258
float * mSpeakerDistanceDeltas
Holds the diference of the optimal speaker distance and the real one. Only used if distances are norm...
Definition: SpeakerLayout.h:78
float elevation()
float azimuth()
float radius()
COORD_TYPE theta()
Definition: CPoint.cpp:383
AdditiveInstrument.h – Sum-of-sines synthesis instrument class.
Definition: Accessor.h:17
"Headphone Layout", where two phones are positioned 90¼ left, 90¼ right and no elevation (0¼)...
Definition: SpeakerLayout.h:93
Speaker * speakerAtIndex(unsigned speakerIndex) const
Returns the speaker at the specified index.
Definition: SpeakerLayout.h:65
void normalizeSpeakerDistances(float radius=0)
Returns the number of loudspeakers in the layout.
Speaker(float azimuth, float elevation, float radius=1.0)
Speaker constructor. The speaker class should only be used by the speaker layout. Clients should modi...
SpeakerLayout(const char *filePath=NULL)
Creates an empty speaker layout. Optionally reads loudspeaker layout from file.
void readSpeakerFile(const char *filePath)
Reads the speaker listing file according to the specification.
COORD_TYPE ele()
Definition: CPoint.cpp:410
float speakerGain()
Represents a speaker as a position relative to the center of a space.
COORD_TYPE r()
Definition: CPoint.h:151
void dump()
Print speaker information.
vector< Speaker * > mSpeakers
Vector of pointers to the loudspeakers.
Definition: SpeakerLayout.h:71
static void setDefaultSpeakerLayout(SpeakerLayout *defaultLayout)
Use it to set a layout as default. Clients (e.g. a Panner) can then make use of this layout...
void dump()
If any of the speakers in the layout has an elevation other than 0, it returns true.
CPoint normal()
unsigned numSpeakers() const
Definition: SpeakerLayout.h:58
CPoint position()
static SpeakerLayout * defaultSpeakerLayout()
Returns a pointer to the default layout. If no default exists, it creates one.
void setRadius(float radius)
Specify the distance from the center of the coordinate space to the speaker.
void addSpeaker(float azimuth, float elevation=0.0, float radius=1.0)
Add a speaker specifying its position in degrees from the center of the listening space...
CPoint mPosition
SpeakerLayout & operator=(const SpeakerLayout &layout)
Overloaded "=" operator allows copying the layout.
Standard "Stereo Speaker Layout", where two speakers are positioned 30¼ left, 30¼ right and no elevat...
Definition: SpeakerLayout.h:86