AudioListener.cpp 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2024, Jelle Raaijmakers <jelle@ladybird.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGC/CellAllocator.h>
  7. #include <LibWeb/Bindings/Intrinsics.h>
  8. #include <LibWeb/WebAudio/AudioListener.h>
  9. namespace Web::WebAudio {
  10. GC_DEFINE_ALLOCATOR(AudioListener);
  11. AudioListener::AudioListener(JS::Realm& realm)
  12. : Bindings::PlatformObject(realm)
  13. , m_forward_x(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  14. , m_forward_y(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  15. , m_forward_z(AudioParam::create(realm, -1.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  16. , m_position_x(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  17. , m_position_y(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  18. , m_position_z(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  19. , m_up_x(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  20. , m_up_y(AudioParam::create(realm, 1.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  21. , m_up_z(AudioParam::create(realm, 0.f, NumericLimits<float>::lowest(), NumericLimits<float>::max(), Bindings::AutomationRate::ARate))
  22. {
  23. }
  24. GC::Ref<AudioListener> AudioListener::create(JS::Realm& realm)
  25. {
  26. return realm.create<AudioListener>(realm);
  27. }
  28. AudioListener::~AudioListener() = default;
  29. // https://webaudio.github.io/web-audio-api/#dom-audiolistener-setposition
  30. WebIDL::ExceptionOr<void> AudioListener::set_position(float x, float y, float z)
  31. {
  32. // This method is DEPRECATED. It is equivalent to setting positionX.value, positionY.value, and
  33. // positionZ.value directly with the given x, y, and z values, respectively.
  34. // FIXME: Consequently, any of the positionX, positionY, and positionZ AudioParams for this
  35. // AudioListener have an automation curve set using setValueCurveAtTime() at the time this
  36. // method is called, a NotSupportedError MUST be thrown.
  37. m_position_x->set_value(x);
  38. m_position_y->set_value(y);
  39. m_position_z->set_value(z);
  40. return {};
  41. }
  42. // https://webaudio.github.io/web-audio-api/#dom-audiolistener-setorientation
  43. WebIDL::ExceptionOr<void> AudioListener::set_orientation(float x, float y, float z, float x_up, float y_up, float z_up)
  44. {
  45. // This method is DEPRECATED. It is equivalent to setting forwardX.value, forwardY.value,
  46. // forwardZ.value, upX.value, upY.value, and upZ.value directly with the given x, y, z, xUp,
  47. // yUp, and zUp values, respectively.
  48. // FIXME: Consequently, if any of the forwardX, forwardY, forwardZ, upX, upY and upZ
  49. // AudioParams have an automation curve set using setValueCurveAtTime() at the time this
  50. // method is called, a NotSupportedError MUST be thrown.
  51. m_forward_x->set_value(x);
  52. m_forward_y->set_value(y);
  53. m_forward_z->set_value(z);
  54. m_up_x->set_value(x_up);
  55. m_up_y->set_value(y_up);
  56. m_up_z->set_value(z_up);
  57. return {};
  58. }
  59. void AudioListener::initialize(JS::Realm& realm)
  60. {
  61. Base::initialize(realm);
  62. WEB_SET_PROTOTYPE_FOR_INTERFACE(AudioListener);
  63. }
  64. void AudioListener::visit_edges(Cell::Visitor& visitor)
  65. {
  66. Base::visit_edges(visitor);
  67. visitor.visit(m_forward_x);
  68. visitor.visit(m_forward_y);
  69. visitor.visit(m_forward_z);
  70. visitor.visit(m_position_x);
  71. visitor.visit(m_position_y);
  72. visitor.visit(m_position_z);
  73. visitor.visit(m_up_x);
  74. visitor.visit(m_up_y);
  75. visitor.visit(m_up_z);
  76. }
  77. }