Bug 865246 - Part 3: Update the BiquadFilterNode IDL to match the current spec; r=padenot

This commit is contained in:
Ehsan Akhgari 2013-04-26 17:11:23 -04:00
Родитель bfd9579893
Коммит 3163802ff4
5 изменённых файлов: 65 добавлений и 57 удалений

Просмотреть файл

@ -5,17 +5,17 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "BiquadFilterNode.h"
#include "mozilla/dom/BiquadFilterNodeBinding.h"
#include "AudioNodeEngine.h"
#include "AudioNodeStream.h"
#include "AudioDestinationNode.h"
#include "WebAudioUtils.h"
#include "blink/Biquad.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_INHERITED_3(BiquadFilterNode, AudioNode,
mFrequency, mQ, mGain)
NS_IMPL_CYCLE_COLLECTION_INHERITED_4(BiquadFilterNode, AudioNode,
mFrequency, mDetune, mQ, mGain)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BiquadFilterNode)
NS_INTERFACE_MAP_END_INHERITING(AudioNode)
@ -32,8 +32,9 @@ public:
, mDestination(static_cast<AudioNodeStream*> (aDestination->Stream()))
// Keep the default values in sync with the default values in
// BiquadFilterNode::BiquadFilterNode
, mType(BiquadTypeEnum::LOWPASS)
, mType(BiquadFilterType::Lowpass)
, mFrequency(350.f)
, mDetune(0.f)
, mQ(1.f)
, mGain(0.f)
{
@ -47,13 +48,14 @@ public:
enum Parameteres {
TYPE,
FREQUENCY,
DETUNE,
Q,
GAIN
};
void SetInt32Parameter(uint32_t aIndex, int32_t aValue) MOZ_OVERRIDE
{
switch (aIndex) {
case TYPE: mType = static_cast<BiquadTypeEnum>(aValue); break;
case TYPE: mType = static_cast<BiquadFilterType>(aValue); break;
default:
NS_ERROR("Bad BiquadFilterNode Int32Parameter");
}
@ -66,6 +68,10 @@ public:
mFrequency = aValue;
WebAudioUtils::ConvertAudioParamToTicks(mFrequency, mSource, mDestination);
break;
case DETUNE:
mDetune = aValue;
WebAudioUtils::ConvertAudioParamToTicks(mDetune, mSource, mDestination);
break;
case Q:
mQ = aValue;
WebAudioUtils::ConvertAudioParamToTicks(mQ, mSource, mDestination);
@ -91,16 +97,18 @@ public:
private:
AudioNodeStream* mSource;
AudioNodeStream* mDestination;
BiquadTypeEnum mType;
BiquadFilterType mType;
AudioParamTimeline mFrequency;
AudioParamTimeline mDetune;
AudioParamTimeline mQ;
AudioParamTimeline mGain;
};
BiquadFilterNode::BiquadFilterNode(AudioContext* aContext)
: AudioNode(aContext)
, mType(BiquadTypeEnum::LOWPASS)
, mType(BiquadFilterType::Lowpass)
, mFrequency(new AudioParam(this, SendFrequencyToStream, 350.f))
, mDetune(new AudioParam(this, SendDetuneToStream, 0.f))
, mQ(new AudioParam(this, SendQToStream, 1.f))
, mGain(new AudioParam(this, SendGainToStream, 0.f))
{
@ -115,18 +123,6 @@ BiquadFilterNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
return BiquadFilterNodeBinding::Wrap(aCx, aScope, this);
}
void
BiquadFilterNode::SetType(uint16_t aType, ErrorResult& aRv)
{
BiquadTypeEnum type = static_cast<BiquadTypeEnum> (aType);
if (type > BiquadTypeEnum::Max) {
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
} else {
mType = type;
SendInt32ParameterToStream(BiquadFilterNodeEngine::TYPE, aType);
}
}
void
BiquadFilterNode::SendFrequencyToStream(AudioNode* aNode)
{
@ -134,6 +130,13 @@ BiquadFilterNode::SendFrequencyToStream(AudioNode* aNode)
SendTimelineParameterToStream(This, BiquadFilterNodeEngine::FREQUENCY, *This->mFrequency);
}
void
BiquadFilterNode::SendDetuneToStream(AudioNode* aNode)
{
BiquadFilterNode* This = static_cast<BiquadFilterNode*>(aNode);
SendTimelineParameterToStream(This, BiquadFilterNodeEngine::DETUNE, *This->mDetune);
}
void
BiquadFilterNode::SendQToStream(AudioNode* aNode)
{

Просмотреть файл

@ -9,26 +9,13 @@
#include "AudioNode.h"
#include "AudioParam.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/TypedEnum.h"
#include "mozilla/dom/BiquadFilterNodeBinding.h"
namespace mozilla {
namespace dom {
class AudioContext;
MOZ_BEGIN_ENUM_CLASS(BiquadTypeEnum, uint16_t)
LOWPASS = 0,
HIGHPASS = 1,
BANDPASS = 2,
LOWSHELF = 3,
HIGHSHELF = 4,
PEAKING = 5,
NOTCH = 6,
ALLPASS = 7,
Max = 7
MOZ_END_ENUM_CLASS(BiquadTypeEnum)
class BiquadFilterNode : public AudioNode
{
public:
@ -45,17 +32,25 @@ public:
return true;
}
uint16_t Type() const
BiquadFilterType Type() const
{
return static_cast<uint16_t> (mType);
return mType;
}
void SetType(BiquadFilterType aType)
{
mType = aType;
}
void SetType(uint16_t aType, ErrorResult& aRv);
AudioParam* Frequency() const
{
return mFrequency;
}
AudioParam* Detune() const
{
return mDetune;
}
AudioParam* Q() const
{
return mQ;
@ -68,12 +63,14 @@ public:
private:
static void SendFrequencyToStream(AudioNode* aNode);
static void SendDetuneToStream(AudioNode* aNode);
static void SendQToStream(AudioNode* aNode);
static void SendGainToStream(AudioNode* aNode);
private:
BiquadTypeEnum mType;
BiquadFilterType mType;
nsRefPtr<AudioParam> mFrequency;
nsRefPtr<AudioParam> mDetune;
nsRefPtr<AudioParam> mQ;
nsRefPtr<AudioParam> mGain;
};

Просмотреть файл

@ -36,20 +36,27 @@ addLoadEvent(function() {
filter.connect(destination);
// Verify default values
is(filter.type, 0, "Correct default value for type");
is(filter.type, "lowpass", "Correct default value for type");
near(filter.frequency.defaultValue, 350, "Correct default value for filter frequency");
near(filter.detune.defaultValue, 0, "Correct default value for filter detune");
near(filter.Q.defaultValue, 1, "Correct default value for filter Q");
near(filter.gain.defaultValue, 0, "Correct default value for filter gain");
// Make sure that we can set all of the valid type values
for (var i = 0; i <= 7; ++i) {
filter.type = i;
var types = [
"lowpass",
"highpass",
"bandpass",
"lowshelf",
"highshelf",
"peaking",
"notch",
"allpass",
];
for (var i = 0; i < types.length; ++i) {
filter.type = types[i];
}
expectException(function() {
filter.type = 8;
}, DOMException.INDEX_SIZE_ERR);
source.start(0);
SimpleTest.executeSoon(function() {
source.stop(0);

Просмотреть файл

@ -134,7 +134,7 @@ DOMInterfaces = {
},
'BiquadFilterNode': {
'resultNotAddRefed': [ 'frequency', 'q', 'gain' ],
'resultNotAddRefed': [ 'frequency', 'detune', 'q', 'gain' ],
},
'Blob': [

Просмотреть файл

@ -10,22 +10,23 @@
* liability, trademark and document use rules apply.
*/
enum BiquadFilterType {
"lowpass",
"highpass",
"bandpass",
"lowshelf",
"highshelf",
"peaking",
"notch",
"allpass"
};
[PrefControlled]
interface BiquadFilterNode : AudioNode {
// Filter type.
const unsigned short LOWPASS = 0;
const unsigned short HIGHPASS = 1;
const unsigned short BANDPASS = 2;
const unsigned short LOWSHELF = 3;
const unsigned short HIGHSHELF = 4;
const unsigned short PEAKING = 5;
const unsigned short NOTCH = 6;
const unsigned short ALLPASS = 7;
[SetterThrows]
attribute unsigned short type;
attribute BiquadFilterType type;
readonly attribute AudioParam frequency; // in Hertz
readonly attribute AudioParam detune; // in Cents
readonly attribute AudioParam Q; // Quality factor
readonly attribute AudioParam gain; // in Decibels