/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef AudioContext_h_ #define AudioContext_h_ #include "nsWrapperCache.h" #include "nsCycleCollectionParticipant.h" #include "mozilla/Attributes.h" #include "nsCOMPtr.h" #include "EnableWebAudioCheck.h" #include "nsAutoPtr.h" #include "mozilla/dom/TypedArray.h" #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/AudioContextBinding.h" #include "MediaBufferDecoder.h" #include "StreamBuffer.h" #include "MediaStreamGraph.h" #include "nsIDOMWindow.h" // X11 has a #define for CurrentTime. Unbelievable :-(. // See content/media/DOMMediaStream.h for more fun! #ifdef CurrentTime #undef CurrentTime #endif struct JSContext; class JSObject; class nsIDOMWindow; namespace mozilla { class ErrorResult; struct WebAudioDecodeJob; namespace dom { class AudioBuffer; class AudioBufferSourceNode; class AudioDestinationNode; class AudioListener; class BiquadFilterNode; class DelayNode; class DynamicsCompressorNode; class GainNode; class GlobalObject; class PannerNode; class AudioContext MOZ_FINAL : public nsWrapperCache, public EnableWebAudioCheck { explicit AudioContext(nsIDOMWindow* aParentWindow); ~AudioContext(); public: NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioContext) NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioContext) nsIDOMWindow* GetParentObject() const { return mWindow; } void Shutdown() { Suspend(); mDecoder.Shutdown(); } void Suspend(); void Resume(); virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope) MOZ_OVERRIDE; static already_AddRefed Constructor(const GlobalObject& aGlobal, ErrorResult& aRv); AudioDestinationNode* Destination() const { return mDestination; } float SampleRate() const { return float(IdealAudioRate()); } double CurrentTime() const; AudioListener* Listener(); already_AddRefed CreateBufferSource(); already_AddRefed CreateBuffer(JSContext* aJSContext, uint32_t aNumberOfChannels, uint32_t aLength, float aSampleRate, ErrorResult& aRv); already_AddRefed CreateGain(); already_AddRefed CreateDelay(double aMaxDelayTime, ErrorResult& aRv); already_AddRefed CreatePanner(); already_AddRefed CreateDynamicsCompressor(); already_AddRefed CreateBiquadFilter(); void DecodeAudioData(const ArrayBuffer& aBuffer, DecodeSuccessCallback& aSuccessCallback, const Optional >& aFailureCallback); uint32_t GetRate() const { return IdealAudioRate(); } MediaStreamGraph* Graph() const; MediaStream* DestinationStream() const; private: void RemoveFromDecodeQueue(WebAudioDecodeJob* aDecodeJob); friend struct ::mozilla::WebAudioDecodeJob; private: nsCOMPtr mWindow; nsRefPtr mDestination; nsRefPtr mListener; MediaBufferDecoder mDecoder; nsTArray > mDecodeJobs; }; } } #endif