LibWeb: Implement AudioNode.channelCount

This commit is contained in:
Jelle Raaijmakers 2024-10-08 13:51:27 +02:00 committed by Andreas Kling
parent 7b4f0d13ee
commit cb21201550
Notes: github-actions[bot] 2024-10-08 14:35:10 +00:00
4 changed files with 35 additions and 10 deletions

View file

@ -7,9 +7,11 @@
#include <LibWeb/Bindings/AudioDestinationNodePrototype.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/WebAudio/AudioContext.h>
#include <LibWeb/WebAudio/AudioDestinationNode.h>
#include <LibWeb/WebAudio/AudioNode.h>
#include <LibWeb/WebAudio/BaseAudioContext.h>
#include <LibWeb/WebAudio/OfflineAudioContext.h>
namespace Web::WebAudio {
@ -45,4 +47,25 @@ void AudioDestinationNode::visit_edges(Cell::Visitor& visitor)
Base::visit_edges(visitor);
}
// https://webaudio.github.io/web-audio-api/#dom-audionode-channelcount
WebIDL::ExceptionOr<void> AudioDestinationNode::set_channel_count(WebIDL::UnsignedLong channel_count)
{
// The behavior depends on whether the destination node is the destination of an AudioContext
// or OfflineAudioContext:
// AudioContext: The channel count MUST be between 1 and maxChannelCount. An IndexSizeError
// exception MUST be thrown for any attempt to set the count outside this range.
if (is<AudioContext>(*context())) {
if (channel_count < 1 || channel_count > max_channel_count())
return WebIDL::IndexSizeError::create(realm(), "Channel index is out of range"_fly_string);
}
// OfflineAudioContext: The channel count cannot be changed. An InvalidStateError exception MUST
// be thrown for any attempt to change the value.
if (is<OfflineAudioContext>(*context()))
return WebIDL::InvalidStateError::create(realm(), "Cannot change channel count in an OfflineAudioContext"_fly_string);
return AudioNode::set_channel_count(channel_count);
}
}

View file

@ -25,6 +25,7 @@ public:
WebIDL::UnsignedLong max_channel_count();
WebIDL::UnsignedLong number_of_inputs() override { return 1; }
WebIDL::UnsignedLong number_of_outputs() override { return 1; }
WebIDL::ExceptionOr<void> set_channel_count(WebIDL::UnsignedLong) override;
static JS::NonnullGCPtr<AudioDestinationNode> construct_impl(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>);

View file

@ -101,15 +101,13 @@ void AudioNode::disconnect(JS::NonnullGCPtr<AudioParam> destination_param, WebID
// https://webaudio.github.io/web-audio-api/#dom-audionode-channelcount
WebIDL::ExceptionOr<void> AudioNode::set_channel_count(WebIDL::UnsignedLong channel_count)
{
(void)channel_count;
return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioNode::set_channel_count(channel_count)"_fly_string);
}
// If this value is set to zero or to a value greater than the implementations maximum number
// of channels the implementation MUST throw a NotSupportedError exception.
if (channel_count == 0 || channel_count > BaseAudioContext::MAX_NUMBER_OF_CHANNELS)
return WebIDL::NotSupportedError::create(realm(), "Invalid channel count"_fly_string);
// https://webaudio.github.io/web-audio-api/#dom-audionode-channelcount
WebIDL::UnsignedLong AudioNode::channel_count()
{
dbgln("FIXME: Implement AudioNode::channel_count()");
return 2;
m_channel_count = channel_count;
return {};
}
// https://webaudio.github.io/web-audio-api/#dom-audionode-channelcountmode

View file

@ -53,8 +53,10 @@ public:
// https://webaudio.github.io/web-audio-api/#dom-audionode-numberofoutputs
virtual WebIDL::UnsignedLong number_of_outputs() = 0;
WebIDL::ExceptionOr<void> set_channel_count(WebIDL::UnsignedLong);
WebIDL::UnsignedLong channel_count();
// https://webaudio.github.io/web-audio-api/#dom-audionode-channelcount
virtual WebIDL::ExceptionOr<void> set_channel_count(WebIDL::UnsignedLong);
virtual WebIDL::UnsignedLong channel_count() const { return m_channel_count; }
WebIDL::ExceptionOr<void> set_channel_count_mode(Bindings::ChannelCountMode);
Bindings::ChannelCountMode channel_count_mode();
WebIDL::ExceptionOr<void> set_channel_interpretation(Bindings::ChannelInterpretation);
@ -68,6 +70,7 @@ protected:
private:
JS::NonnullGCPtr<BaseAudioContext> m_context;
WebIDL::UnsignedLong m_channel_count { 2 };
Bindings::ChannelCountMode m_channel_count_mode { Bindings::ChannelCountMode::Max };
Bindings::ChannelInterpretation m_channel_interpretation { Bindings::ChannelInterpretation::Speakers };
};