Chromium Code Reviews| 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 11 matching lines...) Expand all Loading... | |
| 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 #include "config.h" | 25 #include "config.h" |
| 26 | 26 |
| 27 #if ENABLE(WEB_AUDIO) | 27 #if ENABLE(WEB_AUDIO) |
| 28 | 28 |
| 29 #include "modules/webaudio/PannerNode.h" | 29 #include "modules/webaudio/PannerNode.h" |
| 30 | 30 |
| 31 #include "core/dom/ExecutionContext.h" | 31 #include "core/dom/ExecutionContext.h" |
| 32 #include "platform/audio/HRTFDatabaseLoader.h" | |
| 32 #include "platform/audio/HRTFPanner.h" | 33 #include "platform/audio/HRTFPanner.h" |
| 33 #include "modules/webaudio/AudioBufferSourceNode.h" | 34 #include "modules/webaudio/AudioBufferSourceNode.h" |
| 34 #include "modules/webaudio/AudioContext.h" | 35 #include "modules/webaudio/AudioContext.h" |
| 35 #include "modules/webaudio/AudioNodeInput.h" | 36 #include "modules/webaudio/AudioNodeInput.h" |
| 36 #include "modules/webaudio/AudioNodeOutput.h" | 37 #include "modules/webaudio/AudioNodeOutput.h" |
| 37 #include "wtf/MathExtras.h" | 38 #include "wtf/MathExtras.h" |
| 38 | 39 |
| 39 namespace WebCore { | 40 namespace WebCore { |
| 40 | 41 |
| 41 static void fixNANs(double &x) | 42 static void fixNANs(double &x) |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 56 , m_isDopplerRateDirty(true) | 57 , m_isDopplerRateDirty(true) |
| 57 , m_lastGain(-1.0) | 58 , m_lastGain(-1.0) |
| 58 , m_cachedAzimuth(0) | 59 , m_cachedAzimuth(0) |
| 59 , m_cachedElevation(0) | 60 , m_cachedElevation(0) |
| 60 , m_cachedDistanceConeGain(1.0f) | 61 , m_cachedDistanceConeGain(1.0f) |
| 61 , m_cachedDopplerRate(1) | 62 , m_cachedDopplerRate(1) |
| 62 , m_connectionCount(0) | 63 , m_connectionCount(0) |
| 63 { | 64 { |
| 64 // Load the HRTF database asynchronously so we don't block the Javascript th read while creating the HRTF database. | 65 // Load the HRTF database asynchronously so we don't block the Javascript th read while creating the HRTF database. |
| 65 // The HRTF panner will return zeroes until the database is loaded. | 66 // The HRTF panner will return zeroes until the database is loaded. |
| 66 m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNece ssary(context->sampleRate()); | 67 listener()->createAndLoadHRTFDatabaseLoader(context->sampleRate()); |
| 67 | 68 |
| 68 ScriptWrappable::init(this); | 69 ScriptWrappable::init(this); |
| 69 addInput(); | 70 addInput(); |
| 70 addOutput(AudioNodeOutput::create(this, 2)); | 71 addOutput(AudioNodeOutput::create(this, 2)); |
| 71 | 72 |
| 72 // Node-specific default mixing rules. | 73 // Node-specific default mixing rules. |
| 73 m_channelCount = 2; | 74 m_channelCount = 2; |
| 74 m_channelCountMode = ClampedMax; | 75 m_channelCountMode = ClampedMax; |
| 75 m_channelInterpretation = AudioBus::Speakers; | 76 m_channelInterpretation = AudioBus::Speakers; |
| 76 | 77 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 116 destination->zero(); | 117 destination->zero(); |
| 117 return; | 118 return; |
| 118 } | 119 } |
| 119 | 120 |
| 120 // The audio thread can't block on this lock, so we call tryLock() instead. | 121 // The audio thread can't block on this lock, so we call tryLock() instead. |
| 121 MutexTryLocker tryLocker(m_processLock); | 122 MutexTryLocker tryLocker(m_processLock); |
| 122 MutexTryLocker tryListenerLocker(listener()->listenerLock()); | 123 MutexTryLocker tryListenerLocker(listener()->listenerLock()); |
| 123 | 124 |
| 124 if (tryLocker.locked() && tryListenerLocker.locked()) { | 125 if (tryLocker.locked() && tryListenerLocker.locked()) { |
| 125 // HRTFDatabase should be loaded before proceeding for offline audio con text when the panning model is HRTF. | 126 // HRTFDatabase should be loaded before proceeding for offline audio con text when the panning model is HRTF. |
| 126 if (m_panningModel == Panner::PanningModelHRTF && !m_hrtfDatabaseLoader- >isLoaded()) { | 127 if (m_panningModel == Panner::PanningModelHRTF && !hrtfDatabaseLoader()- >isLoaded()) { |
|
Raymond Toy
2014/07/17 17:25:45
Since the HRTF database is loaded in the listener,
| |
| 127 if (context()->isOfflineContext()) { | 128 if (context()->isOfflineContext()) { |
| 128 m_hrtfDatabaseLoader->waitForLoaderThreadCompletion(); | 129 hrtfDatabaseLoader()->waitForLoaderThreadCompletion(); |
|
Raymond Toy
2014/07/17 17:25:46
Same as above. Maybe use listener()->waitForHRTFL
| |
| 129 } else { | 130 } else { |
| 130 destination->zero(); | 131 destination->zero(); |
| 131 return; | 132 return; |
| 132 } | 133 } |
| 133 } | 134 } |
| 134 | 135 |
| 135 // Apply the panning effect. | 136 // Apply the panning effect. |
| 136 double azimuth; | 137 double azimuth; |
| 137 double elevation; | 138 double elevation; |
| 138 azimuthElevation(&azimuth, &elevation); | 139 azimuthElevation(&azimuth, &elevation); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 153 // We must be in the middle of changing the properties of the panner or the listener. | 154 // We must be in the middle of changing the properties of the panner or the listener. |
| 154 destination->zero(); | 155 destination->zero(); |
| 155 } | 156 } |
| 156 } | 157 } |
| 157 | 158 |
| 158 void PannerNode::initialize() | 159 void PannerNode::initialize() |
| 159 { | 160 { |
| 160 if (isInitialized()) | 161 if (isInitialized()) |
| 161 return; | 162 return; |
| 162 | 163 |
| 163 m_panner = Panner::create(m_panningModel, sampleRate(), m_hrtfDatabaseLoader .get()); | 164 m_panner = Panner::create(m_panningModel, sampleRate(), hrtfDatabaseLoader() ); |
| 164 listener()->addPanner(this); | 165 listener()->addPanner(this); |
| 165 | 166 |
| 166 AudioNode::initialize(); | 167 AudioNode::initialize(); |
| 167 } | 168 } |
| 168 | 169 |
| 169 void PannerNode::uninitialize() | 170 void PannerNode::uninitialize() |
| 170 { | 171 { |
| 171 if (!isInitialized()) | 172 if (!isInitialized()) |
| 172 return; | 173 return; |
| 173 | 174 |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 204 } | 205 } |
| 205 | 206 |
| 206 bool PannerNode::setPanningModel(unsigned model) | 207 bool PannerNode::setPanningModel(unsigned model) |
| 207 { | 208 { |
| 208 switch (model) { | 209 switch (model) { |
| 209 case Panner::PanningModelEqualPower: | 210 case Panner::PanningModelEqualPower: |
| 210 case Panner::PanningModelHRTF: | 211 case Panner::PanningModelHRTF: |
| 211 if (!m_panner.get() || model != m_panningModel) { | 212 if (!m_panner.get() || model != m_panningModel) { |
| 212 // This synchronizes with process(). | 213 // This synchronizes with process(). |
| 213 MutexLocker processLocker(m_processLock); | 214 MutexLocker processLocker(m_processLock); |
| 214 OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), m_hrt fDatabaseLoader.get()); | 215 OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), hrtfD atabaseLoader()); |
| 215 m_panner = newPanner.release(); | 216 m_panner = newPanner.release(); |
| 216 m_panningModel = model; | 217 m_panningModel = model; |
| 217 } | 218 } |
| 218 break; | 219 break; |
| 219 default: | 220 default: |
| 220 ASSERT_NOT_REACHED(); | 221 ASSERT_NOT_REACHED(); |
| 221 return false; | 222 return false; |
| 222 } | 223 } |
| 223 | 224 |
| 224 return true; | 225 return true; |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 571 notifyAudioSourcesConnectedToNode(connectedNode, visitedNode s); // recurse | 572 notifyAudioSourcesConnectedToNode(connectedNode, visitedNode s); // recurse |
| 572 } | 573 } |
| 573 } | 574 } |
| 574 } | 575 } |
| 575 } | 576 } |
| 576 } | 577 } |
| 577 | 578 |
| 578 } // namespace WebCore | 579 } // namespace WebCore |
| 579 | 580 |
| 580 #endif // ENABLE(WEB_AUDIO) | 581 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |