Skip to content

Commit 48caf24

Browse files
authored
Merge pull request #452 from orottier/bugfix/buffersource-panic-duration
AudioBufferSourceNode: fix panic when duration exceeds buffer len
2 parents 612f6f1 + e338ab6 commit 48caf24

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

src/node/audio_buffer_source.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ impl AudioProcessor for AudioBufferSourceRenderer {
558558
{
559559
let dt = (self.stop_time - block_time).min(self.duration - buffer_time);
560560
let end_buffer_time = buffer_time + dt;
561-
(end_buffer_time * sample_rate).round() as usize
561+
let end_index = (end_buffer_time * sample_rate).round() as usize;
562+
end_index.min(buffer.length())
562563
} else {
563564
buffer.length()
564565
};
@@ -1414,4 +1415,34 @@ mod tests {
14141415
);
14151416
}
14161417
}
1418+
1419+
#[test]
1420+
// regression test for #452
1421+
// - fast track
1422+
// - duration not set so `self.duration` is `f64::MAX`
1423+
// - stop time is > buffer length
1424+
fn test_end_of_file_fast_track_2() {
1425+
let sample_rate = 48_000.;
1426+
let mut context = OfflineAudioContext::new(1, RENDER_QUANTUM_SIZE, sample_rate);
1427+
1428+
let mut buffer = context.create_buffer(1, 5, sample_rate);
1429+
let data = vec![1.; 1];
1430+
buffer.copy_to_channel(&data, 0);
1431+
1432+
let mut src = context.create_buffer_source();
1433+
src.connect(&context.destination());
1434+
src.set_buffer(buffer);
1435+
// play in fast track
1436+
src.start_at(0.);
1437+
// stop after end of buffer but before the end of render quantum
1438+
src.stop_at(125. / sample_rate as f64);
1439+
1440+
let result = context.start_rendering_sync();
1441+
let channel = result.get_channel_data(0);
1442+
1443+
let mut expected = vec![0.; 128];
1444+
expected[0] = 1.;
1445+
1446+
assert_float_eq!(channel[..], expected[..], abs_all <= 0.);
1447+
}
14171448
}

0 commit comments

Comments
 (0)