mirror of
https://github.com/servo/servo.git
synced 2025-07-18 04:43:41 +01:00
Throw if AudioBufferSourceNode.Start params are negative
This commit is contained in:
parent
3b8cb83e04
commit
b738d9a912
2 changed files with 28 additions and 16 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue