diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 4328a3f0685..1ae286d9c5f 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -691,6 +691,7 @@ class Table; } namespace Web::WebAudio { +class AudioBuffer; class AudioContext; class AudioNode; class AudioParam; diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.cpp index b9ae09f79fa..ee330df7aab 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.cpp +++ b/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.cpp @@ -18,6 +18,11 @@ namespace Web::WebAudio { JS_DEFINE_ALLOCATOR(AudioBuffer); +WebIDL::ExceptionOr> AudioBuffer::create(JS::Realm& realm, WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate) +{ + return construct_impl(realm, { number_of_channels, length, sample_rate }); +} + WebIDL::ExceptionOr> AudioBuffer::construct_impl(JS::Realm& realm, AudioBufferOptions const& options) { auto& vm = realm.vm(); diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.h b/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.h index 3bb8a735c8a..08a56c0226f 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.h +++ b/Userland/Libraries/LibWeb/WebAudio/AudioBuffer.h @@ -28,6 +28,7 @@ class AudioBuffer final : public Bindings::PlatformObject { JS_DECLARE_ALLOCATOR(AudioBuffer); public: + static WebIDL::ExceptionOr> create(JS::Realm&, WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate); static WebIDL::ExceptionOr> construct_impl(JS::Realm&, AudioBufferOptions const&); virtual ~AudioBuffer() override; diff --git a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp index 60b01e66487..28bb2f4f45e 100644 --- a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp +++ b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,14 @@ WebIDL::CallbackType* BaseAudioContext::onstatechange() return event_handler_attribute(HTML::EventNames::statechange); } +// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer +WebIDL::ExceptionOr> BaseAudioContext::create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate) +{ + // Creates an AudioBuffer of the given size. The audio data in the buffer will be zero-initialized (silent). + // A NotSupportedError exception MUST be thrown if any of the arguments is negative, zero, or outside its nominal range. + return AudioBuffer::create(realm(), number_of_channels, length, sample_rate); +} + // https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createoscillator WebIDL::ExceptionOr> BaseAudioContext::create_oscillator() { diff --git a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h index 8fd395a75c7..7cf74f96d6a 100644 --- a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h +++ b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h @@ -47,6 +47,7 @@ public: static WebIDL::ExceptionOr verify_audio_options_inside_nominal_range(JS::Realm&, WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate); + WebIDL::ExceptionOr> create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate); WebIDL::ExceptionOr> create_oscillator(); WebIDL::ExceptionOr> create_dynamics_compressor(); diff --git a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl index 2141dd8140b..2b34e10fdb3 100644 --- a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl +++ b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl @@ -1,5 +1,6 @@ #import #import +#import #import #import @@ -24,7 +25,7 @@ interface BaseAudioContext : EventTarget { [FIXME] AnalyserNode createAnalyser (); [FIXME] BiquadFilterNode createBiquadFilter (); - [FIXME] AudioBuffer createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate); + AudioBuffer createBuffer(unsigned long numberOfChannels, unsigned long length, float sampleRate); [FIXME] AudioBufferSourceNode createBufferSource (); [FIXME] ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6); [FIXME] ChannelSplitterNode createChannelSplitter (optional unsigned long numberOfOutputs = 6);