Skip to content

Commit f43ce60

Browse files
authored
Merge pull request #403 from orottier/feature/prevent-wpt-crashes
Prevent the wpt-runner from crashing by avoiding some panics
2 parents 13dd3f8 + 8688906 commit f43ce60

File tree

6 files changed

+182
-256
lines changed

6 files changed

+182
-256
lines changed

src/node/channel_merger.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl AudioNode for ChannelMergerNode {
6565
impl ChannelMergerNode {
6666
pub fn new<C: BaseAudioContext>(context: &C, mut options: ChannelMergerOptions) -> Self {
6767
context.register(move |registration| {
68+
crate::assert_valid_number_of_channels(options.number_of_inputs);
6869
options.channel_config.count = options.number_of_inputs;
6970

7071
let node = ChannelMergerNode {

src/node/channel_splitter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ impl AudioNode for ChannelSplitterNode {
6969
impl ChannelSplitterNode {
7070
pub fn new<C: BaseAudioContext>(context: &C, mut options: ChannelSplitterOptions) -> Self {
7171
context.register(move |registration| {
72+
crate::assert_valid_number_of_channels(options.number_of_outputs);
7273
options.channel_config.count = options.number_of_outputs;
7374

7475
let node = ChannelSplitterNode {

src/node/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ impl ChannelConfig {
211211

212212
impl From<ChannelConfigOptions> for ChannelConfig {
213213
fn from(opts: ChannelConfigOptions) -> Self {
214+
crate::assert_valid_number_of_channels(opts.count);
215+
214216
let inner = ChannelConfigInner {
215217
count: AtomicUsize::from(opts.count),
216218
count_mode: AtomicU32::from(opts.count_mode as u32),

src/node/panner.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,27 @@ use super::{
2323
pub(crate) fn load_hrtf_processor(sample_rate: u32) -> (HrtfProcessor, usize) {
2424
static INSTANCE: OnceLock<Mutex<HashMap<u32, (HrtfProcessor, usize)>>> = OnceLock::new();
2525
let cache = INSTANCE.get_or_init(|| Mutex::new(HashMap::new()));
26-
let mut guard = cache.lock().unwrap();
27-
guard
28-
.entry(sample_rate)
29-
.or_insert_with(|| {
30-
let resource = include_bytes!("../../resources/IRC_1003_C.bin");
31-
let hrir_sphere = HrirSphere::new(&resource[..], sample_rate).unwrap();
32-
let len = hrir_sphere.len();
33-
34-
let interpolation_steps = 1; // TODO?
35-
let samples_per_step = RENDER_QUANTUM_SIZE / interpolation_steps;
36-
let processor = HrtfProcessor::new(hrir_sphere, interpolation_steps, samples_per_step);
37-
38-
(processor, len)
39-
})
40-
.clone()
26+
27+
// To avoid poisening the cache mutex, don't use the `entry()` API on HashMap
28+
{
29+
if let Some(value) = cache.lock().unwrap().get(&sample_rate) {
30+
return value.clone();
31+
}
32+
}
33+
34+
// The following snippet might panic
35+
let resource = include_bytes!("../../resources/IRC_1003_C.bin");
36+
let hrir_sphere = HrirSphere::new(&resource[..], sample_rate).unwrap();
37+
let len = hrir_sphere.len();
38+
39+
let interpolation_steps = 1; // TODO?
40+
let samples_per_step = RENDER_QUANTUM_SIZE / interpolation_steps;
41+
let processor = HrtfProcessor::new(hrir_sphere, interpolation_steps, samples_per_step);
42+
43+
let value = (processor, len);
44+
cache.lock().unwrap().insert(sample_rate, value.clone());
45+
46+
value
4147
}
4248

4349
/// Spatialization algorithm used to position the audio in 3D space

0 commit comments

Comments
 (0)