Bug 1241499 - Initialize the HRTF database lazily. r?karlt draft
authorPaul Adenot <paul@paul.cx>
Thu, 21 Jan 2016 16:15:57 +0100
changeset 323919 974a82333fd000852c5f67bfef94eed3b4887e89
parent 323526 6764bc656c1d146962d53710d734c2ac87c2306f
child 513294 bd958ce6114deb9c6e347ceef848019de00a3e76
push id9808
push userpaul@paul.cx
push dateThu, 21 Jan 2016 15:17:51 +0000
reviewerskarlt
bugs1241499
milestone46.0a1
Bug 1241499 - Initialize the HRTF database lazily. r?karlt
dom/media/webaudio/PannerNode.cpp
dom/media/webaudio/PannerNode.h
--- a/dom/media/webaudio/PannerNode.cpp
+++ b/dom/media/webaudio/PannerNode.cpp
@@ -57,20 +57,28 @@ public:
     , mConeOuterAngle(360.)
     , mConeOuterGain(0.)
     // These will be initialized when a PannerNode is created, so just initialize them
     // to some dummy values here.
     , mListenerDopplerFactor(0.)
     , mListenerSpeedOfSound(0.)
     , mLeftOverData(INT_MIN)
   {
+  }
+
+  void InitializeHRTFDatabase()
+  {
+    MOZ_ASSERT(NS_IsMainThread());
+    if (mHRTFPanner) {
+      return;
+    }
     // HRTFDatabaseLoader needs to be fetched on the main thread.
     already_AddRefed<HRTFDatabaseLoader> loader =
-      HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(aNode->Context()->SampleRate());
-    mHRTFPanner = new HRTFPanner(aNode->Context()->SampleRate(), Move(loader));
+      HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(NodeMainThread()->Context()->SampleRate());
+    mHRTFPanner = new HRTFPanner(NodeMainThread()->Context()->SampleRate(), Move(loader));
   }
 
   void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
   {
     switch (aIndex) {
     case PannerNode::PANNING_MODEL:
       switch (PanningModelType(aParam)) {
         case PanningModelType::Equalpower:
@@ -256,16 +264,27 @@ PannerNode::PannerNode(AudioContext* aCo
 
 PannerNode::~PannerNode()
 {
   if (Context()) {
     Context()->UnregisterPannerNode(this);
   }
 }
 
+void PannerNode::SetPanningModel(PanningModelType aPanningModel)
+{
+  mPanningModel = aPanningModel;
+  if (mPanningModel == PanningModelType::HRTF) {
+    // We can directly call in the engine here, because it will not touch
+    // mHRTFPanner until it receives the parameter below via a control message.
+    static_cast<PannerNodeEngine*>(mStream->Engine())->InitializeHRTFDatabase();
+  }
+  SendInt32ParameterToStream(PANNING_MODEL, int32_t(mPanningModel));
+}
+
 size_t
 PannerNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
 {
   size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
   amount += mSources.ShallowSizeOfExcludingThis(aMallocSizeOf);
   return amount;
 }
 
--- a/dom/media/webaudio/PannerNode.h
+++ b/dom/media/webaudio/PannerNode.h
@@ -51,21 +51,17 @@ public:
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PannerNode, AudioNode)
 
   PanningModelType PanningModel() const
   {
     return mPanningModel;
   }
-  void SetPanningModel(PanningModelType aPanningModel)
-  {
-    mPanningModel = aPanningModel;
-    SendInt32ParameterToStream(PANNING_MODEL, int32_t(mPanningModel));
-  }
+  void SetPanningModel(PanningModelType aPanningModel);
 
   DistanceModelType DistanceModel() const
   {
     return mDistanceModel;
   }
   void SetDistanceModel(DistanceModelType aDistanceModel)
   {
     mDistanceModel = aDistanceModel;