Throw if AudioBufferSourceNode.Start params are negative

This commit is contained in:
Fernando Jiménez Moreno 2018-07-30 19:54:55 +02:00
parent 3b8cb83e04
commit b738d9a912
2 changed files with 28 additions and 16 deletions

View file

@ -40,11 +40,7 @@ pub struct AudioBuffer {
impl AudioBuffer { impl AudioBuffer {
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
#[allow(unsafe_code)] #[allow(unsafe_code)]
pub fn new_inherited( pub fn new_inherited(number_of_channels: u32, length: u32, sample_rate: f32) -> AudioBuffer {
number_of_channels: u32,
length: u32,
sample_rate: f32,
) -> AudioBuffer {
let vec = (0..number_of_channels).map(|_| Heap::default()).collect(); let vec = (0..number_of_channels).map(|_| Heap::default()).collect();
AudioBuffer { AudioBuffer {
reflector_: Reflector::new(), reflector_: Reflector::new(),
@ -68,11 +64,7 @@ impl AudioBuffer {
sample_rate: f32, sample_rate: f32,
initial_data: Option<&[f32]>, initial_data: Option<&[f32]>,
) -> DomRoot<AudioBuffer> { ) -> DomRoot<AudioBuffer> {
let buffer = AudioBuffer::new_inherited( let buffer = AudioBuffer::new_inherited(number_of_channels, length, sample_rate);
number_of_channels,
length,
sample_rate,
);
let buffer = reflect_dom_object(Box::new(buffer), global, AudioBufferBinding::Wrap); let buffer = reflect_dom_object(Box::new(buffer), global, AudioBufferBinding::Wrap);
buffer.set_channels(initial_data); buffer.set_channels(initial_data);
buffer buffer
@ -85,7 +77,8 @@ impl AudioBuffer {
) -> Fallible<DomRoot<AudioBuffer>> { ) -> Fallible<DomRoot<AudioBuffer>> {
if options.numberOfChannels > MAX_CHANNEL_COUNT || if options.numberOfChannels > MAX_CHANNEL_COUNT ||
*options.sampleRate < MIN_SAMPLE_RATE || *options.sampleRate < MIN_SAMPLE_RATE ||
*options.sampleRate > MAX_SAMPLE_RATE { *options.sampleRate > MAX_SAMPLE_RATE
{
return Err(Error::NotSupported); return Err(Error::NotSupported);
} }
Ok(AudioBuffer::new( Ok(AudioBuffer::new(
@ -124,7 +117,7 @@ impl AudioBuffer {
array.handle_mut(), array.handle_mut(),
) )
}; };
} },
} }
chans[channel as usize].set(array.get()); chans[channel as usize].set(array.get());
} }
@ -167,7 +160,8 @@ impl AudioBuffer {
typedarray!(in(cx) let array: Float32Array = channel.get()); typedarray!(in(cx) let array: Float32Array = channel.get());
if let Ok(array) = array { if let Ok(array) = array {
let data = array.to_vec(); let data = array.to_vec();
let _ = JS_DetachArrayBuffer(cx, channel.handle(), DetachDataDisposition::KeepData); let _ =
JS_DetachArrayBuffer(cx, channel.handle(), DetachDataDisposition::KeepData);
data data
} else { } else {
return None; return None;

View file

@ -179,9 +179,27 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
fn Start( fn Start(
&self, &self,
when: Finite<f64>, when: Finite<f64>,
_offset: Option<Finite<f64>>, offset: Option<Finite<f64>>,
_duration: Option<Finite<f64>>, duration: Option<Finite<f64>>,
) -> Fallible<()> { ) -> Fallible<()> {
if *when < 0. {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
if let Some(offset) = offset {
if *offset < 0. {
return Err(Error::Range("'offset' must be a positive value".to_owned()));
}
}
if let Some(duration) = duration {
if *duration < 0. {
return Err(Error::Range(
"'duration' must be a positive value".to_owned(),
));
}
}
if let Some(buffer) = self.buffer.get() { if let Some(buffer) = self.buffer.get() {
let buffer = buffer.acquire_contents(); let buffer = buffer.acquire_contents();
self.source_node self.source_node