/* -*- 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/. */ #include "AudioContext.h" #include "nsContentUtils.h" #include "nsIDOMWindow.h" #include "mozilla/ErrorResult.h" #include "mozilla/dom/AudioContextBinding.h" #include "AudioDestinationNode.h" #include "AudioBufferSourceNode.h" #include "AudioBuffer.h" #include "GainNode.h" #include "DelayNode.h" #include "PannerNode.h" #include "AudioListener.h" #include "DynamicsCompressorNode.h" #include "BiquadFilterNode.h" namespace mozilla { namespace dom { NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_3(AudioContext, mWindow, mDestination, mListener) NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioContext, AddRef) NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioContext, Release) AudioContext::AudioContext(nsIDOMWindow* aWindow) : mWindow(aWindow) , mDestination(new AudioDestinationNode(this)) , mSampleRate(44100) // hard-code for now { SetIsDOMBinding(); } AudioContext::~AudioContext() { } JSObject* AudioContext::WrapObject(JSContext* aCx, JSObject* aScope, bool* aTriedToWrap) { return mozAudioContextBinding::Wrap(aCx, aScope, this, aTriedToWrap); } /* static */ already_AddRefed AudioContext::Constructor(nsISupports* aGlobal, ErrorResult& aRv) { nsCOMPtr window = do_QueryInterface(aGlobal); if (!window) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } AudioContext* object = new AudioContext(window); NS_ADDREF(object); window->AddAudioContext(object); return object; } already_AddRefed AudioContext::CreateBufferSource() { nsRefPtr bufferNode = new AudioBufferSourceNode(this); return bufferNode.forget(); } already_AddRefed AudioContext::CreateBuffer(JSContext* aJSContext, uint32_t aNumberOfChannels, uint32_t aLength, float aSampleRate, ErrorResult& aRv) { nsRefPtr buffer = new AudioBuffer(this, aLength, aSampleRate); if (!buffer->InitializeBuffers(aNumberOfChannels, aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } return buffer.forget(); } already_AddRefed AudioContext::CreateGain() { nsRefPtr gainNode = new GainNode(this); return gainNode.forget(); } already_AddRefed AudioContext::CreateDelay(double aMaxDelayTime, ErrorResult& aRv) { if (aMaxDelayTime > 0. && aMaxDelayTime < 3.) { nsRefPtr delayNode = new DelayNode(this, aMaxDelayTime); return delayNode.forget(); } aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return nullptr; } already_AddRefed AudioContext::CreatePanner() { nsRefPtr pannerNode = new PannerNode(this); return pannerNode.forget(); } already_AddRefed AudioContext::CreateDynamicsCompressor() { nsRefPtr compressorNode = new DynamicsCompressorNode(this); return compressorNode.forget(); } already_AddRefed AudioContext::CreateBiquadFilter() { nsRefPtr filterNode = new BiquadFilterNode(this); return filterNode.forget(); } AudioListener* AudioContext::Listener() { if (!mListener) { mListener = new AudioListener(this); } return mListener; } } }