Use buffer_set flag for AudioBufferSourceNode buffer setter

This commit is contained in:
Fernando Jiménez Moreno 2018-09-24 11:23:15 +02:00
parent ea2ca7ed4a
commit bbc3565900

View file

@ -29,6 +29,7 @@ use std::f32;
pub struct AudioBufferSourceNode {
source_node: AudioScheduledSourceNode,
buffer: MutNullableDom<AudioBuffer>,
buffer_set: Cell<bool>,
playback_rate: Dom<AudioParam>,
detune: Dom<AudioParam>,
loop_enabled: Cell<bool>,
@ -75,6 +76,7 @@ impl AudioBufferSourceNode {
let node = AudioBufferSourceNode {
source_node,
buffer: Default::default(),
buffer_set: Cell::new(false),
playback_rate: Dom::from_ref(&playback_rate),
detune: Dom::from_ref(&detune),
loop_enabled: Cell::new(options.loop_),
@ -122,12 +124,19 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
// https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer
fn SetBuffer(&self, new_buffer: Option<&AudioBuffer>) -> Fallible<()> {
if new_buffer.is_some() && self.buffer.get().is_some() {
return Err(Error::InvalidState);
if new_buffer.is_some() {
if self.buffer_set.get() {
// Step 2.
return Err(Error::InvalidState);
}
// Step 3.
self.buffer_set.set(true);
}
// Step 4.
self.buffer.set(new_buffer);
// Step 5.
if self.source_node.started() {
if let Some(buffer) = self.buffer.get() {
let buffer = buffer.acquire_contents();