author | Ehsan Akhgari <ehsan@mozilla.com> |
Wed, 31 Oct 2012 15:09:32 -0400 | |
changeset 112047 | 3846f808069895fe5e41e468affe0a9cd0ef5a42 |
parent 112046 | ef4e2c69f73e6c31ef451a5ced3375620c86941d |
child 112048 | 75f27b51f66aed6fb45d31a4aeb62d35282363b2 |
push id | 23790 |
push user | ryanvm@gmail.com |
push date | Fri, 02 Nov 2012 01:26:40 +0000 |
treeherder | mozilla-central@556b9cfb269f [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bzbarsky |
bugs | 807526 |
milestone | 19.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/content/media/webaudio/AudioContext.cpp +++ b/content/media/webaudio/AudioContext.cpp @@ -7,16 +7,17 @@ #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" namespace mozilla { namespace dom { NS_IMPL_CYCLE_COLLECTION_CLASS(AudioContext) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_NATIVE(AudioContext) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mWindow) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDestination) @@ -81,11 +82,18 @@ AudioContext::CreateBuffer(JSContext* aJ nsRefPtr<AudioBuffer> 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<GainNode> +AudioContext::CreateGain() +{ + nsRefPtr<GainNode> gainNode = new GainNode(this); + return gainNode.forget(); +} + } }
--- a/content/media/webaudio/AudioContext.h +++ b/content/media/webaudio/AudioContext.h @@ -21,16 +21,17 @@ namespace mozilla { class ErrorResult; namespace dom { class AudioDestinationNode; class AudioBufferSourceNode; class AudioBuffer; +class GainNode; class AudioContext MOZ_FINAL : public nsWrapperCache, public EnableWebAudioCheck { explicit AudioContext(nsIDOMWindow* aParentWindow); public: virtual ~AudioContext(); @@ -56,16 +57,19 @@ public: already_AddRefed<AudioBufferSourceNode> CreateBufferSource(); already_AddRefed<AudioBuffer> CreateBuffer(JSContext* aJSContext, uint32_t aNumberOfChannels, uint32_t aLength, float aSampleRate, ErrorResult& aRv); + already_AddRefed<GainNode> + CreateGain(); + private: nsCOMPtr<nsIDOMWindow> mWindow; nsRefPtr<AudioDestinationNode> mDestination; }; } }
new file mode 100644 --- /dev/null +++ b/content/media/webaudio/GainNode.cpp @@ -0,0 +1,42 @@ +/* -*- 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 "GainNode.h" +#include "mozilla/dom/GainNodeBinding.h" + +namespace mozilla { +namespace dom { + +NS_IMPL_CYCLE_COLLECTION_CLASS(GainNode) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(GainNode, AudioNode) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mGain) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(GainNode, AudioNode) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR(tmp->mGain, AudioParam, "gain value") +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(GainNode) +NS_INTERFACE_MAP_END_INHERITING(AudioNode) + +NS_IMPL_ADDREF_INHERITED(GainNode, AudioNode) +NS_IMPL_RELEASE_INHERITED(GainNode, AudioNode) + +GainNode::GainNode(AudioContext* aContext) + : AudioNode(aContext) + , mGain(new AudioParam(aContext, 1.0f, 0.0f, 1.0f)) +{ +} + +JSObject* +GainNode::WrapObject(JSContext* aCx, JSObject* aScope, + bool* aTriedToWrap) +{ + return GainNodeBinding::Wrap(aCx, aScope, this, aTriedToWrap); +} + +} +} +
new file mode 100644 --- /dev/null +++ b/content/media/webaudio/GainNode.h @@ -0,0 +1,51 @@ +/* -*- 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 GainNode_h_ +#define GainNode_h_ + +#include "AudioNode.h" +#include "AudioParam.h" + +namespace mozilla { +namespace dom { + +class AudioContext; + +class GainNode : public AudioNode +{ +public: + explicit GainNode(AudioContext* aContext); + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(GainNode, AudioNode) + + virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope, + bool* aTriedToWrap); + + virtual uint32_t MaxNumberOfInputs() const MOZ_FINAL MOZ_OVERRIDE + { + return 1; + } + virtual uint32_t MaxNumberOfOutputs() const MOZ_FINAL MOZ_OVERRIDE + { + return 1; + } + + AudioParam* Gain() const + { + return mGain; + } + +private: + nsRefPtr<AudioParam> mGain; +}; + +} +} + +#endif +
--- a/content/media/webaudio/Makefile.in +++ b/content/media/webaudio/Makefile.in @@ -18,26 +18,28 @@ CPPSRCS := \ AudioBuffer.cpp \ AudioBufferSourceNode.cpp \ AudioContext.cpp \ AudioDestinationNode.cpp \ AudioNode.cpp \ AudioParam.cpp \ AudioSourceNode.cpp \ EnableWebAudioCheck.cpp \ + GainNode.cpp \ $(NULL) EXPORTS_NAMESPACES := mozilla/dom EXPORTS_mozilla/dom := \ AudioBuffer.h \ AudioBufferSourceNode.h \ AudioDestinationNode.h \ AudioNode.h \ AudioParam.h \ AudioSourceNode.h \ + GainNode.h \ $(NULL) PARALLEL_DIRS := test ifdef ENABLE_TESTS TOOL_DIRS += compiledtest endif
--- a/content/media/webaudio/test/Makefile.in +++ b/content/media/webaudio/test/Makefile.in @@ -9,12 +9,13 @@ VPATH := @srcdir@ relativesrcdir := @relativesrcdir@ include $(DEPTH)/config/autoconf.mk MOCHITEST_FILES := \ test_AudioBuffer.html \ test_AudioContext.html \ test_badConnect.html \ + test_gainNode.html \ test_singleSourceDest.html \ $(NULL) include $(topsrcdir)/config/rules.mk
new file mode 100644 --- /dev/null +++ b/content/media/webaudio/test/test_gainNode.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test GainNode</title> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> +<pre id="test"> +<script class="testbody" type="text/javascript"> + +SimpleTest.waitForExplicitFinish(); +addLoadEvent(function() { + SpecialPowers.setBoolPref("media.webaudio.enabled", true); + + var context = new mozAudioContext(); + var buffer = context.createBuffer(1, 2048, 44100); + for (var i = 0; i < 2048; ++i) { + buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / 44100); + } + + var destination = context.destination; + + var source = context.createBufferSource(); + + var gain = context.createGain(); + + source.buffer = buffer; + + source.connect(gain); + gain.connect(destination); + + ok(gain.gain, "The audioparam member must exist"); + is(gain.gain.value, 1.0, "Correct initial value"); + is(gain.gain.defaultValue, 1.0, "Correct default value"); + is(gain.gain.minValue, 0, "Correct min value"); + is(gain.gain.maxValue, 1.0, "Correct max value"); + gain.gain.value = 0.5; + is(gain.gain.value, 0.5, "Correct initial value"); + is(gain.gain.defaultValue, 1.0, "Correct default value"); + is(gain.gain.minValue, 0, "Correct min value"); + is(gain.gain.maxValue, 1.0, "Correct max value"); + + source.start(0); + SimpleTest.executeSoon(function() { + source.stop(0); + source.disconnect(); + gain.disconnect(); + + SpecialPowers.clearUserPref("media.webaudio.enabled"); + SimpleTest.finish(); + }); +}); + +</script> +</pre> +</body> +</html>
--- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -197,16 +197,21 @@ DOMInterfaces = { 'workers': True, }, 'FormData': [ { 'workers': True, }], +'GainNode': [ +{ + 'resultNotAddRefed': [ 'gain' ], +}], + 'HTMLCollection': [ { 'nativeType': 'nsIHTMLCollection', 'resultNotAddRefed': [ 'item' ] }], 'HTMLOptionsCollection': [ {
--- a/dom/webidl/AudioContext.webidl +++ b/dom/webidl/AudioContext.webidl @@ -20,12 +20,15 @@ interface mozAudioContext { // [Creator, Throws] // AudioBuffer createBuffer(ArrayBuffer buffer, boolean mixToMono); // AudioNode creation [Creator] AudioBufferSourceNode createBufferSource(); + [Creator] + GainNode createGain(); + }; typedef mozAudioContext AudioContext;
new file mode 100644 --- /dev/null +++ b/dom/webidl/GainNode.webidl @@ -0,0 +1,19 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. + * + * The origin of this IDL file is + * https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +[PrefControlled] +interface GainNode : AudioNode { + + readonly attribute AudioParam gain; + +}; +
--- a/dom/webidl/WebIDL.mk +++ b/dom/webidl/WebIDL.mk @@ -24,16 +24,17 @@ webidl_files = \ DOMTokenList.webidl \ DOMSettableTokenList.webidl \ Function.webidl \ EventHandler.webidl \ EventListener.webidl \ EventTarget.webidl \ FileList.webidl \ FileReaderSync.webidl \ + GainNode.webidl \ HTMLCollection.webidl \ HTMLOptionsCollection.webidl \ HTMLPropertiesCollection.webidl \ ImageData.webidl \ NodeList.webidl \ PaintRequestList.webidl \ Performance.webidl \ PerformanceNavigation.webidl \