Bug 1387454 - Set sample rate in AudioContext constructor. r?padenot draft
authorAlex Chronopoulos <achronop@gmail.com>
Tue, 03 Apr 2018 20:02:15 +0300
changeset 777839 31136a73715b50ac52f17f04f1ddb6964ced5e1f
parent 777838 4fb56a2b615c996aae7ca0480fba2ba5c124b3dc
child 777840 57661adaccc2605a1775978578999f9c613b9e38
push id105302
push userachronop@gmail.com
push dateThu, 05 Apr 2018 11:36:40 +0000
reviewerspadenot
bugs1387454
milestone61.0a1
Bug 1387454 - Set sample rate in AudioContext constructor. r?padenot MozReview-Commit-ID: 9uQLotrF86k
dom/media/webaudio/AudioContext.cpp
dom/media/webaudio/AudioContext.h
--- a/dom/media/webaudio/AudioContext.cpp
+++ b/dom/media/webaudio/AudioContext.cpp
@@ -115,17 +115,17 @@ NS_IMPL_ADDREF_INHERITED(AudioContext, D
 NS_IMPL_RELEASE_INHERITED(AudioContext, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AudioContext)
   NS_INTERFACE_MAP_ENTRY(nsIMemoryReporter)
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 static float GetSampleRateForAudioContext(bool aIsOffline, float aSampleRate)
 {
-  if (aIsOffline) {
+  if (aIsOffline || aSampleRate != 0.0) {
     return aSampleRate;
   } else {
     return static_cast<float>(CubebUtils::PreferredSampleRate());
   }
 }
 
 AudioContext::AudioContext(nsPIDOMWindowInner* aWindow,
                            bool aIsOffline,
@@ -192,28 +192,37 @@ AudioContext::WrapObject(JSContext* aCx,
     return OfflineAudioContextBinding::Wrap(aCx, this, aGivenProto);
   } else {
     return AudioContextBinding::Wrap(aCx, this, aGivenProto);
   }
 }
 
 /* static */ already_AddRefed<AudioContext>
 AudioContext::Constructor(const GlobalObject& aGlobal,
+                          const AudioContextOptions& aOptions,
                           ErrorResult& aRv)
 {
   nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
   if (!window) {
     aRv.Throw(NS_ERROR_FAILURE);
     return nullptr;
   }
 
+  if (aOptions.mSampleRate > 0 &&
+      (aOptions.mSampleRate - WebAudioUtils::MinSampleRate < 0.0 ||
+      WebAudioUtils::MaxSampleRate - aOptions.mSampleRate < 0.0)) {
+    aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+    return nullptr;
+  }
+
   uint32_t maxChannelCount = std::min<uint32_t>(WebAudioUtils::MaxChannelCount,
       CubebUtils::MaxNumberOfChannels());
   RefPtr<AudioContext> object =
-    new AudioContext(window, false,maxChannelCount);
+    new AudioContext(window, false, maxChannelCount,
+                     0, aOptions.mSampleRate);
   aRv = object->Init();
   if (NS_WARN_IF(aRv.Failed())) {
      return nullptr;
   }
 
   RegisterWeakMemoryReporter(object);
 
   return object.forget();
--- a/dom/media/webaudio/AudioContext.h
+++ b/dom/media/webaudio/AudioContext.h
@@ -111,16 +111,17 @@ public:
 private:
   RefPtr<AudioContext> mAudioContext;
   void* mPromise;
   RefPtr<AudioNodeStream> mAudioNodeStream;
   AudioContextState mNewState;
 };
 
 enum class AudioContextOperation { Suspend, Resume, Close };
+struct AudioContextOptions;
 
 class AudioContext final : public DOMEventTargetHelper,
                            public nsIMemoryReporter,
                            public RelativeTimeline
 {
   AudioContext(nsPIDOMWindowInner* aParentWindow,
                bool aIsOffline,
                uint32_t aNumberOfChannels = 0,
@@ -148,17 +149,19 @@ public:
   void Shutdown(); // idempotent
 
   JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 
   using DOMEventTargetHelper::DispatchTrustedEvent;
 
   // Constructor for regular AudioContext
   static already_AddRefed<AudioContext>
-  Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+  Constructor(const GlobalObject& aGlobal,
+              const AudioContextOptions& aOptions,
+              ErrorResult& aRv);
 
   // Constructor for offline AudioContext with options object
   static already_AddRefed<AudioContext>
   Constructor(const GlobalObject& aGlobal,
               const OfflineAudioContextOptions& aOptions,
               ErrorResult& aRv);
 
   // Constructor for offline AudioContext