Skip to content

Commit 9f84925

Browse files
committed
Fixes arithmetic overflows and underflows in audio.rs
1 parent 8094be6 commit 9f84925

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

.travis.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ addons:
1010
packages:
1111
- libasound2-dev
1212
script:
13-
cargo build --release
13+
- cargo build --release
1414
before_deploy:
15-
mv target/release/dos-emulator dos-emulator
16-
strip dos-emulator
17-
zip $TRAVIS_OS_NAME.zip dos-emulator config.toml
15+
- mv target/release/dos-emulator dos-emulator
16+
- strip dos-emulator
17+
- zip $TRAVIS_OS_NAME.zip dos-emulator config.toml
1818
deploy:
1919
edge: true
2020
provider: releases

src/audio.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub fn fill_lookup_tables(output_sample_rate: u32) {
3838
let key_scaling_level_template = [64, 32, 24, 19, 16, 12, 11, 10, 8, 6, 5, 4, 3, 2, 1, 0];
3939
for octave in 0..8 {
4040
for i in 0..16 {
41-
KEY_SCALING_LEVEL_TABLE[octave*16+i] = (octave*8-key_scaling_level_template[i]).max(0) as u8;
41+
KEY_SCALING_LEVEL_TABLE[octave*16+i] = ((octave*8) as isize-key_scaling_level_template[i] as isize).max(0) as u8;
4242
}
4343
}
4444
let rate_factor = (1<<ENVELOPE_PHASE_SHIFT) as f32/output_sample_rate as f32*ENVELOPE_CLOCK_FREQUENCY;
@@ -134,7 +134,7 @@ impl Oscillator {
134134
},
135135
EnvelopeState::Attack => {
136136
self.envelope_phase += self.settings.attack_increment;
137-
self.envelope_volume += (!(self.envelope_volume/8))*(self.envelope_phase>>ENVELOPE_PHASE_SHIFT);
137+
self.envelope_volume = (self.envelope_volume as i32+(-1-(self.envelope_volume/8) as i32)*(self.envelope_phase>>ENVELOPE_PHASE_SHIFT) as i32) as u32;
138138
self.envelope_phase &= ENVELOPE_PHASE_MASK;
139139
if self.envelope_volume > ENVELOPE_MAX {
140140
self.envelope_volume = 0;
@@ -176,8 +176,8 @@ impl Oscillator {
176176

177177
fn calculate_sample(&mut self, lfo: &LowFrequencyOscillator, mut volume: u32, phase: i32) -> i32 {
178178
let silent = volume >= SICLENCE_THRESHOLD;
179-
let vibrato_value = ((self.settings.vibrato>>lfo.vibrato_shift)^lfo.vibrato_sign_mask)-lfo.vibrato_sign_mask;
180-
self.phase = self.phase.wrapping_add(self.settings.phase_increment+vibrato_value);
179+
let vibrato_value = ((self.settings.vibrato>>lfo.vibrato_shift)^lfo.vibrato_sign_mask) as i32-lfo.vibrato_sign_mask as i32;
180+
self.phase = (self.phase as i32).wrapping_add(self.settings.phase_increment as i32+vibrato_value) as u32;
181181
volume += lfo.tremolo_value*(self.settings.tremolo_enabled as u32);
182182
let signal = calculate_sample(self.settings.waveform, (volume as i32)<<3, phase&PHASE_MASK);
183183
if silent { 0 } else { signal }
@@ -344,7 +344,7 @@ macro_rules! fill_buffer {
344344
($cpu:ident, $bus:ident, $audio_renderer:ident, $buffer:ident, $signal:ident, $T:ty, $($convert:tt)*) => {
345345
let sample_count = $buffer.len()/$audio_renderer.output_channels;
346346
$audio_renderer.clock_cycles_per_sample = (CLOCK_FREQUENCY_FACTOR as f64*$bus.config.timing.clock_frequency/$audio_renderer.output_sample_rate as f64) as u64;
347-
$audio_renderer.cycle_counter = CLOCK_FREQUENCY_FACTOR*$cpu.cycle_counter-$audio_renderer.clock_cycles_per_sample*sample_count as u64;
347+
$audio_renderer.cycle_counter = (CLOCK_FREQUENCY_FACTOR as i64*$cpu.cycle_counter as i64-$audio_renderer.clock_cycles_per_sample as i64*sample_count as i64).max(0) as u64;
348348
if $cpu.execution_state != crate::cpu::ExecutionState::Running {
349349
for element in $buffer.iter_mut() {
350350
let $signal: i16 = 0;

0 commit comments

Comments
 (0)