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

View file

@ -179,9 +179,27 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
fn Start(
&self,
when: Finite<f64>,
_offset: Option<Finite<f64>>,
_duration: Option<Finite<f64>>,
offset: Option<Finite<f64>>,
duration: Option<Finite<f64>>,
) -> 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() {
let buffer = buffer.acquire_contents();
self.source_node