aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock10
-rw-r--r--components/script/dom/audiobuffer.rs119
-rw-r--r--components/script/dom/audiobuffersourcenode.rs12
-rw-r--r--components/script/dom/audioscheduledsourcenode.rs20
-rw-r--r--tests/wpt/metadata/MANIFEST.json10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini73
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-start.html.ini15
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/buffer-resampling.html.ini8
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-play.html.ini17
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-timing.html.ini17
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audionode-interface/audionode-channel-rules.html.ini19
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-allpass.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-automation.html.ini40
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highpass.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highshelf.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowpass.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowshelf.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-notch.html.ini10
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-peaking.html.ini10
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html36
21 files changed, 208 insertions, 268 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0a39d92b72a..1cd9fc82cc4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3235,7 +3235,7 @@ dependencies = [
[[package]]
name = "servo-media"
version = "0.1.0"
-source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
+source = "git+https://github.com/servo/media#b274b9636d4f90e44835735279674c1279e75592"
dependencies = [
"servo-media-audio 0.1.0 (git+https://github.com/servo/media)",
"servo-media-gstreamer 0.1.0 (git+https://github.com/servo/media)",
@@ -3245,7 +3245,7 @@ dependencies = [
[[package]]
name = "servo-media-audio"
version = "0.1.0"
-source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
+source = "git+https://github.com/servo/media#b274b9636d4f90e44835735279674c1279e75592"
dependencies = [
"boxfnonce 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3262,7 +3262,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer"
version = "0.1.0"
-source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
+source = "git+https://github.com/servo/media#b274b9636d4f90e44835735279674c1279e75592"
dependencies = [
"byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3280,7 +3280,7 @@ dependencies = [
[[package]]
name = "servo-media-player"
version = "0.1.0"
-source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
+source = "git+https://github.com/servo/media#b274b9636d4f90e44835735279674c1279e75592"
dependencies = [
"ipc-channel 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3376,7 +3376,7 @@ dependencies = [
[[package]]
name = "servo_media_derive"
version = "0.1.0"
-source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
+source = "git+https://github.com/servo/media#b274b9636d4f90e44835735279674c1279e75592"
dependencies = [
"quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/components/script/dom/audiobuffer.rs b/components/script/dom/audiobuffer.rs
index dd396f3aab9..92040be9bbf 100644
--- a/components/script/dom/audiobuffer.rs
+++ b/components/script/dom/audiobuffer.rs
@@ -17,6 +17,7 @@ use js::rust::CustomAutoRooterGuard;
use js::rust::wrappers::JS_DetachArrayBuffer;
use js::typedarray::{CreateWith, Float32Array};
use servo_media::audio::buffer_source_node::AudioBuffer as ServoMediaAudioBuffer;
+use std::cell::Ref;
use std::cmp::min;
use std::ptr::{self, NonNull};
@@ -27,15 +28,30 @@ pub const MAX_SAMPLE_RATE: f32 = 192000.;
type JSAudioChannel = Heap<*mut JSObject>;
+/// The AudioBuffer keeps its data either in js_channels
+/// or in shared_channels if js_channels buffers are detached.
+///
+/// js_channels buffers are (re)attached right before calling GetChannelData
+/// and remain attached until its contents are needed by some other API
+/// implementation. Follow https://webaudio.github.io/web-audio-api/#acquire-the-content
+/// to know in which situations js_channels buffers must be detached.
+///
#[dom_struct]
pub struct AudioBuffer {
reflector_: Reflector,
+ /// Float32Arrays returned by calls to GetChannelData.
js_channels: DomRefCell<Vec<JSAudioChannel>>,
+ /// Aggregates the data from js_channels.
+ /// This is Some<T> iff the buffers in js_channels are detached.
#[ignore_malloc_size_of = "servo_media"]
- shared_channels: DomRefCell<ServoMediaAudioBuffer>,
+ shared_channels: DomRefCell<Option<ServoMediaAudioBuffer>>,
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffer-samplerate
sample_rate: f32,
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffer-length
length: u32,
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffer-duration
duration: f64,
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffer-numberofchannels
number_of_channels: u32,
}
@@ -47,10 +63,7 @@ impl AudioBuffer {
AudioBuffer {
reflector_: Reflector::new(),
js_channels: DomRefCell::new(vec),
- shared_channels: DomRefCell::new(ServoMediaAudioBuffer::new(
- number_of_channels as u8,
- length as usize,
- )),
+ shared_channels: DomRefCell::new(None),
sample_rate,
length,
duration: length as f64 / sample_rate as f64,
@@ -68,7 +81,7 @@ impl AudioBuffer {
) -> DomRoot<AudioBuffer> {
let buffer = AudioBuffer::new_inherited(number_of_channels, length, sample_rate);
let buffer = reflect_dom_object(Box::new(buffer), global, AudioBufferBinding::Wrap);
- buffer.set_channels(initial_data);
+ buffer.set_initial_data(initial_data);
buffer
}
@@ -96,18 +109,18 @@ impl AudioBuffer {
// Initialize the underlying channels data with initial data provided by
// the user or silence otherwise.
- #[allow(unsafe_code)]
- pub fn set_channels(&self, initial_data: Option<&[Vec<f32>]>) {
+ fn set_initial_data(&self, initial_data: Option<&[Vec<f32>]>) {
+ let mut channels = ServoMediaAudioBuffer::new(
+ self.number_of_channels as u8,
+ self.length as usize,
+ );
for channel in 0..self.number_of_channels {
- (*self.shared_channels.borrow_mut()).buffers[channel as usize] = match initial_data {
+ channels.buffers[channel as usize] = match initial_data {
Some(data) => data[channel as usize].clone(),
None => vec![0.; self.length as usize],
};
}
- }
-
- pub fn get_channels(&self) -> ServoMediaAudioBuffer {
- self.shared_channels.borrow().clone()
+ *self.shared_channels.borrow_mut() = Some(channels);
}
#[allow(unsafe_code)]
@@ -117,35 +130,39 @@ impl AudioBuffer {
for (i, channel) in self.js_channels.borrow_mut().iter().enumerate() {
if !channel.get().is_null() {
// Already have data in JS array.
- // We may have called GetChannelData, and web content may have modified
- // js_channels. So make sure that shared_channels contains the same data as
- // js_channels.
- typedarray!(in(cx) let array: Float32Array = channel.get());
- if let Ok(array) = array {
- (*self.shared_channels.borrow_mut()).buffers[i] = array.to_vec();
- }
continue;
}
- // Copy the channel data from shared_channels to js_channels.
rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>());
- if Float32Array::create(
- cx,
- CreateWith::Slice(&(*self.shared_channels.borrow_mut()).buffers[i]),
- array.handle_mut(),
- ).is_err()
- {
- return false;
+ if let Some(ref shared_channels) = *self.shared_channels.borrow() {
+ // Step 4. of
+ // https://webaudio.github.io/web-audio-api/#acquire-the-content
+ // "Attach ArrayBuffers containing copies of the data to the AudioBuffer,
+ // to be returned by the next call to getChannelData()".
+ if Float32Array::create(
+ cx,
+ CreateWith::Slice(&shared_channels.buffers[i]),
+ array.handle_mut(),
+ ).is_err()
+ {
+ return false;
+ }
}
channel.set(array.get());
}
+ *self.shared_channels.borrow_mut() = None;
+
true
}
// https://webaudio.github.io/web-audio-api/#acquire-the-content
#[allow(unsafe_code)]
- pub fn acquire_contents(&self) -> Option<ServoMediaAudioBuffer> {
+ fn acquire_contents(&self) -> Option<ServoMediaAudioBuffer> {
+ let mut result = ServoMediaAudioBuffer::new(
+ self.number_of_channels as u8,
+ self.length as usize,
+ );
let cx = self.global().get_cx();
for (i, channel) in self.js_channels.borrow_mut().iter().enumerate() {
// Step 1.
@@ -173,13 +190,20 @@ impl AudioBuffer {
channel.set(ptr::null_mut());
// Step 3.
- (*self.shared_channels.borrow_mut()).buffers[i] = channel_data;
-
- // Step 4 will complete turning shared_channels
- // data into js_channels ArrayBuffers in restore_js_channel_data.
+ result.buffers[i] = channel_data;
}
- Some((*self.shared_channels.borrow()).clone())
+ Some(result)
+ }
+
+ pub fn get_channels(&self) -> Ref<Option<ServoMediaAudioBuffer>> {
+ if self.shared_channels.borrow().is_none() {
+ let channels = self.acquire_contents();
+ if channels.is_some() {
+ *self.shared_channels.borrow_mut() = channels;
+ }
+ }
+ return self.shared_channels.borrow()
}
}
@@ -254,10 +278,10 @@ impl AudioBufferMethods for AudioBuffer {
let data = unsafe { array.as_slice() };
dest.extend_from_slice(&data[offset..offset + bytes_to_copy]);
}
- } else if let Some(shared_channel) =
- self.shared_channels.borrow().buffers.get(channel_number)
- {
- dest.extend_from_slice(&shared_channel.as_slice()[offset..offset + bytes_to_copy]);
+ } else if let Some(ref shared_channels) = *self.shared_channels.borrow() {
+ if let Some(shared_channel) = shared_channels.buffers.get(channel_number) {
+ dest.extend_from_slice(&shared_channel.as_slice()[offset..offset + bytes_to_copy]);
+ }
}
unsafe {
@@ -297,21 +321,12 @@ impl AudioBufferMethods for AudioBuffer {
typedarray!(in(cx) let js_channel: Float32Array = js_channel);
if let Ok(mut js_channel) = js_channel {
let bytes_to_copy = min(self.length - start_in_channel, source.len() as u32) as usize;
+ let mut js_channel_data = unsafe { js_channel.as_mut_slice() };
+ let (_, mut js_channel_data) =
+ js_channel_data.split_at_mut(start_in_channel as usize);
unsafe {
- let data = &source.as_slice()[0..bytes_to_copy];
- // Update shared channel.
- {
- let mut shared_channels = self.shared_channels.borrow_mut();
- let shared_channel = shared_channels.data_chan_mut(channel_number as u8);
- let (_, mut shared_channel) =
- shared_channel.split_at_mut(start_in_channel as usize);
- shared_channel[0..bytes_to_copy].copy_from_slice(data);
- }
- // Update js channel.
- js_channel.update(
- self.shared_channels.borrow().buffers[channel_number as usize].as_slice(),
- );
- }
+ js_channel_data[0..bytes_to_copy].copy_from_slice(&source.as_slice()[0..bytes_to_copy])
+ };
} else {
return Err(Error::IndexSize);
}
diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs
index 7a2817e1204..da5329350fc 100644
--- a/components/script/dom/audiobuffersourcenode.rs
+++ b/components/script/dom/audiobuffersourcenode.rs
@@ -137,14 +137,14 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
self.buffer.set(new_buffer);
// Step 5.
- if self.source_node.started() {
+ if self.source_node.has_start() {
if let Some(buffer) = self.buffer.get() {
- let buffer = buffer.acquire_contents();
+ let buffer = buffer.get_channels();
if buffer.is_some() {
self.source_node
.node()
.message(AudioNodeMessage::AudioBufferSourceNode(
- AudioBufferSourceNodeMessage::SetBuffer(buffer),
+ AudioBufferSourceNodeMessage::SetBuffer((*buffer).clone()),
));
}
}
@@ -215,12 +215,12 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
}
if let Some(buffer) = self.buffer.get() {
- let buffer = buffer.acquire_contents();
+ let buffer = buffer.get_channels();
if buffer.is_some() {
self.source_node
.node()
.message(AudioNodeMessage::AudioBufferSourceNode(
- AudioBufferSourceNodeMessage::SetBuffer(buffer),
+ AudioBufferSourceNodeMessage::SetBuffer((*buffer).clone()),
));
}
}
@@ -235,7 +235,7 @@ impl<'a> From<&'a AudioBufferSourceOptions> for AudioBufferSourceNodeOptions {
Self {
buffer: if let Some(ref buffer) = options.buffer {
if let Some(ref buffer) = buffer {
- Some(buffer.get_channels())
+ (*buffer.get_channels()).clone()
} else {
None
}
diff --git a/components/script/dom/audioscheduledsourcenode.rs b/components/script/dom/audioscheduledsourcenode.rs
index 6e15148993c..2614a0aa40a 100644
--- a/components/script/dom/audioscheduledsourcenode.rs
+++ b/components/script/dom/audioscheduledsourcenode.rs
@@ -18,8 +18,8 @@ use task_source::{TaskSource, TaskSourceName};
#[dom_struct]
pub struct AudioScheduledSourceNode {
node: AudioNode,
- started: Cell<bool>,
- stopped: Cell<bool>,
+ has_start: Cell<bool>,
+ has_stop: Cell<bool>,
}
impl AudioScheduledSourceNode {
@@ -39,8 +39,8 @@ impl AudioScheduledSourceNode {
number_of_inputs,
number_of_outputs,
)?,
- started: Cell::new(false),
- stopped: Cell::new(false),
+ has_start: Cell::new(false),
+ has_stop: Cell::new(false),
})
}
@@ -48,8 +48,8 @@ impl AudioScheduledSourceNode {
&self.node
}
- pub fn started(&self) -> bool {
- self.started.get()
+ pub fn has_start(&self) -> bool {
+ self.has_start.get()
}
}
@@ -63,7 +63,7 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
- if self.started.get() || self.stopped.get() {
+ if self.has_start.get() || self.has_stop.get() {
return Err(Error::InvalidState);
}
@@ -93,7 +93,7 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode {
AudioScheduledSourceNodeMessage::RegisterOnEndedCallback(callback),
));
- self.started.set(true);
+ self.has_start.set(true);
self.node
.message(AudioNodeMessage::AudioScheduledSourceNode(
AudioScheduledSourceNodeMessage::Start(*when),
@@ -107,10 +107,10 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
- if !self.started.get() {
+ if !self.has_start.get() {
return Err(Error::InvalidState);
}
- self.stopped.set(true);
+ self.has_stop.set(true);
self.node
.message(AudioNodeMessage::AudioScheduledSourceNode(
AudioScheduledSourceNodeMessage::Stop(*when),
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index a234e25c27b..0c8f8380459 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -404385,6 +404385,12 @@
{}
]
],
+ "webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html": [
+ [
+ "/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html",
+ {}
+ ]
+ ],
"webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html": [
[
"/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html",
@@ -663014,6 +663020,10 @@
"612a91cf4ef60f6f1d441d27e2ab86f32b94f0fd",
"testharness"
],
+ "webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html": [
+ "dabe323cbe2226d32c63576199eda61c1aecb168",
+ "testharness"
+ ],
"webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html": [
"a2c4581c4e80069f227fe29078bc3eb6409c8b4e",
"testharness"
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index 66bd350083b..dfc61af48f0 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,73 +1,2 @@
[realtimeanalyser-fft-scaling.html]
- [X 2048-point FFT peak position is not equal to 64. Got 0.]
- expected: FAIL
-
- [X 128-point FFT peak position is not equal to 4. Got 0.]
- expected: FAIL
-
- [X 32768-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 64-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 4096-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [< [FFT scaling tests\] 22 out of 22 assertions were failed.]
- expected: FAIL
-
- [X 128-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 8192-point FFT peak position is not equal to 256. Got 0.]
- expected: FAIL
-
- [X 32-point FFT peak value in dBFS is not greater than or equal to -14.43. Got -1000.]
- expected: FAIL
-
- [X 16384-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 256-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 8192-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 1024-point FFT peak position is not equal to 32. Got 0.]
- expected: FAIL
-
- [X 64-point FFT peak position is not equal to 2. Got 0.]
- expected: FAIL
-
- [X 512-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 32-point FFT peak position is not equal to 1. Got 0.]
- expected: FAIL
-
- [X 16384-point FFT peak position is not equal to 512. Got 0.]
- expected: FAIL
-
- [X 1024-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 2048-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
- expected: FAIL
-
- [X 32768-point FFT peak position is not equal to 1024. Got 0.]
- expected: FAIL
-
- [X 4096-point FFT peak position is not equal to 128. Got 0.]
- expected: FAIL
-
- [X 512-point FFT peak position is not equal to 16. Got 0.]
- expected: FAIL
-
- [X 256-point FFT peak position is not equal to 8. Got 0.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-start.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-start.html.ini
index 9f8550d16cd..78875e26a31 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-start.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-start.html.ini
@@ -1,23 +1,20 @@
[audiobuffersource-start.html]
- [X Case 4: start(when, 4_frames, 4_frames): play with explicit non-zero offset and duration expected to be equal to the array [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 4 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t[1\]\t0.0000000000000000e+0\t5.0000000000000000e+0\n\t[2\]\t0.0000000000000000e+0\t6.0000000000000000e+0\n\t[3\]\t0.0000000000000000e+0\t7.0000000000000000e+0\n\t...and 0 more errors.]
+ [< [Tests AudioBufferSourceNode start()\] 5 out of 18 assertions were failed.]
expected: FAIL
- [X Case 5: start(when, 7_frames): play with explicit non-zero offset near end of buffer expected to be equal to the array [7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 1 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t7.0000000000000000e+0]
+ [X Case 7: start(when, 9_frames): play with explicit offset past end of buffer expected to be equal to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 7 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[2\]\t2.0000000000000000e+0\t0.0000000000000000e+0\n\t[3\]\t3.0000000000000000e+0\t0.0000000000000000e+0\n\t[4\]\t4.0000000000000000e+0\t0.0000000000000000e+0\n\t...and 3 more errors.]
expected: FAIL
- [X Case 8: start(when, 0, 15_frames): play with whole buffer, with long duration (clipped) expected to be equal to the array [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0...\] but differs in 7 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t0.0000000000000000e+0\t1.0000000000000000e+0\n\t[2\]\t0.0000000000000000e+0\t2.0000000000000000e+0\n\t[3\]\t0.0000000000000000e+0\t3.0000000000000000e+0\n\t[4\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t...and 3 more errors.]
+ [X Case 4: start(when, 4_frames, 4_frames): play with explicit non-zero offset and duration expected to be equal to the array [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 8 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t[1\]\t1.0000000000000000e+0\t5.0000000000000000e+0\n\t[2\]\t2.0000000000000000e+0\t6.0000000000000000e+0\n\t[3\]\t3.0000000000000000e+0\t7.0000000000000000e+0\n\t...and 4 more errors.]
expected: FAIL
- [X Case 1: start(when, 0): play whole buffer from beginning to end explicitly giving offset of 0 expected to be equal to the array [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0...\] but differs in 7 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t0.0000000000000000e+0\t1.0000000000000000e+0\n\t[2\]\t0.0000000000000000e+0\t2.0000000000000000e+0\n\t[3\]\t0.0000000000000000e+0\t3.0000000000000000e+0\n\t[4\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t...and 3 more errors.]
+ [X Case 6: start(when, 8_frames): play with explicit offset at end of buffer expected to be equal to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 7 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[2\]\t2.0000000000000000e+0\t0.0000000000000000e+0\n\t[3\]\t3.0000000000000000e+0\t0.0000000000000000e+0\n\t[4\]\t4.0000000000000000e+0\t0.0000000000000000e+0\n\t...and 3 more errors.]
expected: FAIL
- [X Case 2: start(when, 0, 8_frames): play whole buffer from beginning to end explicitly giving offset of 0 and duration of 8 frames expected to be equal to the array [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0...\] but differs in 7 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t0.0000000000000000e+0\t1.0000000000000000e+0\n\t[2\]\t0.0000000000000000e+0\t2.0000000000000000e+0\n\t[3\]\t0.0000000000000000e+0\t3.0000000000000000e+0\n\t[4\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t...and 3 more errors.]
+ [X Case 3: start(when, 4_frames): play with explicit non-zero offset expected to be equal to the array [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 8 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t[1\]\t1.0000000000000000e+0\t5.0000000000000000e+0\n\t[2\]\t2.0000000000000000e+0\t6.0000000000000000e+0\n\t[3\]\t3.0000000000000000e+0\t7.0000000000000000e+0\n\t...and 4 more errors.]
expected: FAIL
- [< [Tests AudioBufferSourceNode start()\] 6 out of 18 assertions were failed.]
- expected: FAIL
-
- [X Case 3: start(when, 4_frames): play with explicit non-zero offset expected to be equal to the array [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 4 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t4.0000000000000000e+0\n\t[1\]\t0.0000000000000000e+0\t5.0000000000000000e+0\n\t[2\]\t0.0000000000000000e+0\t6.0000000000000000e+0\n\t[3\]\t0.0000000000000000e+0\t7.0000000000000000e+0\n\t...and 0 more errors.]
+ [X Case 5: start(when, 7_frames): play with explicit non-zero offset near end of buffer expected to be equal to the array [7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...\] but differs in 8 places:\n\tIndex\tActual\t\t\tExpected\n\t[0\]\t0.0000000000000000e+0\t7.0000000000000000e+0\n\t[1\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[2\]\t2.0000000000000000e+0\t0.0000000000000000e+0\n\t[3\]\t3.0000000000000000e+0\t0.0000000000000000e+0\n\t...and 4 more errors.]
expected: FAIL
[# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/buffer-resampling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/buffer-resampling.html.ini
index b9a3d7942a6..f249b1f7d01 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/buffer-resampling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/buffer-resampling.html.ini
@@ -1,13 +1,13 @@
[buffer-resampling.html]
- [X SNR (0.001829 dB) is not greater than or equal to 37.17. Got 0.0018292814994553732.]
- expected: FAIL
-
[< [interpolate\] 2 out of 2 assertions were failed.]
expected: FAIL
- [X Interpolated sine wave does not equal [0,0.05756402388215065,0.11493714898824692,0.17192909121513367,0.22835086286067963,0.28401535749435425,0.3387379050254822,0.3923371136188507,0.44463518261909485,0.4954586327075958,0.5446390509605408,0.5920131802558899,0.6374239921569824,0.680720865726471,0.7217602133750916,0.760405957698822...\] with an element-wise tolerance of {"absoluteThreshold":0.090348,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[0\]\t-1.6697746515274048e-1\t0.0000000000000000e+0\t1.6697746515274048e-1\tInfinity\t9.0347999999999998e-2\n\t[1\]\t-1.7548391222953796e-1\t5.7564023882150650e-2\t2.3304793611168861e-1\t4.0484997468002177e+0\t9.0347999999999998e-2\n\t[2\]\t-1.6324132680892944e-1\t1.1493714898824692e-1\t2.7817847579717636e-1\t2.4202660170874948e+0\t9.0347999999999998e-2\n\t[3\]\t-1.3169741630554199e-1\t1.7192909121513367e-1\t3.0362650752067566e-1\t1.7659984437464975e+0\t9.0347999999999998e-2\n\t[4\]\t-8.4581792354583740e-2\t2.2835086286067963e-1\t3.1293265521526337e-1\t1.3704027709594790e+0\t9.0347999999999998e-2\n\t...and 479 more errors.\n\tMax AbsError of 1.0805229544639587e+0 at index of 20.\n\t[20\]\t-1.6697746515274048e-1\t9.1354548931121826e-1\t1.0805229544639587e+0\t1.1827795847130018e+0\t9.0347999999999998e-2\n\tMax RelError of Infinity at index of 0.\n]
+ [X Interpolated sine wave does not equal [0,0.05756402388215065,0.11493714898824692,0.17192909121513367,0.22835086286067963,0.28401535749435425,0.3387379050254822,0.3923371136188507,0.44463518261909485,0.4954586327075958,0.5446390509605408,0.5920131802558899,0.6374239921569824,0.680720865726471,0.7217602133750916,0.760405957698822...\] with an element-wise tolerance of {"absoluteThreshold":0.090348,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.3873793482780457e-1\t5.7564023882150650e-2\t2.8117391094565392e-1\t4.8845423231929379e+0\t9.0347999999999998e-2\n\t[2\]\t6.3742399215698242e-1\t1.1493714898824692e-1\t5.2248684316873550e-1\t4.5458482985528308e+0\t9.0347999999999998e-2\n\t[3\]\t8.6074203252792358e-1\t1.7192909121513367e-1\t6.8881294131278992e-1\t4.0063780739170145e+0\t9.0347999999999998e-2\n\t[4\]\t9.8228722810745239e-1\t2.2835086286067963e-1\t7.5393636524677277e-1\t3.3016576149605394e+0\t9.0347999999999998e-2\n\t[5\]\t9.8768836259841919e-1\t2.8401535749435425e-1\t7.0367300510406494e-1\t2.4775878716982858e+0\t9.0347999999999998e-2\n\t...and 470 more errors.\n\tMax AbsError of 1.9994928240776062e+0 at index of 191.\n\t[191\]\t9.9950653314590454e-1\t-9.9998629093170166e-1\t1.9994928240776062e+0\t1.9995202356370805e+0\t9.0347999999999998e-2\n\tMax RelError of 4.9225755461259340e+0 at index of 381.\n\t[381\]\t2.7899110317230225e-1\t4.7106381505727768e-2\t2.3188472166657448e-1\t4.9225755461259340e+0\t9.0347999999999998e-2\n]
expected: FAIL
[# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
expected: FAIL
+ [X SNR (-0.5698 dB) is not greater than or equal to 37.17. Got -0.5697716379745515.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-play.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-play.html.ini
index 3907c369ec7..ea403019ba7 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-play.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-play.html.ini
@@ -1,22 +1,11 @@
[note-grain-on-play.html]
- [X Number of grains that started at the correct time is not equal to 100. Got 1.]
- expected: FAIL
-
- [X Pulse 0 boundary expected to be equal to the array [0,441\] but differs in 1 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t4.8520000000000000e+3\t4.4100000000000000e+2]
- expected: FAIL
-
+ expected: TIMEOUT
[X Number of start frames is not equal to 100. Got 1.]
expected: FAIL
- [X Number of grains out of 100 that ended at the wrong time is not equal to 0. Got 1.]
- expected: FAIL
-
- [< [note-grain-on-play\] 5 out of 8 assertions were failed.]
- expected: FAIL
-
- [X Number of end frames is not equal to 100. Got 1.]
+ [X Found all grain starts and ends is not true. Got false.]
expected: FAIL
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
+ [X Number of end frames is not equal to 100. Got 0.]
expected: FAIL
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-timing.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-timing.html.ini
index c0b05abed2a..b3d4e3b20c3 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-timing.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/note-grain-on-timing.html.ini
@@ -1,22 +1,11 @@
[note-grain-on-timing.html]
- [X Number of grains that started at the correct time is not equal to 100. Got 1.]
- expected: FAIL
-
- [X Pulse 0 boundary expected to be equal to the array [0,441\] but differs in 1 places:\n\tIndex\tActual\t\t\tExpected\n\t[1\]\t4.8520000000000000e+3\t4.4100000000000000e+2]
- expected: FAIL
-
+ expected: TIMEOUT
[X Number of start frames is not equal to 100. Got 1.]
expected: FAIL
- [X Number of grains out of 100 that ended at the wrong time is not equal to 0. Got 1.]
- expected: FAIL
-
- [X Number of end frames is not equal to 100. Got 1.]
- expected: FAIL
-
- [< [Test timing of noteGrainOn\] 5 out of 6 assertions were failed.]
+ [X Number of end frames is not equal to 100. Got 0.]
expected: FAIL
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
+ [X Found all grain starts and ends is not true. Got false.]
expected: FAIL
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html.ini
deleted file mode 100644
index d3aed5f739e..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[sample-accurate-scheduling.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
- [X Number of impulses found is not equal to 9. Got 1.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audionode-interface/audionode-channel-rules.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audionode-interface/audionode-channel-rules.html.ini
index 7cb30f75b56..21c1cbe2f0d 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audionode-interface/audionode-channel-rules.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audionode-interface/audionode-channel-rules.html.ini
@@ -1,2 +1,19 @@
[audionode-channel-rules.html]
- expected: CRASH
+ [X connections: 6, explicit(1), speakers is not equal to 0.7071067690849304. Got 1.4142135381698608.]
+ expected: FAIL
+
+ [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
+ expected: FAIL
+
+ [X connections: 6, explicit(4), speakers is not equal to 0.7071067690849304. Got 1.4142135381698608.]
+ expected: FAIL
+
+ [X connections: 6, clamped-max(4), speakers is not equal to 0.7071067690849304. Got 1.4142135381698608.]
+ expected: FAIL
+
+ [< [test\] 4 out of 172 assertions were failed.]
+ expected: FAIL
+
+ [X connections: 6, explicit(2), speakers is not equal to 0.7071067690849304. Got 1.4142135381698608.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-allpass.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-allpass.html.ini
deleted file mode 100644
index 2d8af0b1bde..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-allpass.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-allpass.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Allpass filter response is not less than or equal to 3.9337e-8. Got 1.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-automation.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-automation.html.ini
index 287d87750d4..b996952e8e2 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-automation.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-automation.html.ini
@@ -1,2 +1,40 @@
[biquad-automation.html]
- expected: CRASH
+ [X Output of bandpass filter with frequency automation does not equal [0,0.27222275733947754,0.1703483760356903,-0.4806261956691742,-0.2788437604904175,0.3957056999206543,0.10840324312448502,-0.39677220582962036,0.06871235370635986,0.41004475951194763,-0.1897629052400589,-0.3590146601200104,0.29248547554016113,0.2614542245864868,-0.376722127199173,-0.14195005595684052...\] with an element-wise tolerance of {"absoluteThreshold":0.0000046455,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t2.7207741141319275e-1\t2.7222275733947754e-1\t1.4534592628479004e-4\t5.3392276129043557e-4\t4.6454999999999998e-6\n\t[2\]\t1.7056821286678314e-1\t1.7034837603569031e-1\t2.1983683109283447e-4\t1.2905132189036874e-3\t4.6454999999999998e-6\n\t[3\]\t-4.7996443510055542e-1\t-4.8062619566917419e-1\t6.6176056861877441e-4\t1.3768716199444922e-3\t4.6454999999999998e-6\n\t[4\]\t-2.7905157208442688e-1\t-2.7884376049041748e-1\t2.0781159400939941e-4\t7.4526176825298162e-4\t4.6454999999999998e-6\n\t[5\]\t3.9480346441268921e-1\t3.9570569992065430e-1\t9.0223550796508789e-4\t2.2800669996565666e-3\t4.6454999999999998e-6\n\t...and 1943 more errors.\n\tMax AbsError of 9.3662738800048828e-4 at index of 824.\n\t[824\]\t-3.0821254849433899e-1\t-3.0914917588233948e-1\t9.3662738800048828e-4\t3.0296939505896131e-3\t4.6454999999999998e-6\n\tMax RelError of 5.7019372521002287e-1 at index of 911.\n\t[911\]\t-6.8760506110265851e-4\t-1.5998022863641381e-3\t9.1219722526147962e-4\t5.7019372521002287e-1\t4.6454999999999998e-6\n]
+ expected: FAIL
+
+ [X Output of lowshelf filter with gain automation does not equal [0,0.4781356751918793,1.5511385202407837,3.0428154468536377,4.649440288543701,6.148099899291992,7.424892902374268,8.436473846435547,9.169538497924805,9.61856460571289,9.779438972473145,9.650873184204102,9.237476348876953,8.551753997802734,7.614615440368652,6.454819679260254...\] with an element-wise tolerance of {"absoluteThreshold":0.000027657,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t4.7863015532493591e-1\t4.7813567519187927e-1\t4.9448013305664063e-4\t1.0341837238106155e-3\t2.7657000000000000e-5\n\t[2\]\t1.5533078908920288e+0\t1.5511385202407837e+0\t2.1693706512451172e-3\t1.3985666804976033e-3\t2.7657000000000000e-5\n\t[3\]\t3.0478479862213135e+0\t3.0428154468536377e+0\t5.0325393676757813e-3\t1.6539088405376598e-3\t2.7657000000000000e-5\n\t[4\]\t4.6580262184143066e+0\t4.6494402885437012e+0\t8.5859298706054688e-3\t1.8466588100424354e-3\t2.7657000000000000e-5\n\t[5\]\t6.1603422164916992e+0\t6.1480998992919922e+0\t1.2242317199707031e-2\t1.9912358940551442e-3\t2.7657000000000000e-5\n\t...and 1711 more errors.\n\tMax AbsError of 2.2458076477050781e-2 at index of 11.\n\t[11\]\t9.6733312606811523e+0\t9.6508731842041016e+0\t2.2458076477050781e-2\t2.3270512469077561e-3\t2.7657000000000000e-5\n\tMax RelError of 3.9739702594466075e-1 at index of 1000.\n\t[1000\]\t-1.3141207455191761e-4\t-2.1807405573781580e-4\t8.6661981185898185e-5\t3.9739702594466075e-1\t2.7657000000000000e-5\n]
+ expected: FAIL
+
+ [< [automate-gain\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [X Output of bandpass filter with Q automation does not equal [0,0.013114781118929386,0.047823384404182434,0.09765293449163437,0.15657125413417816,0.21899054944515228,0.27981746196746826,0.3345244824886322,0.379226952791214,0.4107542335987091,0.4267079830169678,0.42550167441368103,0.40637844800949097,0.3694050908088684,0.31544122099876404,0.24608469009399414...\] with an element-wise tolerance of {"absoluteThreshold":9.8348e-7,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t1.4311081729829311e-2\t1.3114781118929386e-2\t1.1963006108999252e-3\t9.1217733643547391e-2\t9.8348000000000007e-7\n\t[2\]\t5.1837284117937088e-2\t4.7823384404182434e-2\t4.0138997137546539e-3\t8.3931736822114481e-2\t9.8348000000000007e-7\n\t[3\]\t1.0525146871805191e-1\t9.7652934491634369e-2\t7.5985342264175415e-3\t7.7811632246120421e-2\t9.8348000000000007e-7\n\t[4\]\t1.6793183982372284e-1\t1.5657125413417816e-1\t1.1360585689544678e-2\t7.2558566081414297e-2\t9.8348000000000007e-7\n\t[5\]\t2.3388034105300903e-1\t2.1899054944515228e-1\t1.4889791607856750e-2\t6.7992850127927565e-2\t9.8348000000000007e-7\n\t...and 3982 more errors.\n\tMax AbsError of 2.2362112998962402e-2 at index of 9.\n\t[9\]\t4.3311634659767151e-1\t4.1075423359870911e-1\t2.2362112998962402e-2\t5.4441588594335261e-2\t9.8348000000000007e-7\n\tMax RelError of 1.3802673474130319e+2 at index of 106.\n\t[106\]\t4.0730912587605417e-4\t-2.9724792511842679e-6\t4.1028160512723844e-4\t1.3802673474130319e+2\t9.8348000000000007e-7\n]
+ expected: FAIL
+
+ [< [modulation\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [< [automate-detune\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [X Output of bandpass filter with sinusoidal modulation of bandpass center frequency does not equal [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...\] with an element-wise tolerance of {"absoluteThreshold":0.000039787,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t1.8003740115091205e-3\t0.0000000000000000e+0\t1.8003740115091205e-3\tInfinity\t3.9786999999999997e-5\n\t[2\]\t7.1658124215900898e-3\t0.0000000000000000e+0\t7.1658124215900898e-3\tInfinity\t3.9786999999999997e-5\n\t[3\]\t1.5862563624978065e-2\t0.0000000000000000e+0\t1.5862563624978065e-2\tInfinity\t3.9786999999999997e-5\n\t[4\]\t2.7496546506881714e-2\t0.0000000000000000e+0\t2.7496546506881714e-2\tInfinity\t3.9786999999999997e-5\n\t[5\]\t4.1519120335578918e-2\t0.0000000000000000e+0\t4.1519120335578918e-2\tInfinity\t3.9786999999999997e-5\n\t...and 3994 more errors.\n\tMax AbsError of 8.2110029458999634e-1 at index of 284.\n\t[284\]\t-8.2110029458999634e-1\t0.0000000000000000e+0\t8.2110029458999634e-1\tInfinity\t3.9786999999999997e-5\n\tMax RelError of Infinity at index of 1.\n]
+ expected: FAIL
+
+ [< [automate-freq\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [X Output of bandpass filter with detune automation does not equal [0,0.0008383856620639563,0.00141120795160532,0.00036609364906325936,0.0001000093761831522,0.0012290297308936715,0.001128630479797721,0.0000010075401633002912,0.0004436193557921797,0.0014331036945804954,0.00065815937705338,-0.00011537729005794972,0.0008997227996587753,0.0013498960761353374,0.00016446926747448742,0.00006718232179991901...\] with an element-wise tolerance of {"absoluteThreshold":0.000031471,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[291\]\t-5.7049528695642948e-3\t-5.7371933944523335e-3\t3.2240524888038635e-5\t5.6195639002188952e-3\t3.1470999999999997e-5\n\t[298\]\t-5.7857087813317776e-3\t-5.8182245120406151e-3\t3.2515730708837509e-5\t5.5886002063941197e-3\t3.1470999999999997e-5\n\t[300\]\t5.4189329966902733e-3\t5.4527590982615948e-3\t3.3826101571321487e-5\t6.2034835872550572e-3\t3.1470999999999997e-5\n\t[302\]\t-5.8911093510687351e-3\t-5.9239612892270088e-3\t3.2851938158273697e-5\t5.5456031115558484e-3\t3.1470999999999997e-5\n\t[307\]\t5.0887665711343288e-3\t5.1207793876528740e-3\t3.2012816518545151e-5\t6.2515515891455598e-3\t3.1470999999999997e-5\n\t...and 3599 more errors.\n\tMax AbsError of 8.0760860443115234e+0 at index of 3999.\n\t[3999\]\t8.0760860443115234e+0\t0.0000000000000000e+0\t8.0760860443115234e+0\tInfinity\t3.1470999999999997e-5\n\tMax RelError of Infinity at index of 1087.\n\t[1087\]\t-1.2053268030285835e-2\t0.0000000000000000e+0\t1.2053268030285835e-2\tInfinity\t3.1470999999999997e-5\n]
+ expected: FAIL
+
+ [< [automate-q\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [X Output of peaking filter with automation of all parameters does not equal [0,0.9876883625984192,-0.30901700258255005,-0.8910065293312073,0.5877852439880371,0.7071067690849304,-0.80901700258255,-0.45399048924446106,0.9510565400123596,0.15643446147441864,-1,0.15643446147441864,0.9510565400123596,-0.45399048924446106,-0.80901700258255,0.7071067690849304...\] with an element-wise tolerance of {"absoluteThreshold":0.00062907,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[697\]\t-8.9218574762344360e-1\t-8.9659482240676880e-1\t4.4090747833251953e-3\t4.9175777878013201e-3\t6.2907000000000002e-4\n\t[698\]\t-3.1112471222877502e-1\t-3.0482962727546692e-1\t6.2950849533081055e-3\t2.0651158516227147e-2\t6.2907000000000002e-4\n\t[699\]\t1.0102863311767578e+0\t1.0072603225708008e+0\t3.0260086059570313e-3\t3.0041971654694377e-3\t6.2907000000000002e-4\n\t[700\]\t-3.8500450551509857e-2\t-3.7726949900388718e-2\t7.7350065112113953e-4\t2.0502602335026553e-2\t6.2907000000000002e-4\n\t[701\]\t-9.6844774484634399e-1\t-9.7246229648590088e-1\t4.0145516395568848e-3\t4.1282337156555143e-3\t6.2907000000000002e-4\n\t...and 1387 more errors.\n\tMax AbsError of 1.0665789246559143e-2 at index of 711.\n\t[711\]\t-1.8974724411964417e-1\t-2.0041303336620331e-1\t1.0665789246559143e-2\t5.3219040036533723e-2\t6.2907000000000002e-4\n\tMax RelError of 1.8183326468856040e+0 at index of 898.\n\t[898\]\t2.3241327144205570e-3\t-2.8400830924510956e-3\t5.1642158068716526e-3\t1.8183326468856040e+0\t6.2907000000000002e-4\n]
+ expected: FAIL
+
+ [< [automate-all\] 1 out of 1 assertions were failed.]
+ expected: FAIL
+
+ [# AUDIT TASK RUNNER FINISHED: 6 out of 6 tasks were failed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highpass.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highpass.html.ini
deleted file mode 100644
index ea656b8dea3..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highpass.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-highpass.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Highpass filter response is not less than or equal to 1.5487e-8. Got 0.6490383096498159.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highshelf.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highshelf.html.ini
deleted file mode 100644
index 9f5e0b56c3b..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highshelf.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-highshelf.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Highshelf filter response is not less than or equal to 6.2577e-8. Got 2.3278465244357536.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowpass.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowpass.html.ini
deleted file mode 100644
index c92fde14eba..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowpass.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-lowpass.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Lowpass filter response is not less than or equal to 9.7869e-8. Got 1.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowshelf.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowshelf.html.ini
deleted file mode 100644
index 0b0025a76fc..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-lowshelf.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-lowshelf.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Lowshelf filter response is not less than or equal to 3.8349e-8. Got 3.162277660168379.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-notch.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-notch.html.ini
deleted file mode 100644
index 740ce1ae59a..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-notch.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-notch.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Notch filter response is not less than or equal to 1.9669e-8. Got 1.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-peaking.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-peaking.html.ini
deleted file mode 100644
index 7b26daf7b82..00000000000
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-peaking.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[biquad-peaking.html]
- [< [test\] 1 out of 3 assertions were failed.]
- expected: FAIL
-
- [X Max error in Peaking filter response is not less than or equal to 5.8234e-8. Got 3.162277660168379.]
- expected: FAIL
-
- [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
- expected: FAIL
-
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html
new file mode 100644
index 00000000000..dabe323cbe2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-reuse.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>AudioBuffer can be reused between AudioBufferSourceNodes</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function render_audio_context() {
+ let sampleRate = 44100;
+ let context = new OfflineAudioContext(
+ 2, sampleRate * 0.1, sampleRate);
+ let buf = context.createBuffer(1, 0.1 * sampleRate, context.sampleRate);
+ let data = buf.getChannelData(0);
+ data[0] = 0.5;
+ data[1] = 0.25;
+ let b1 = context.createBufferSource();
+ b1.buffer = buf;
+ b1.start();
+ let b2 = context.createBufferSource();
+ b2.buffer = buf;
+ b2.start();
+ let merger = context.createChannelMerger(2);
+ b1.connect(merger, 0, 0);
+ b2.connect(merger, 0, 1);
+ merger.connect(context.destination);
+ return context.startRendering();
+}
+promise_test(function() {
+ return render_audio_context()
+ .then(function(buffer) {
+ assert_equals(buffer.getChannelData(0)[0], 0.5);
+ assert_equals(buffer.getChannelData(1)[0], 0.5);
+ assert_equals(buffer.getChannelData(0)[1], 0.25);
+ assert_equals(buffer.getChannelData(1)[1], 0.25);
+ });
+}, "AudioBuffer can be reused between AudioBufferSourceNodes");
+</script>