Index: Source/modules/webaudio/PannerNode.cpp |
diff --git a/Source/modules/webaudio/PannerNode.cpp b/Source/modules/webaudio/PannerNode.cpp |
index 80e5099488100a0b98b6fe253d10b98f0d5688eb..5a89003317f8ea24c92c731a817fd2a1eb51c07b 100644 |
--- a/Source/modules/webaudio/PannerNode.cpp |
+++ b/Source/modules/webaudio/PannerNode.cpp |
@@ -52,6 +52,10 @@ PannerNode::PannerNode(AudioContext* context, float sampleRate) |
, m_lastGain(-1.0) |
, m_connectionCount(0) |
{ |
+ // Load the HRTF database asynchronously so we don't block the Javascript thread while creating the HRTF database. |
+ // The HRTF panner will return zeroes until the database is loaded. |
+ m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(context->sampleRate()); |
+ |
ScriptWrappable::init(this); |
addInput(adoptPtr(new AudioNodeInput(this))); |
addOutput(adoptPtr(new AudioNodeOutput(this, 2))); |
@@ -106,12 +110,21 @@ void PannerNode::process(size_t framesToProcess) |
} |
AudioBus* source = input(0)->bus(); |
- |
if (!source) { |
destination->zero(); |
return; |
} |
+ // HRTFDatabase should be loaded before proceeding for offline audio context when panningModel() is "HRTF". |
+ if (panningModel() == "HRTF" && !m_hrtfDatabaseLoader->isLoaded()) { |
+ if (context()->isOfflineContext()) { |
+ m_hrtfDatabaseLoader->waitForLoaderThreadCompletion(); |
+ } else { |
+ destination->zero(); |
+ return; |
+ } |
+ } |
+ |
// The audio thread can't block on this lock, so we call tryLock() instead. |
MutexTryLocker tryLocker(m_pannerLock); |
if (tryLocker.locked()) { |
@@ -141,7 +154,7 @@ void PannerNode::initialize() |
if (isInitialized()) |
return; |
- m_panner = Panner::create(m_panningModel, sampleRate(), context()->hrtfDatabaseLoader()); |
+ m_panner = Panner::create(m_panningModel, sampleRate(), m_hrtfDatabaseLoader.get()); |
AudioNode::initialize(); |
} |
@@ -196,7 +209,7 @@ bool PannerNode::setPanningModel(unsigned model) |
// This synchronizes with process(). |
MutexLocker processLocker(m_pannerLock); |
- OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), context()->hrtfDatabaseLoader()); |
+ OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), m_hrtfDatabaseLoader.get()); |
m_panner = newPanner.release(); |
m_panningModel = model; |
} |