content/media/webaudio/AudioListener.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #include "AudioListener.h"
     8 #include "AudioContext.h"
     9 #include "mozilla/dom/AudioListenerBinding.h"
    11 namespace mozilla {
    12 namespace dom {
    14 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(AudioListener, mContext)
    16 NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioListener, AddRef)
    17 NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioListener, Release)
    19 AudioListener::AudioListener(AudioContext* aContext)
    20   : mContext(aContext)
    21   , mPosition()
    22   , mFrontVector(0., 0., -1.)
    23   , mRightVector(1., 0., 0.)
    24   , mVelocity()
    25   , mDopplerFactor(1.)
    26   , mSpeedOfSound(343.3) // meters/second
    27 {
    28   MOZ_ASSERT(aContext);
    29   SetIsDOMBinding();
    30 }
    32 JSObject*
    33 AudioListener::WrapObject(JSContext* aCx)
    34 {
    35   return AudioListenerBinding::Wrap(aCx, this);
    36 }
    38 void
    39 AudioListener::SetOrientation(double aX, double aY, double aZ,
    40                               double aXUp, double aYUp, double aZUp)
    41 {
    42   ThreeDPoint front(aX, aY, aZ);
    43   // The panning effect and the azimuth and elevation calculation in the Web
    44   // Audio spec becomes undefined with linearly dependent vectors, so keep
    45   // existing state in these situations.
    46   if (front.IsZero()) {
    47     return;
    48   }
    49   // Normalize before using CrossProduct() to avoid overflow.
    50   front.Normalize();
    51   ThreeDPoint up(aXUp, aYUp, aZUp);
    52   if (up.IsZero()) {
    53     return;
    54   }
    55   up.Normalize();
    56   ThreeDPoint right = front.CrossProduct(up);
    57   if (right.IsZero()) {
    58     return;
    59   }
    60   right.Normalize();
    62   if (!mFrontVector.FuzzyEqual(front)) {
    63     mFrontVector = front;
    64     SendThreeDPointParameterToStream(PannerNode::LISTENER_FRONT_VECTOR, front);
    65   }
    66   if (!mRightVector.FuzzyEqual(right)) {
    67     mRightVector = right;
    68     SendThreeDPointParameterToStream(PannerNode::LISTENER_RIGHT_VECTOR, right);
    69   }
    70 }
    72 void
    73 AudioListener::RegisterPannerNode(PannerNode* aPannerNode)
    74 {
    75   mPanners.AppendElement(aPannerNode->asWeakPtr());
    77   // Let the panner node know about our parameters
    78   aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_POSITION, mPosition);
    79   aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_FRONT_VECTOR, mFrontVector);
    80   aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_RIGHT_VECTOR, mRightVector);
    81   aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_VELOCITY, mVelocity);
    82   aPannerNode->SendDoubleParameterToStream(PannerNode::LISTENER_DOPPLER_FACTOR, mDopplerFactor);
    83   aPannerNode->SendDoubleParameterToStream(PannerNode::LISTENER_SPEED_OF_SOUND, mSpeedOfSound);
    84   UpdatePannersVelocity();
    85 }
    87 void AudioListener::UnregisterPannerNode(PannerNode* aPannerNode)
    88 {
    89   mPanners.RemoveElement(aPannerNode);
    90 }
    92 void
    93 AudioListener::SendDoubleParameterToStream(uint32_t aIndex, double aValue)
    94 {
    95   for (uint32_t i = 0; i < mPanners.Length(); ++i) {
    96     if (mPanners[i]) {
    97       mPanners[i]->SendDoubleParameterToStream(aIndex, aValue);
    98     }
    99   }
   100 }
   102 void
   103 AudioListener::SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue)
   104 {
   105   for (uint32_t i = 0; i < mPanners.Length(); ++i) {
   106     if (mPanners[i]) {
   107       mPanners[i]->SendThreeDPointParameterToStream(aIndex, aValue);
   108     }
   109   }
   110 }
   112 void AudioListener::UpdatePannersVelocity()
   113 {
   114   for (uint32_t i = 0; i < mPanners.Length(); ++i) {
   115     if (mPanners[i]) {
   116       mPanners[i]->SendDopplerToSourcesIfNeeded();
   117     }
   118   }
   119 }
   121 size_t
   122 AudioListener::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
   123 {
   124   size_t amount = aMallocSizeOf(this);
   125   // AudioNodes are tracked separately
   126   amount += mPanners.SizeOfExcludingThis(aMallocSizeOf);
   127   return amount;
   128 }
   130 }
   131 }

mercurial