Bug 1241499 - Initialize the HRTF database lazily. r?karlt
--- 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;