CSL 5.2

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

DistanceSimulator.h
Go to the documentation of this file.
1 //
2 // DistanceSimulator.h -- Specification of the DistanceSimulators
3 // See the copyright notice and acknowledgment of authors in the file COPYRIGHT
4 // Created by Jorge Castellanos on 6/23/06. Hacked 8/09 by STP.
5 //
6
7 #ifndef DISTANCE_SIMULATOR_H
8 #define DISTANCE_SIMULATOR_H
9 #include "SpatialSource.h"
10
11 #include "CSL_Core.h"
12 #include "CPoint.h"
13
14 namespace csl {
15
16 class IntensityAttenuationCue;
17 class AirAbsorptionCue;
18
19 /// Only handles single sound sources because objects have different positions.
20 /// Two objects can't ocuppy the same position, and usually distance cues go before the
21 /// panning, so handling multiple sources by one Distance simulator, would producde a multi-channel
22 /// object, where the positions aren't dynamic anymore.
23
24 class DistanceSimulator : public SpatialSource {
25 public:
26 DistanceSimulator(UnitGenerator &source); // A UGen without position information. In this case, the distance simulator is the spatial source.
27 DistanceSimulator(SpatialSource &source);
28 ~DistanceSimulator();
29
30 virtual void nextBuffer(Buffer & outputBuffer, unsigned outBufNum) throw (CException);
31 /// Returns wether the sound source position changed since last block call.
32 virtual bool positionChanged();
33
34 protected:
35 // SoundSource ... it refers to its input UGen, but with the knowledge of its position within a space.
36 // SpatialSource *mSource; // list of spatial inputs
37 IntensityAttenuationCue *mIntensityCue;
38 AirAbsorptionCue *mAirAbsorptionCue;
39
40 };
41
42 /// Pure Abstract Base Class for all distance cues.
43 /// A DistanceCue subclass is just an algorithm that modifies a signal based on the distance from the listener.
44 /// Distance Cues should hold their state, so when "process" is called they can modify the signal buffer given.
45 /// When "compute" is called is usually due to a change in distance, so if anything has to be re-calculated, it's done.
46
47 class DistanceCue {
48 public:
49 DistanceCue() { };
50 virtual ~DistanceCue() { };
51
52 virtual void compute(float distance) = 0;
53 virtual void process(Buffer &inputBuffer) = 0;
54
55 };
56
57 /// Sound attenuation due to increasing distance. This "Base" Class uses the inverse square law.
58 /// Subclass for other methods.
59
60 class IntensityAttenuationCue : public DistanceCue {
61 public:
62 IntensityAttenuationCue() { };
63 virtual ~IntensityAttenuationCue() { };
64
65 virtual void compute(float distance);
66 virtual void process(Buffer &aBuffer);
67
68 protected:
69 float mGain;
70
71 };
72
73 /// Simulates the frequency dependent air absorption using a one pole/zero lowpass filter.
74
75 class AirAbsorptionCue : public DistanceCue {
76 public:
77 AirAbsorptionCue();
78 virtual ~AirAbsorptionCue();
79
80 virtual void compute(float distance); ///< Calculate the filter coefficients.
81 virtual void process(Buffer &aBuffer); ///< Process each sample in the buffer, applying the filter.
82
83 protected:
84 float mBCoeff;
85 float mACoeff[2];
86 float mPrevOutput;
87 float mPrevInput;
88
89 };
90
91 //class AirAbsorptionCue : public DistanceCue {
92 //public:
93 // AirAbsorptionCue();
94 // virtual ~AirAbsorptionCue();
95 //
96 // virtual void compute(float distance);
97 // virtual void process(Buffer &aBuffer);
98 //
99 //protected:
100 // float mBCoeff[3];
101 // float mACoeff[3];
102 // float mPrevOutputs[3];
103 // float mPrevInputs[3];
104 //
105 //};
106
107 }
108
109 #endif