BiquadFilterNode.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Bindings/AudioParamPrototype.h>
  7. #include <LibWeb/Bindings/BiquadFilterNodePrototype.h>
  8. #include <LibWeb/Bindings/Intrinsics.h>
  9. #include <LibWeb/WebAudio/AudioNode.h>
  10. #include <LibWeb/WebAudio/AudioParam.h>
  11. #include <LibWeb/WebAudio/BiquadFilterNode.h>
  12. namespace Web::WebAudio {
  13. GC_DEFINE_ALLOCATOR(BiquadFilterNode);
  14. BiquadFilterNode::BiquadFilterNode(JS::Realm& realm, GC::Ref<BaseAudioContext> context, BiquadFilterOptions const& options)
  15. : AudioNode(realm, context)
  16. , m_type(options.type)
  17. , m_frequency(AudioParam::create(realm, options.frequency, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  18. , m_detune(AudioParam::create(realm, options.detune, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  19. , m_q(AudioParam::create(realm, options.q, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  20. , m_gain(AudioParam::create(realm, options.gain, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  21. {
  22. }
  23. BiquadFilterNode::~BiquadFilterNode() = default;
  24. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-type
  25. void BiquadFilterNode::set_type(Bindings::BiquadFilterType type)
  26. {
  27. m_type = type;
  28. }
  29. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-type
  30. Bindings::BiquadFilterType BiquadFilterNode::type() const
  31. {
  32. return m_type;
  33. }
  34. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-frequency
  35. GC::Ref<AudioParam> BiquadFilterNode::frequency() const
  36. {
  37. return m_frequency;
  38. }
  39. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-detune
  40. GC::Ref<AudioParam> BiquadFilterNode::detune() const
  41. {
  42. return m_detune;
  43. }
  44. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-q
  45. GC::Ref<AudioParam> BiquadFilterNode::q() const
  46. {
  47. return m_q;
  48. }
  49. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-gain
  50. GC::Ref<AudioParam> BiquadFilterNode::gain() const
  51. {
  52. return m_gain;
  53. }
  54. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-getfrequencyresponse
  55. WebIDL::ExceptionOr<void> BiquadFilterNode::get_frequency_response(GC::Root<WebIDL::BufferSource> const& frequency_hz, GC::Root<WebIDL::BufferSource> const& mag_response, GC::Root<WebIDL::BufferSource> const& phase_response)
  56. {
  57. (void)frequency_hz;
  58. (void)mag_response;
  59. (void)phase_response;
  60. dbgln("FIXME: Implement BiquadFilterNode::get_frequency_response(Float32Array, Float32Array, Float32Array)");
  61. return {};
  62. }
  63. WebIDL::ExceptionOr<GC::Ref<BiquadFilterNode>> BiquadFilterNode::create(JS::Realm& realm, GC::Ref<BaseAudioContext> context, BiquadFilterOptions const& options)
  64. {
  65. return construct_impl(realm, context, options);
  66. }
  67. // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-biquadfilternode
  68. WebIDL::ExceptionOr<GC::Ref<BiquadFilterNode>> BiquadFilterNode::construct_impl(JS::Realm& realm, GC::Ref<BaseAudioContext> context, BiquadFilterOptions const& options)
  69. {
  70. // When the constructor is called with a BaseAudioContext c and an option object option, the user agent
  71. // MUST initialize the AudioNode this, with context and options as arguments.
  72. auto node = realm.create<BiquadFilterNode>(realm, context, options);
  73. // Default options for channel count and interpretation
  74. // https://webaudio.github.io/web-audio-api/#BiquadFilterNode
  75. AudioNodeDefaultOptions default_options;
  76. default_options.channel_count_mode = Bindings::ChannelCountMode::Max;
  77. default_options.channel_interpretation = Bindings::ChannelInterpretation::Speakers;
  78. default_options.channel_count = 2;
  79. // FIXME: Set tail-time to yes
  80. TRY(node->initialize_audio_node_options(options, default_options));
  81. return node;
  82. }
  83. void BiquadFilterNode::initialize(JS::Realm& realm)
  84. {
  85. Base::initialize(realm);
  86. WEB_SET_PROTOTYPE_FOR_INTERFACE(BiquadFilterNode);
  87. }
  88. void BiquadFilterNode::visit_edges(Cell::Visitor& visitor)
  89. {
  90. Base::visit_edges(visitor);
  91. visitor.visit(m_frequency);
  92. visitor.visit(m_detune);
  93. visitor.visit(m_q);
  94. visitor.visit(m_gain);
  95. }
  96. }