From 3019133c1282eede8ee542a48b3e3a3c1a3f6cea Mon Sep 17 00:00:00 2001 From: Stephen Compall Date: Thu, 27 Apr 2017 22:11:01 -0400 Subject: [PATCH 1/3] Unify access to several common channel fields --- src/apu.rs | 226 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 127 insertions(+), 99 deletions(-) diff --git a/src/apu.rs b/src/apu.rs index 6ad33da..ebd4396 100644 --- a/src/apu.rs +++ b/src/apu.rs @@ -10,28 +10,94 @@ pub struct WaveChannel { } pub struct SquareChannel { - pub counter: u16, - pub enabled: bool, + pub wave_channel: WaveChannel, pub envelope_pos: u8, pub envelope_period: u8, - pub freq_pos: u32, pub incr_vol: bool, - pub volume: u8, pub wave_pos: u8, pub duty_table: [u8; 32], } pub struct NoiseChannel { - pub counter: u16, - pub enabled: bool, + pub wave_channel: WaveChannel, pub envelope_pos: u8, - pub volume: u8, pub lfsr: u16, - pub freq_pos: u32, pub incr_vol: bool, pub envelope_period: u8, } +trait HasWaveChannel { + fn wave_channel(&mut self) -> &mut WaveChannel; + + fn counter(&mut self) -> &mut u16 { + &mut self.wave_channel().counter + } + + fn enabled(&mut self) -> &mut bool { + &mut self.wave_channel().enabled + } + + fn freq_pos(&mut self) -> &mut u32 { + &mut self.wave_channel().freq_pos + } + + fn volume(&mut self) -> &mut u8 { + &mut self.wave_channel().volume + } +} + +impl HasWaveChannel for WaveChannel { + fn wave_channel(&mut self) -> &mut WaveChannel { + self + } +} + +impl HasWaveChannel for SquareChannel { + fn wave_channel(&mut self) -> &mut WaveChannel { + &mut self.wave_channel + } +} + +impl HasWaveChannel for NoiseChannel { + fn wave_channel(&mut self) -> &mut WaveChannel { + &mut self.wave_channel + } +} + +trait HasEnvelope { + fn envelope_pos(&mut self) -> &mut u8; + fn envelope_period(&mut self) -> &mut u8; + fn incr_vol(&mut self) -> &mut bool; +} + +impl HasEnvelope for SquareChannel { + fn envelope_pos(&mut self) -> &mut u8 { + &mut self.envelope_pos + } + + fn envelope_period(&mut self) -> &mut u8 { + &mut self.envelope_period + } + + fn incr_vol(&mut self) -> &mut bool { + &mut self.incr_vol + } +} + +impl HasEnvelope for NoiseChannel { + fn envelope_pos(&mut self) -> &mut u8 { + &mut self.envelope_pos + } + + fn envelope_period(&mut self) -> &mut u8 { + &mut self.envelope_period + } + + fn incr_vol(&mut self) -> &mut bool { + &mut self.incr_vol + } +} + pub struct Apu { pub master_clock: u32, pub length_clock: u32, @@ -59,11 +125,8 @@ pub struct Apu { impl Default for NoiseChannel { fn default() -> NoiseChannel { NoiseChannel { - counter: 0, - enabled: false, + wave_channel: Default::default(), envelope_pos: 0, - volume: 0, - freq_pos: 0, lfsr: 0x7FFF, incr_vol: false, envelope_period: 0, @@ -74,11 +137,8 @@ impl Default for NoiseChannel { impl Default for SquareChannel { fn default() -> SquareChannel { SquareChannel { - counter: 0, - enabled: false, + wave_channel: Default::default(), envelope_pos: 0, - freq_pos: 0, - volume: 0, incr_vol: false, envelope_period: 0, wave_pos: 0, @@ -136,10 +196,10 @@ impl Apu { pub fn gen_samples(sample_len: u8, cpu: &mut Cpu) { let mut result = vec![0; sample_len as usize]; - if cpu.apu.channel_1.enabled { + if *cpu.apu.channel_1.enabled() { mix_channel_1(&mut result, cpu); } - if cpu.apu.channel_2.enabled { + if *cpu.apu.channel_2.enabled() { mix_channel_2(&mut result, cpu); } if cpu.apu.channel_3.enabled { @@ -162,37 +222,33 @@ pub fn queue(cpu: &mut Cpu) { cpu.apu.prev_size = cpu.apu.audio_queue.size() as i32; } +fn step_length_channel(channel: &mut T, length_enable: bool) { + if *channel.enabled() && length_enable { + if *channel.counter() == 0 { + *channel.enabled() = false; + } + *channel.counter() -= 1; + } +} + pub fn step_length(cpu: &mut Cpu) { let channel_1_length_enable = read_address(0xFF14, cpu) & 0x40 != 0; let channel_2_length_enable = read_address(0xFF19, cpu) & 0x40 != 0; let channel_3_length_enable = read_address(0xFF1E, cpu) & 0x40 != 0; let channel_4_length_enable = read_address(0xFF23, cpu) & 0x40 != 0; - if cpu.apu.channel_1.enabled && channel_1_length_enable { - if cpu.apu.channel_1.counter == 0 { - cpu.apu.channel_1.enabled = false; - } - cpu.apu.channel_1.counter -= 1; - } - if cpu.apu.channel_2.enabled && channel_2_length_enable { - if cpu.apu.channel_2.counter == 0 { - cpu.apu.channel_2.enabled = false; - } - cpu.apu.channel_2.counter -= 1; - } - - if cpu.apu.channel_3.enabled && channel_3_length_enable { - if cpu.apu.channel_3.counter == 0 { - cpu.apu.channel_3.enabled = false; - } - cpu.apu.channel_3.counter -= 1; - } - if cpu.apu.channel_4.enabled && channel_4_length_enable { - if cpu.apu.channel_4.counter == 0 { - cpu.apu.channel_4.enabled = false; + fn go(channel: &mut WaveChannel, length_enable: bool) { + if channel.enabled && length_enable { + if channel.counter == 0 { + channel.enabled = false; + } + channel.counter -= 1; } - cpu.apu.channel_4.counter -= 1; } + go(&mut cpu.apu.channel_1.wave_channel, channel_1_length_enable); + go(&mut cpu.apu.channel_2.wave_channel, channel_2_length_enable); + go(&mut cpu.apu.channel_3, channel_3_length_enable); + go(&mut cpu.apu.channel_4.wave_channel, channel_4_length_enable); } #[allow(non_snake_case)] @@ -204,7 +260,7 @@ pub fn mix_channel_1(result: &mut Vec, cpu: &mut Cpu) { let time_freq = (NR14 as u16 & 0b111) << 8 | NR13 as u16; let duty = (NR11 >> 6) as usize; let not_time_freq = 4 * (2048 - time_freq as u32); - let init_volume = cpu.apu.channel_1.volume as i16; + let init_volume = *cpu.apu.channel_1.volume() as i16; let volume_step = match left_out + right_out { 2 => (1 << 9), 1 => (1 << 8), @@ -216,7 +272,7 @@ pub fn mix_channel_1(result: &mut Vec, cpu: &mut Cpu) { let duty_start = duty * 8; if not_time_freq as u32 != 0 { let downsample = 1 + 8192 / result.len(); - let mut freq = cpu.apu.channel_1.freq_pos; + let mut freq = *cpu.apu.channel_1.freq_pos(); for x in 0..8192 { // cycles if freq == 0 { @@ -234,7 +290,7 @@ pub fn mix_channel_1(result: &mut Vec, cpu: &mut Cpu) { result[sample_idx] += sample; } } - cpu.apu.channel_1.freq_pos = freq; + *cpu.apu.channel_1.freq_pos() = freq; } } @@ -247,7 +303,7 @@ pub fn mix_channel_2(result: &mut Vec, cpu: &mut Cpu) { let time_freq = (NR24 as u16 & 0b111) << 8 | NR23 as u16; let duty = (NR21 >> 6) as usize; let not_time_freq = 4 * (2048 - time_freq as u32); - let init_volume = cpu.apu.channel_2.volume as i16; + let init_volume = *cpu.apu.channel_2.volume() as i16; let volume_step = match left_out + right_out { 2 => (1 << 9), 1 => (1 << 8), @@ -259,7 +315,7 @@ pub fn mix_channel_2(result: &mut Vec, cpu: &mut Cpu) { let duty_start = duty * 8; if not_time_freq as u32 != 0 { let downsample = 1 + 8192 / result.len(); - let mut freq = cpu.apu.channel_2.freq_pos; + let mut freq = *cpu.apu.channel_2.freq_pos(); for x in 0..8192 { // cycles if freq == 0 { @@ -277,7 +333,7 @@ pub fn mix_channel_2(result: &mut Vec, cpu: &mut Cpu) { result[sample_idx] += sample; } } - cpu.apu.channel_2.freq_pos = freq; + *cpu.apu.channel_2.freq_pos() = freq; } } @@ -334,7 +390,7 @@ pub fn mix_channel_4(result: &mut Vec, cpu: &mut Cpu) { let shift_clock_freq = NR43 >> 4 as u32; let timer_freq = dividing_ratio << shift_clock_freq; let volume_step = (1 << 9) as i16; - let volume_init = cpu.apu.channel_4.volume as i16; + let volume_init = *cpu.apu.channel_4.volume() as i16; let volume = match left_out + right_out { 2 => volume_step * volume_init, 1 => volume_step * volume_init / 2, @@ -344,7 +400,7 @@ pub fn mix_channel_4(result: &mut Vec, cpu: &mut Cpu) { let half_width = NR43 & 0x08 != 0; // whether the shift register is 15bits of 7 bits if shift_clock_freq < 15 && timer_freq as u32 != 0 { let downsample = 1 + 8192 / result.len(); - let mut freq = cpu.apu.channel_4.freq_pos; + let mut freq = *cpu.apu.channel_4.freq_pos(); for x in 0..8192 { // cycles if freq == 0 { @@ -364,7 +420,7 @@ pub fn mix_channel_4(result: &mut Vec, cpu: &mut Cpu) { result[sample_idx] += cond!((cpu.apu.channel_4.lfsr & 1) == 0, volume, -volume); } } - cpu.apu.channel_4.freq_pos = freq; + *cpu.apu.channel_4.freq_pos() = freq; } } @@ -385,7 +441,7 @@ pub fn step_sweep(cpu: &mut Cpu) { // check again let sweep_check = cpu.apu.freq_sweep(shift, negate); if sweep_check > 2047 { - cpu.apu.channel_1.enabled = false; + *cpu.apu.channel_1.enabled() = false; } } } else { @@ -395,57 +451,29 @@ pub fn step_sweep(cpu: &mut Cpu) { } pub fn step_envelope(cpu: &mut Cpu) { - if cpu.apu.channel_1.enabled && cpu.apu.channel_1.envelope_period != 0 { - if cpu.apu.channel_1.incr_vol && cpu.apu.channel_1.volume < 15 { - if cpu.apu.channel_1.envelope_pos == 0 { - cpu.apu.channel_1.volume += 1; - cpu.apu.channel_1.envelope_pos = cpu.apu.channel_1.envelope_period; - } else { - cpu.apu.channel_1.envelope_pos -= 1; - } - } else if !cpu.apu.channel_1.incr_vol && cpu.apu.channel_1.volume > 0 { - if cpu.apu.channel_1.envelope_pos == 0 { - cpu.apu.channel_1.volume -= 1; - cpu.apu.channel_1.envelope_pos = cpu.apu.channel_1.envelope_period; - } else { - cpu.apu.channel_1.envelope_pos -= 1; - } - } - } - if cpu.apu.channel_2.enabled && cpu.apu.channel_2.envelope_period != 0 { - if cpu.apu.channel_2.incr_vol && cpu.apu.channel_2.volume < 15 { - if cpu.apu.channel_2.envelope_pos == 0 { - cpu.apu.channel_2.volume += 1; - cpu.apu.channel_2.envelope_pos = cpu.apu.channel_2.envelope_period; - } else { - cpu.apu.channel_2.envelope_pos -= 1; - } - } else if !cpu.apu.channel_2.incr_vol && cpu.apu.channel_2.volume > 0 { - if cpu.apu.channel_2.envelope_pos == 0 { - cpu.apu.channel_2.volume -= 1; - cpu.apu.channel_2.envelope_pos = cpu.apu.channel_2.envelope_period; - } else { - cpu.apu.channel_2.envelope_pos -= 1; - } - } - } - if cpu.apu.channel_4.enabled && cpu.apu.channel_4.envelope_period != 0 { - if cpu.apu.channel_4.incr_vol && cpu.apu.channel_4.volume < 15 { - if cpu.apu.channel_4.envelope_pos == 0 { - cpu.apu.channel_4.volume += 1; - cpu.apu.channel_4.envelope_pos = cpu.apu.channel_4.envelope_period; - } else { - cpu.apu.channel_4.envelope_pos -= 1; - } - } else if !cpu.apu.channel_4.incr_vol && cpu.apu.channel_4.volume > 0 { - if cpu.apu.channel_4.envelope_pos == 0 { - cpu.apu.channel_4.volume -= 1; - cpu.apu.channel_4.envelope_pos = cpu.apu.channel_4.envelope_period; - } else { - cpu.apu.channel_4.envelope_pos -= 1; + fn go(channel: &mut T) { + let &mut wave_channel = channel.wave_channel(); + if wave_channel.enabled && *channel.envelope_period() != 0 { + if *channel.incr_vol() && wave_channel.volume < 15 { + if *channel.envelope_pos() == 0 { + wave_channel.volume += 1; + *channel.envelope_pos() = *channel.envelope_period(); + } else { + *channel.envelope_pos() -= 1; + } + } else if !*channel.incr_vol() && wave_channel.volume > 0 { + if *channel.envelope_pos() == 0 { + wave_channel.volume -= 1; + *channel.envelope_pos() = *channel.envelope_period(); + } else { + *channel.envelope_pos() -= 1; + } } } } + go(&mut cpu.apu.channel_1); + go(&mut cpu.apu.channel_2); + go(&mut cpu.apu.channel_4); } pub fn step(cpu: &mut Cpu) { From b2b3431d72de6c297de99fedc524ae7eeb088ec3 Mon Sep 17 00:00:00 2001 From: Stephen Compall Date: Thu, 27 Apr 2017 22:22:59 -0400 Subject: [PATCH 2/3] Propagate apu channel property changes to cpu --- src/apu.rs | 2 +- src/cpu.rs | 64 +++++++++++++++++++++++++++--------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/apu.rs b/src/apu.rs index ebd4396..6073839 100644 --- a/src/apu.rs +++ b/src/apu.rs @@ -26,7 +26,7 @@ pub struct NoiseChannel { pub envelope_period: u8, } -trait HasWaveChannel { +pub trait HasWaveChannel { fn wave_channel(&mut self) -> &mut WaveChannel; fn counter(&mut self) -> &mut u16 { diff --git a/src/cpu.rs b/src/cpu.rs index c3b5dd5..31a499a 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -188,22 +188,22 @@ pub fn write_nx4_address(address: usize, val: u8, cpu: &mut Cpu) -> () { let nr14 = read_address(0xFF14, cpu); let time_freq = (nr14 as u16 & 0b111) << 8 | nr13 as u16; let not_time_freq = 4 * (2048 - time_freq as u32); - cpu.apu.channel_1.enabled = true; - if cpu.apu.channel_1.counter == 0 { - cpu.apu.channel_1.counter = 64; + *cpu.apu.channel_1.enabled() = true; + if *cpu.apu.channel_1.counter() == 0 { + *cpu.apu.channel_1.counter() = 64; } cpu.apu.channel_1.envelope_pos = nr12 & 7; - cpu.apu.channel_1.freq_pos = not_time_freq; + *cpu.apu.channel_1.freq_pos() = not_time_freq; cpu.apu.channel_1_shadow_freq = not_time_freq; cpu.apu.sweep_period = (nr10 >> 4) & 7; cpu.apu.sweep_clock = cpu.apu.sweep_period; let shift = nr10 & 7; cpu.apu.sweeping = cpu.apu.sweep_clock != 0 || shift != 0; cpu.apu.sweep_negate = (nr10 & 8) != 0; - cpu.apu.channel_1.volume = (nr12 & 0xF0) >> 4; - cpu.apu.channel_1.enabled = nr12 & 0xF8 != 0; + *cpu.apu.channel_1.volume() = (nr12 & 0xF0) >> 4; + *cpu.apu.channel_1.enabled() = nr12 & 0xF8 != 0; if cpu.apu.sweeping && cpu.apu.freq_sweep(shift, cpu.apu.sweep_negate) > 2047 { - cpu.apu.channel_1.enabled = false; + *cpu.apu.channel_1.enabled() = false; } } @@ -213,20 +213,20 @@ pub fn write_nx4_address(address: usize, val: u8, cpu: &mut Cpu) -> () { let nr24 = read_address(0xFF19, cpu); let time_freq = (nr24 as u16 & 0b111) << 8 | nr23 as u16; let not_time_freq = 4 * (2048 - time_freq as u32); - cpu.apu.channel_2.enabled = true; - if cpu.apu.channel_2.counter == 0 { - cpu.apu.channel_2.counter = 64; + *cpu.apu.channel_2.enabled() = true; + if *cpu.apu.channel_2.counter() == 0 { + *cpu.apu.channel_2.counter() = 64; } cpu.apu.channel_2.envelope_pos = nr22 & 7; - cpu.apu.channel_2.freq_pos = not_time_freq; - cpu.apu.channel_2.volume = (nr22 & 0xF0) >> 4; - cpu.apu.channel_2.enabled = nr22 & 0xF8 != 0; + *cpu.apu.channel_2.freq_pos() = not_time_freq; + *cpu.apu.channel_2.volume() = (nr22 & 0xF0) >> 4; + *cpu.apu.channel_2.enabled() = nr22 & 0xF8 != 0; // println!("Wrote {:4>0X} to NR24", val); } 0xFF1E => { - cpu.apu.channel_3.enabled = true; - if cpu.apu.channel_3.counter == 0 { - cpu.apu.channel_3.counter = 256; + *cpu.apu.channel_3.enabled() = true; + if *cpu.apu.channel_3.counter() == 0 { + *cpu.apu.channel_3.counter() = 256; } cpu.apu.channel_3_wave_pos = 0; let nr32 = read_address(0xFF1C, cpu); @@ -235,8 +235,8 @@ pub fn write_nx4_address(address: usize, val: u8, cpu: &mut Cpu) -> () { (read_address(0xFF1D, cpu) as u32 | (read_address(0xFF1E, cpu) as u32) << 8) & 0x7F); - cpu.apu.channel_3.volume = (nr32 & 0x60) >> 5; - cpu.apu.channel_3.enabled = (read_address(0xFF1A, cpu) & 0x80) != 0; + *cpu.apu.channel_3.volume() = (nr32 & 0x60) >> 5; + *cpu.apu.channel_3.enabled() = (read_address(0xFF1A, cpu) & 0x80) != 0; } 0xFF23 => { let nr42 = read_address(0xFF21, cpu); @@ -245,15 +245,15 @@ pub fn write_nx4_address(address: usize, val: u8, cpu: &mut Cpu) -> () { let dividing_ratio = divisors[(nr43 & 0x7) as usize]; let shift_clock_freq = nr43 >> 4 as u32; let timer_freq = dividing_ratio << shift_clock_freq; - cpu.apu.channel_4.enabled = true; - if cpu.apu.channel_4.counter == 0 { - cpu.apu.channel_4.counter = 64; + *cpu.apu.channel_4.enabled() = true; + if *cpu.apu.channel_4.counter() == 0 { + *cpu.apu.channel_4.counter() = 64; } cpu.apu.channel_4.lfsr = 0x7FFF; - cpu.apu.channel_4.freq_pos = timer_freq; + *cpu.apu.channel_4.freq_pos() = timer_freq; cpu.apu.channel_4.envelope_pos = nr42 & 7; - cpu.apu.channel_4.volume = nr42 >> 4; - cpu.apu.channel_4.enabled = nr42 & 0xF8 != 0; + *cpu.apu.channel_4.volume() = nr42 >> 4; + *cpu.apu.channel_4.enabled() = nr42 & 0xF8 != 0; // println!("Wrote {:4>0X} to NR44", val); } _ => {} @@ -294,12 +294,12 @@ pub fn safe_write_address(address: usize, val: u8, cpu: &mut Cpu) -> () { 0xFF04 => write_address(address, 0, cpu), 0xFF10 => write_address(address, val, cpu), //NR 10 Sound Mode 1 Sweep Register 0xFF11 => { - cpu.apu.channel_1.counter = 64 - (val & 0x3F) as u16; + *cpu.apu.channel_1.counter() = 64 - (val & 0x3F) as u16; write_address(address, val, cpu); } //NR 11 Sound Mode 1 Duty/Sound length 0xFF12 => { let (vol_init, vol_add, vol_period) = (val >> 4, val & 8 != 0, val & 7); - cpu.apu.channel_1.volume = vol_init; + *cpu.apu.channel_1.volume() = vol_init; cpu.apu.channel_1.incr_vol = vol_add; cpu.apu.channel_1.envelope_period = vol_period; write_address(address, val, cpu) @@ -307,12 +307,12 @@ pub fn safe_write_address(address: usize, val: u8, cpu: &mut Cpu) -> () { 0xFF13 => write_address(address, val, cpu), //NR 13 Sound Mode 1 Frequency lo 0xFF14 => write_nx4_address(address, val, cpu), //NR 14 Sound Mode 1 Frequency hi 0xFF16 => { - cpu.apu.channel_2.counter = 64 - (val & 0x3F) as u16; + *cpu.apu.channel_2.counter() = 64 - (val & 0x3F) as u16; write_address(address, val, cpu); } //NR 21 Sound Mode 2 Duty/Sound length 0xFF17 => { let (vol_init, vol_add, vol_period) = (val >> 4, val & 8 != 0, val & 7); - cpu.apu.channel_2.volume = vol_init; + *cpu.apu.channel_2.volume() = vol_init; cpu.apu.channel_2.incr_vol = vol_add; cpu.apu.channel_2.envelope_period = vol_period; write_address(address, val, cpu) @@ -321,19 +321,19 @@ pub fn safe_write_address(address: usize, val: u8, cpu: &mut Cpu) -> () { 0xFF19 => write_nx4_address(address, val, cpu), //NR 24 Sound Mode 2 Frequency hi 0xFF1A => write_address(address, val, cpu), //NR 30 Sound Mode 3 On/Off 0xFF1B => { - cpu.apu.channel_3.counter = 256 - val as u16; + *cpu.apu.channel_3.counter() = 256 - val as u16; write_address(address, val, cpu); } //NR 31 Sound Mode 3 Sound length 0xFF1C => write_address(address, val, cpu), //NR 32 Sound Mode 3 Select Output Level 0xFF1D => write_address(address, val, cpu), //NR 33 Sound Mode 3 Frequency lo 0xFF1E => write_nx4_address(address, val, cpu), //NR 34 Sound Mode 3 Frequency hi 0xFF20 => { - cpu.apu.channel_4.counter = 64 - (val & 0x3F) as u16; + *cpu.apu.channel_4.counter() = 64 - (val & 0x3F) as u16; write_address(address, val, cpu); } //NR 41 Sound Mode 4 Sound length 0xFF21 => { let (vol_init, vol_add, vol_period) = (val >> 4, val & 8 != 0, val & 7); - cpu.apu.channel_4.volume = vol_init; + *cpu.apu.channel_4.volume() = vol_init; cpu.apu.channel_4.incr_vol = vol_add; cpu.apu.channel_4.envelope_period = vol_period; write_address(address, val, cpu); @@ -570,4 +570,4 @@ pub fn stack_pop(cpu: &mut Cpu) -> u16 { cpu.sp = cpu.sp.wrapping_add(2); let res = (l_byte << 8) + r_byte; res -} \ No newline at end of file +} From 9a44d5dd862426e2af97e3ec8f5e79e282ef7eb3 Mon Sep 17 00:00:00 2001 From: Stephen Compall Date: Thu, 27 Apr 2017 22:26:37 -0400 Subject: [PATCH 3/3] Avoid duplicate borrow in step_envelope.go; compiles --- src/apu.rs | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/apu.rs b/src/apu.rs index 6073839..9021663 100644 --- a/src/apu.rs +++ b/src/apu.rs @@ -205,7 +205,7 @@ pub fn gen_samples(sample_len: u8, cpu: &mut Cpu) { if cpu.apu.channel_3.enabled { mix_channel_3(&mut result, cpu); } - if cpu.apu.channel_4.enabled { + if *cpu.apu.channel_4.enabled() { mix_channel_4(&mut result, cpu); } cpu.apu.audio_vec_queue.append(&mut result); @@ -222,15 +222,6 @@ pub fn queue(cpu: &mut Cpu) { cpu.apu.prev_size = cpu.apu.audio_queue.size() as i32; } -fn step_length_channel(channel: &mut T, length_enable: bool) { - if *channel.enabled() && length_enable { - if *channel.counter() == 0 { - *channel.enabled() = false; - } - *channel.counter() -= 1; - } -} - pub fn step_length(cpu: &mut Cpu) { let channel_1_length_enable = read_address(0xFF14, cpu) & 0x40 != 0; let channel_2_length_enable = read_address(0xFF19, cpu) & 0x40 != 0; @@ -452,18 +443,17 @@ pub fn step_sweep(cpu: &mut Cpu) { pub fn step_envelope(cpu: &mut Cpu) { fn go(channel: &mut T) { - let &mut wave_channel = channel.wave_channel(); - if wave_channel.enabled && *channel.envelope_period() != 0 { - if *channel.incr_vol() && wave_channel.volume < 15 { + if *channel.enabled() && *channel.envelope_period() != 0 { + if *channel.incr_vol() && *channel.volume() < 15 { if *channel.envelope_pos() == 0 { - wave_channel.volume += 1; + *channel.volume() += 1; *channel.envelope_pos() = *channel.envelope_period(); } else { *channel.envelope_pos() -= 1; } - } else if !*channel.incr_vol() && wave_channel.volume > 0 { + } else if !*channel.incr_vol() && *channel.volume() > 0 { if *channel.envelope_pos() == 0 { - wave_channel.volume -= 1; + *channel.volume() -= 1; *channel.envelope_pos() = *channel.envelope_period(); } else { *channel.envelope_pos() -= 1;