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

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

@ -9,26 +9,13 @@
#include "AudioNode.h" #include "AudioNode.h"
#include "AudioParam.h" #include "AudioParam.h"
#include "mozilla/ErrorResult.h" #include "mozilla/dom/BiquadFilterNodeBinding.h"
#include "mozilla/TypedEnum.h"
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
class AudioContext; 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 class BiquadFilterNode : public AudioNode
{ {
public: public:
@ -45,17 +32,25 @@ public:
return true; 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 AudioParam* Frequency() const
{ {
return mFrequency; return mFrequency;
} }
AudioParam* Detune() const
{
return mDetune;
}
AudioParam* Q() const AudioParam* Q() const
{ {
return mQ; return mQ;
@ -68,12 +63,14 @@ public:
private: private:
static void SendFrequencyToStream(AudioNode* aNode); static void SendFrequencyToStream(AudioNode* aNode);
static void SendDetuneToStream(AudioNode* aNode);
static void SendQToStream(AudioNode* aNode); static void SendQToStream(AudioNode* aNode);
static void SendGainToStream(AudioNode* aNode); static void SendGainToStream(AudioNode* aNode);
private: private:
BiquadTypeEnum mType; BiquadFilterType mType;
nsRefPtr<AudioParam> mFrequency; nsRefPtr<AudioParam> mFrequency;
nsRefPtr<AudioParam> mDetune;
nsRefPtr<AudioParam> mQ; nsRefPtr<AudioParam> mQ;
nsRefPtr<AudioParam> mGain; nsRefPtr<AudioParam> mGain;
}; };

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

@ -36,20 +36,27 @@ addLoadEvent(function() {
filter.connect(destination); filter.connect(destination);
// Verify default values // 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.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.Q.defaultValue, 1, "Correct default value for filter Q");
near(filter.gain.defaultValue, 0, "Correct default value for filter gain"); near(filter.gain.defaultValue, 0, "Correct default value for filter gain");
// Make sure that we can set all of the valid type values // Make sure that we can set all of the valid type values
for (var i = 0; i <= 7; ++i) { var types = [
filter.type = i; "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); source.start(0);
SimpleTest.executeSoon(function() { SimpleTest.executeSoon(function() {
source.stop(0); source.stop(0);

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

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

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

@ -10,22 +10,23 @@
* liability, trademark and document use rules apply. * liability, trademark and document use rules apply.
*/ */
enum BiquadFilterType {
"lowpass",
"highpass",
"bandpass",
"lowshelf",
"highshelf",
"peaking",
"notch",
"allpass"
};
[PrefControlled] [PrefControlled]
interface BiquadFilterNode : AudioNode { interface BiquadFilterNode : AudioNode {
// Filter type. attribute BiquadFilterType 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;
readonly attribute AudioParam frequency; // in Hertz readonly attribute AudioParam frequency; // in Hertz
readonly attribute AudioParam detune; // in Cents
readonly attribute AudioParam Q; // Quality factor readonly attribute AudioParam Q; // Quality factor
readonly attribute AudioParam gain; // in Decibels readonly attribute AudioParam gain; // in Decibels