This commit is contained in:
Tim Ledbetter 2025-01-02 11:40:22 +00:00 committed by GitHub
commit 5a15114437
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 142 additions and 1 deletions

View file

@ -31,7 +31,22 @@ AudioBufferSourceNode::~AudioBufferSourceNode() = default;
// https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer
WebIDL::ExceptionOr<void> AudioBufferSourceNode::set_buffer(GC::Ptr<AudioBuffer> buffer)
{
m_buffer = buffer;
// 1. Let new buffer be the AudioBuffer or null value to be assigned to buffer.
auto new_buffer = buffer;
// 2. If new buffer is not null and [[buffer set]] is true, throw an InvalidStateError and abort these steps.
if (new_buffer && m_buffer_set)
return WebIDL::InvalidStateError::create(realm(), "Buffer has already been set"_string);
// 3. If new buffer is not null, set [[buffer set]] to true.
if (new_buffer)
m_buffer_set = true;
// 4. Assign new buffer to the buffer attribute.
m_buffer = new_buffer;
// FIXME: 5. If start() has previously been called on this node, perform the operation acquire the content on buffer.
return {};
}

View file

@ -60,6 +60,8 @@ private:
GC::Ref<AudioParam> m_playback_rate;
GC::Ref<AudioParam> m_detune;
bool m_loop { false };
// https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer-set-slot
bool m_buffer_set { false };
double m_loop_start { 0.0 };
double m_loop_end { 0.0 };
};

View file

@ -0,0 +1,27 @@
Harness status: OK
Found 22 tests
22 Pass
Pass # AUDIT TASK RUNNER STARTED.
Pass Executing "validate .buffer"
Pass Audit report
Pass > [validate .buffer] Validatation of AudioBuffer in .buffer attribute setter
Pass source.buffer = 57 threw TypeError: "Not an object of type AudioBuffer".
Pass source.buffer = null did not throw an exception.
Pass source.buffer = buffer did not throw an exception.
Pass source.buffer = new buffer threw InvalidStateError: "Buffer has already been set".
Pass source.buffer = null again did not throw an exception.
Pass source.buffer = buffer again threw InvalidStateError: "Buffer has already been set".
Pass source.buffer = null after setting to null did not throw an exception.
Pass Setting source with mono buffer did not throw an exception.
Pass Setting source with stereo buffer did not throw an exception.
Pass Setting source with 3 channels buffer did not throw an exception.
Pass Setting source with 4 channels buffer did not throw an exception.
Pass Setting source with 5 channels buffer did not throw an exception.
Pass Setting source with 6 channels buffer did not throw an exception.
Pass Setting source with 7 channels buffer did not throw an exception.
Pass Setting source with 8 channels buffer did not throw an exception.
Pass Setting source with 9 channels buffer did not throw an exception.
Pass < [validate .buffer] All assertions passed. (total 16 assertions)
Pass # AUDIT TASK RUNNER FINISHED: 1 tasks ran successfully.

View file

@ -0,0 +1,97 @@
<!DOCTYPE html>
<html>
<head>
<title>
audiobuffersource-channels.html
</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../webaudio/resources/audit-util.js"></script>
<script src="../../../webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
let context;
let source;
audit.define(
{
label: 'validate .buffer',
description:
'Validatation of AudioBuffer in .buffer attribute setter'
},
function(task, should) {
context = new AudioContext();
source = context.createBufferSource();
// Make sure we can't set to something which isn't an AudioBuffer.
should(function() {
source.buffer = 57;
}, 'source.buffer = 57').throw(TypeError);
// It's ok to set the buffer to null.
should(function() {
source.buffer = null;
}, 'source.buffer = null').notThrow();
// Set the buffer to a valid AudioBuffer
let buffer =
new AudioBuffer({length: 128, sampleRate: context.sampleRate});
should(function() {
source.buffer = buffer;
}, 'source.buffer = buffer').notThrow();
// The buffer has been set; we can't set it again.
should(function() {
source.buffer =
new AudioBuffer({length: 128, sampleRate: context.sampleRate})
}, 'source.buffer = new buffer').throw(DOMException, 'InvalidStateError');
// The buffer has been set; it's ok to set it to null.
should(function() {
source.buffer = null;
}, 'source.buffer = null again').notThrow();
// The buffer was already set (and set to null). Can't set it
// again.
should(function() {
source.buffer = buffer;
}, 'source.buffer = buffer again').throw(DOMException, 'InvalidStateError');
// But setting to null is ok.
should(function() {
}, 'source.buffer = null after setting to null').notThrow();
// Check that mono buffer can be set.
should(function() {
let monoBuffer =
context.createBuffer(1, 1024, context.sampleRate);
let testSource = context.createBufferSource();
testSource.buffer = monoBuffer;
}, 'Setting source with mono buffer').notThrow();
// Check that stereo buffer can be set.
should(function() {
let stereoBuffer =
context.createBuffer(2, 1024, context.sampleRate);
let testSource = context.createBufferSource();
testSource.buffer = stereoBuffer;
}, 'Setting source with stereo buffer').notThrow();
// Check buffers with more than two channels.
for (let i = 3; i < 10; ++i) {
should(function() {
let buffer = context.createBuffer(i, 1024, context.sampleRate);
let testSource = context.createBufferSource();
testSource.buffer = buffer;
}, 'Setting source with ' + i + ' channels buffer').notThrow();
}
task.done();
});
audit.run();
</script>
</body>
</html>