GainNode.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Bindings/Intrinsics.h>
  7. #include <LibWeb/WebAudio/AudioNode.h>
  8. #include <LibWeb/WebAudio/AudioParam.h>
  9. #include <LibWeb/WebAudio/BaseAudioContext.h>
  10. #include <LibWeb/WebAudio/GainNode.h>
  11. namespace Web::WebAudio {
  12. GC_DEFINE_ALLOCATOR(GainNode);
  13. GainNode::~GainNode() = default;
  14. WebIDL::ExceptionOr<GC::Ref<GainNode>> GainNode::create(JS::Realm& realm, GC::Ref<BaseAudioContext> context, GainOptions const& options)
  15. {
  16. return construct_impl(realm, context, options);
  17. }
  18. // https://webaudio.github.io/web-audio-api/#dom-gainnode-gainnode
  19. WebIDL::ExceptionOr<GC::Ref<GainNode>> GainNode::construct_impl(JS::Realm& realm, GC::Ref<BaseAudioContext> context, GainOptions const& options)
  20. {
  21. // Create the node and allocate memory
  22. auto node = realm.create<GainNode>(realm, context, options);
  23. // Default options for channel count and interpretation
  24. // https://webaudio.github.io/web-audio-api/#GainNode
  25. AudioNodeDefaultOptions default_options;
  26. default_options.channel_count_mode = Bindings::ChannelCountMode::Max;
  27. default_options.channel_interpretation = Bindings::ChannelInterpretation::Speakers;
  28. default_options.channel_count = 2;
  29. // FIXME: Set tail-time to no
  30. TRY(node->initialize_audio_node_options(options, default_options));
  31. return node;
  32. }
  33. GainNode::GainNode(JS::Realm& realm, GC::Ref<BaseAudioContext> context, GainOptions const& options)
  34. : AudioNode(realm, context)
  35. , m_gain(AudioParam::create(realm, options.gain, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  36. {
  37. }
  38. void GainNode::initialize(JS::Realm& realm)
  39. {
  40. Base::initialize(realm);
  41. WEB_SET_PROTOTYPE_FOR_INTERFACE(GainNode);
  42. }
  43. void GainNode::visit_edges(Cell::Visitor& visitor)
  44. {
  45. Base::visit_edges(visitor);
  46. visitor.visit(m_gain);
  47. }
  48. }