diff --git a/Tests/LibWeb/Text/expected/WebAudio/DynamicsCompressorNode.txt b/Tests/LibWeb/Text/expected/WebAudio/DynamicsCompressorNode.txt
index 72ad4f051c3..65424fe705e 100644
--- a/Tests/LibWeb/Text/expected/WebAudio/DynamicsCompressorNode.txt
+++ b/Tests/LibWeb/Text/expected/WebAudio/DynamicsCompressorNode.txt
@@ -2,3 +2,8 @@ DynamicsCompressorNode
AudioNode
EventTarget
Object
+[object AudioParam] current: -24, default: -24, min: -100, max: 0, rate: k-rate
+[object AudioParam] current: 30, default: 30, min: 0, max: 40, rate: k-rate
+[object AudioParam] current: 12, default: 12, min: 1, max: 20, rate: k-rate
+[object AudioParam] current: 0.003000000026077032, default: 0.003000000026077032, min: 0, max: 1, rate: k-rate
+[object AudioParam] current: 0.25, default: 0.25, min: 0, max: 1, rate: k-rate
diff --git a/Tests/LibWeb/Text/input/WebAudio/DynamicsCompressorNode.html b/Tests/LibWeb/Text/input/WebAudio/DynamicsCompressorNode.html
index 2b3385e0612..68b7217365d 100644
--- a/Tests/LibWeb/Text/input/WebAudio/DynamicsCompressorNode.html
+++ b/Tests/LibWeb/Text/input/WebAudio/DynamicsCompressorNode.html
@@ -1,5 +1,9 @@
diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp
index cda26f52e05..5cf5342ee2a 100644
--- a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp
+++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp
@@ -6,6 +6,7 @@
#include
#include
+#include
#include
namespace Web::WebAudio {
@@ -26,8 +27,13 @@ WebIDL::ExceptionOr> DynamicsCompressor
return realm.vm().heap().allocate(realm, realm, context, options);
}
-DynamicsCompressorNode::DynamicsCompressorNode(JS::Realm& realm, JS::NonnullGCPtr context, DynamicsCompressorOptions const&)
+DynamicsCompressorNode::DynamicsCompressorNode(JS::Realm& realm, JS::NonnullGCPtr context, DynamicsCompressorOptions const& options)
: AudioNode(realm, context)
+ , m_threshold(AudioParam::create(realm, options.threshold, -100, 0, Bindings::AutomationRate::KRate))
+ , m_knee(AudioParam::create(realm, options.knee, 0, 40, Bindings::AutomationRate::KRate))
+ , m_ratio(AudioParam::create(realm, options.ratio, 1, 20, Bindings::AutomationRate::KRate))
+ , m_attack(AudioParam::create(realm, options.attack, 0, 1, Bindings::AutomationRate::KRate))
+ , m_release(AudioParam::create(realm, options.release, 0, 1, Bindings::AutomationRate::KRate))
{
}
@@ -40,6 +46,11 @@ void DynamicsCompressorNode::initialize(JS::Realm& realm)
void DynamicsCompressorNode::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
+ visitor.visit(m_threshold);
+ visitor.visit(m_knee);
+ visitor.visit(m_ratio);
+ visitor.visit(m_attack);
+ visitor.visit(m_release);
}
}
diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h
index d0d9be54734..1aaa575bbb5 100644
--- a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h
+++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h
@@ -30,11 +30,33 @@ public:
static WebIDL::ExceptionOr> create(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {});
static WebIDL::ExceptionOr> construct_impl(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {});
+ JS::NonnullGCPtr threshold() const { return m_threshold; }
+ JS::NonnullGCPtr knee() const { return m_knee; }
+ JS::NonnullGCPtr ratio() const { return m_ratio; }
+ JS::NonnullGCPtr attack() const { return m_attack; }
+ JS::NonnullGCPtr release() const { return m_release; }
+
protected:
DynamicsCompressorNode(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {});
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
+
+private:
+ // https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-threshold
+ JS::NonnullGCPtr m_threshold;
+
+ // https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-knee
+ JS::NonnullGCPtr m_knee;
+
+ // https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-ratio
+ JS::NonnullGCPtr m_ratio;
+
+ // https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-attack
+ JS::NonnullGCPtr m_attack;
+
+ // https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-release
+ JS::NonnullGCPtr m_release;
};
}
diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl
index 032cd953376..d2bda633394 100644
--- a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl
+++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl
@@ -16,10 +16,10 @@ dictionary DynamicsCompressorOptions : AudioNodeOptions {
interface DynamicsCompressorNode : AudioNode {
constructor(BaseAudioContext context,
optional DynamicsCompressorOptions options = {});
- // FIXME: readonly attribute AudioParam threshold;
- // FIXME: readonly attribute AudioParam knee;
- // FIXME: readonly attribute AudioParam ratio;
+ readonly attribute AudioParam threshold;
+ readonly attribute AudioParam knee;
+ readonly attribute AudioParam ratio;
// FIXME: readonly attribute float reduction;
- // FIXME: readonly attribute AudioParam attack;
- // FIXME: readonly attribute AudioParam release;
+ readonly attribute AudioParam attack;
+ readonly attribute AudioParam release;
};