OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 }; | 54 }; |
55 | 55 |
56 // These must be defined as in the .idl file and must match those | 56 // These must be defined as in the .idl file and must match those |
57 // in the DistanceEffect class. | 57 // in the DistanceEffect class. |
58 enum { | 58 enum { |
59 LINEAR_DISTANCE = 0, | 59 LINEAR_DISTANCE = 0, |
60 INVERSE_DISTANCE = 1, | 60 INVERSE_DISTANCE = 1, |
61 EXPONENTIAL_DISTANCE = 2, | 61 EXPONENTIAL_DISTANCE = 2, |
62 }; | 62 }; |
63 | 63 |
| 64 // These enums are used to distinguish what cached values of panner are dirt
y. |
| 65 enum { |
| 66 AzimuthElevationDirty = 0x1, |
| 67 DistanceConeGainDirty = 0x2, |
| 68 DopplerRateDirty = 0x4, |
| 69 }; |
| 70 |
64 static PassRefPtr<PannerNode> create(AudioContext* context, float sampleRate
) | 71 static PassRefPtr<PannerNode> create(AudioContext* context, float sampleRate
) |
65 { | 72 { |
66 return adoptRef(new PannerNode(context, sampleRate)); | 73 return adoptRef(new PannerNode(context, sampleRate)); |
67 } | 74 } |
68 | 75 |
69 virtual ~PannerNode(); | 76 virtual ~PannerNode(); |
70 | 77 |
71 // AudioNode | 78 // AudioNode |
72 virtual void process(size_t framesToProcess) OVERRIDE; | 79 virtual void process(size_t framesToProcess) OVERRIDE; |
73 virtual void pullInputs(size_t framesToProcess) OVERRIDE; | 80 virtual void pullInputs(size_t framesToProcess) OVERRIDE; |
74 virtual void initialize() OVERRIDE; | 81 virtual void initialize() OVERRIDE; |
75 virtual void uninitialize() OVERRIDE; | 82 virtual void uninitialize() OVERRIDE; |
76 | 83 |
77 // AudioContext's listener | |
78 AudioListener* listener(); | |
79 | |
80 // Panning model | 84 // Panning model |
81 String panningModel() const; | 85 String panningModel() const; |
82 void setPanningModel(const String&); | 86 void setPanningModel(const String&); |
83 | 87 |
84 // Position | 88 // Position, orientation and velocity |
85 void setPosition(float x, float y, float z); | 89 void setPosition(float x, float y, float z); |
86 | |
87 // Orientation | |
88 void setOrientation(float x, float y, float z); | 90 void setOrientation(float x, float y, float z); |
89 | |
90 // Velocity | |
91 void setVelocity(float x, float y, float z); | 91 void setVelocity(float x, float y, float z); |
92 | 92 |
93 // Distance parameters | 93 // Distance parameters |
94 String distanceModel() const; | 94 String distanceModel() const; |
95 void setDistanceModel(const String&); | 95 void setDistanceModel(const String&); |
96 | 96 |
97 double refDistance() { return m_distanceEffect.refDistance(); } | 97 double refDistance() { return m_distanceEffect.refDistance(); } |
98 void setRefDistance(double refDistance) { m_distanceEffect.setRefDistance(re
fDistance); } | 98 void setRefDistance(double); |
99 | 99 |
100 double maxDistance() { return m_distanceEffect.maxDistance(); } | 100 double maxDistance() { return m_distanceEffect.maxDistance(); } |
101 void setMaxDistance(double maxDistance) { m_distanceEffect.setMaxDistance(ma
xDistance); } | 101 void setMaxDistance(double); |
102 | 102 |
103 double rolloffFactor() { return m_distanceEffect.rolloffFactor(); } | 103 double rolloffFactor() { return m_distanceEffect.rolloffFactor(); } |
104 void setRolloffFactor(double rolloffFactor) { m_distanceEffect.setRolloffFac
tor(rolloffFactor); } | 104 void setRolloffFactor(double); |
105 | 105 |
106 // Sound cones - angles in degrees | 106 // Sound cones - angles in degrees |
107 double coneInnerAngle() const { return m_coneEffect.innerAngle(); } | 107 double coneInnerAngle() const { return m_coneEffect.innerAngle(); } |
108 void setConeInnerAngle(double angle) { m_coneEffect.setInnerAngle(angle); } | 108 void setConeInnerAngle(double); |
109 | 109 |
110 double coneOuterAngle() const { return m_coneEffect.outerAngle(); } | 110 double coneOuterAngle() const { return m_coneEffect.outerAngle(); } |
111 void setConeOuterAngle(double angle) { m_coneEffect.setOuterAngle(angle); } | 111 void setConeOuterAngle(double); |
112 | 112 |
113 double coneOuterGain() const { return m_coneEffect.outerGain(); } | 113 double coneOuterGain() const { return m_coneEffect.outerGain(); } |
114 void setConeOuterGain(double angle) { m_coneEffect.setOuterGain(angle); } | 114 void setConeOuterGain(double); |
| 115 |
| 116 void markPannerAsDirty(unsigned); |
115 | 117 |
116 // It must be called on audio thread, currently called only process() in Aud
ioBufferSourceNode. | 118 // It must be called on audio thread, currently called only process() in Aud
ioBufferSourceNode. |
117 double dopplerRate(); | 119 double dopplerRate(); |
118 | 120 |
119 virtual double tailTime() const OVERRIDE { return m_panner ? m_panner->tailT
ime() : 0; } | 121 virtual double tailTime() const OVERRIDE { return m_panner ? m_panner->tailT
ime() : 0; } |
120 virtual double latencyTime() const OVERRIDE { return m_panner ? m_panner->la
tencyTime() : 0; } | 122 virtual double latencyTime() const OVERRIDE { return m_panner ? m_panner->la
tencyTime() : 0; } |
121 | 123 |
122 private: | 124 private: |
123 PannerNode(AudioContext*, float sampleRate); | 125 PannerNode(AudioContext*, float sampleRate); |
124 | 126 |
| 127 // AudioContext's listener |
| 128 AudioListener* listener(); |
| 129 |
125 bool setPanningModel(unsigned); // Returns true on success. | 130 bool setPanningModel(unsigned); // Returns true on success. |
126 bool setDistanceModel(unsigned); // Returns true on success. | 131 bool setDistanceModel(unsigned); // Returns true on success. |
| 132 |
127 void calculateAzimuthElevation(double* outAzimuth, double* outElevation); | 133 void calculateAzimuthElevation(double* outAzimuth, double* outElevation); |
128 // Returns the combined distance and cone gain attenuation. | 134 float calculateDistanceConeGain(); // Returns the combined distance and cone
gain attenuation. |
129 float calculateDistanceConeGain(); | |
130 double calculateDopplerRate(); | 135 double calculateDopplerRate(); |
131 | 136 |
132 void azimuthElevation(double* outAzimuth, double* outElevation); | 137 void azimuthElevation(double* outAzimuth, double* outElevation); |
133 float distanceConeGain(); | 138 float distanceConeGain(); |
134 | 139 |
135 bool isAzimuthElevationDirty(); | 140 bool isAzimuthElevationDirty() const { return m_isAzimuthElevationDirty; } |
136 bool isDistanceConeGainDirty(); | 141 bool isDistanceConeGainDirty() const { return m_isDistanceConeGainDirty; } |
137 bool isDopplerRateDirty(); | 142 bool isDopplerRateDirty() const { return m_isDopplerRateDirty; } |
138 | 143 |
139 // Notifies any AudioBufferSourceNodes connected to us either directly or in
directly about our existence. | 144 // Notifies any AudioBufferSourceNodes connected to us either directly or in
directly about our existence. |
140 // This is in order to handle the pitch change necessary for the doppler shi
ft. | 145 // This is in order to handle the pitch change necessary for the doppler shi
ft. |
141 void notifyAudioSourcesConnectedToNode(AudioNode*, HashMap<AudioNode*, bool>
&visitedNodes); | 146 void notifyAudioSourcesConnectedToNode(AudioNode*, HashMap<AudioNode*, bool>
&visitedNodes); |
142 | 147 |
143 void updateCachedListener(); | |
144 void updateCachedSourceLocationInfo(); | |
145 | |
146 OwnPtr<Panner> m_panner; | 148 OwnPtr<Panner> m_panner; |
147 unsigned m_panningModel; | 149 unsigned m_panningModel; |
148 unsigned m_distanceModel; | 150 unsigned m_distanceModel; |
149 | 151 |
150 // Current source location information | 152 // Current source location information |
151 FloatPoint3D m_position; | 153 FloatPoint3D m_position; |
152 FloatPoint3D m_orientation; | 154 FloatPoint3D m_orientation; |
153 FloatPoint3D m_velocity; | 155 FloatPoint3D m_velocity; |
154 | 156 |
155 // Cached source location information | 157 bool m_isAzimuthElevationDirty; |
156 FloatPoint3D m_cachedPosition; | 158 bool m_isDistanceConeGainDirty; |
157 FloatPoint3D m_cachedOrientation; | 159 bool m_isDopplerRateDirty; |
158 FloatPoint3D m_cachedVelocity; | |
159 | 160 |
160 // Gain | 161 // Gain |
161 DistanceEffect m_distanceEffect; | 162 DistanceEffect m_distanceEffect; |
162 ConeEffect m_coneEffect; | 163 ConeEffect m_coneEffect; |
163 float m_lastGain; | 164 float m_lastGain; |
164 | 165 |
| 166 // Cached values |
165 double m_cachedAzimuth; | 167 double m_cachedAzimuth; |
166 double m_cachedElevation; | 168 double m_cachedElevation; |
167 float m_cachedDistanceConeGain; | 169 float m_cachedDistanceConeGain; |
168 double m_cachedDopplerRate; | 170 double m_cachedDopplerRate; |
169 | 171 |
170 // Cached listener parameters after processing. | |
171 RefPtr<AudioListener> m_cachedListener; | |
172 | |
173 RefPtr<HRTFDatabaseLoader> m_hrtfDatabaseLoader; | 172 RefPtr<HRTFDatabaseLoader> m_hrtfDatabaseLoader; |
174 | 173 |
175 // AudioContext's connection count | 174 // AudioContext's connection count |
176 unsigned m_connectionCount; | 175 unsigned m_connectionCount; |
177 | 176 |
178 // Synchronize process() with setting of the panning model, distance model a
nd caching of the source location/orientation info. | 177 // Synchronize process() with setting of the panning model, source's locatio
n information, listener, distance parameters and sound cones. |
179 mutable Mutex m_processLock; | 178 mutable Mutex m_processLock; |
180 }; | 179 }; |
181 | 180 |
182 } // namespace WebCore | 181 } // namespace WebCore |
183 | 182 |
184 #endif // PannerNode_h | 183 #endif // PannerNode_h |
OLD | NEW |