reorganise
This commit is contained in:
parent
08da9f7857
commit
e60426fe0f
|
@ -1,5 +1,7 @@
|
||||||
use std::sync::mpsc::{channel, Sender};
|
use self::{
|
||||||
|
channels::EnvelopeMode,
|
||||||
|
types::{Channels, DacSample, Mixer, VinEnable, Volume},
|
||||||
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
processor::{
|
processor::{
|
||||||
memory::{masked_update, Address},
|
memory::{masked_update, Address},
|
||||||
|
@ -13,10 +15,10 @@ use cpal::{
|
||||||
Device, Stream, StreamConfig,
|
Device, Stream, StreamConfig,
|
||||||
};
|
};
|
||||||
use samplerate::{ConverterType, Samplerate};
|
use samplerate::{ConverterType, Samplerate};
|
||||||
|
use std::sync::mpsc::{channel, Sender};
|
||||||
use self::channels::{EnvelopeMode, NoiseChannel, PwmChannel, WaveChannel};
|
|
||||||
|
|
||||||
mod channels;
|
mod channels;
|
||||||
|
mod types;
|
||||||
|
|
||||||
const MEM_START: usize = 0xFF10;
|
const MEM_START: usize = 0xFF10;
|
||||||
const MEM_SIZE: usize = 0xFF40 - MEM_START;
|
const MEM_SIZE: usize = 0xFF40 - MEM_START;
|
||||||
|
@ -25,107 +27,6 @@ const fn reg(a: Address) -> usize {
|
||||||
(a as usize) - MEM_START
|
(a as usize) - MEM_START
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Channels {
|
|
||||||
one: PwmChannel,
|
|
||||||
two: PwmChannel,
|
|
||||||
three: WaveChannel,
|
|
||||||
four: NoiseChannel,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Channels {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
one: PwmChannel::new(true),
|
|
||||||
two: PwmChannel::new(false),
|
|
||||||
three: WaveChannel::new(false),
|
|
||||||
four: NoiseChannel::new(false),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
struct VinEnable {
|
|
||||||
left: bool,
|
|
||||||
right: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Volume {
|
|
||||||
Muted,
|
|
||||||
Enabled,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Volume {
|
|
||||||
fn scale(&self) -> f32 {
|
|
||||||
match self {
|
|
||||||
Volume::Muted => 0.,
|
|
||||||
Volume::Enabled => 1.,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bool(&self) -> bool {
|
|
||||||
match self {
|
|
||||||
Volume::Muted => false,
|
|
||||||
Volume::Enabled => true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn from_bool(val: bool) -> Self {
|
|
||||||
if val {
|
|
||||||
Self::Enabled
|
|
||||||
} else {
|
|
||||||
Self::Muted
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ChannelVol {
|
|
||||||
left: Volume,
|
|
||||||
right: Volume,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for ChannelVol {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
left: Volume::Muted,
|
|
||||||
right: Volume::Muted,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Mixer {
|
|
||||||
vol_left: u8,
|
|
||||||
vol_right: u8,
|
|
||||||
ch1: ChannelVol,
|
|
||||||
ch2: ChannelVol,
|
|
||||||
ch3: ChannelVol,
|
|
||||||
ch4: ChannelVol,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Mixer {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
vol_left: 7,
|
|
||||||
vol_right: 7,
|
|
||||||
ch1: Default::default(),
|
|
||||||
ch2: Default::default(),
|
|
||||||
ch3: Default::default(),
|
|
||||||
ch4: Default::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct DacSample {
|
|
||||||
one: f32,
|
|
||||||
two: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for DacSample {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self { one: 0., two: 0. }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl DacSample {
|
impl DacSample {
|
||||||
fn mixed(&self, mixer: &Mixer) -> [f32; 2] {
|
fn mixed(&self, mixer: &Mixer) -> [f32; 2] {
|
||||||
let left = (self.one * mixer.ch1.left.scale()) + (self.two * mixer.ch2.left.scale());
|
let left = (self.one * mixer.ch1.left.scale()) + (self.two * mixer.ch2.left.scale());
|
||||||
|
|
102
src/processor/memory/mmio/apu/types.rs
Normal file
102
src/processor/memory/mmio/apu/types.rs
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
use super::channels::{NoiseChannel, PwmChannel, WaveChannel};
|
||||||
|
|
||||||
|
pub(super) struct Channels {
|
||||||
|
pub(super) one: PwmChannel,
|
||||||
|
pub(super) two: PwmChannel,
|
||||||
|
pub(super) three: WaveChannel,
|
||||||
|
pub(super) four: NoiseChannel,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Channels {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
one: PwmChannel::new(true),
|
||||||
|
two: PwmChannel::new(false),
|
||||||
|
three: WaveChannel::new(false),
|
||||||
|
four: NoiseChannel::new(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub(super) struct VinEnable {
|
||||||
|
pub(super) left: bool,
|
||||||
|
pub(super) right: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) enum Volume {
|
||||||
|
Muted,
|
||||||
|
Enabled,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Volume {
|
||||||
|
pub(super) fn scale(&self) -> f32 {
|
||||||
|
match self {
|
||||||
|
Volume::Muted => 0.,
|
||||||
|
Volume::Enabled => 1.,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn bool(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
Volume::Muted => false,
|
||||||
|
Volume::Enabled => true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn from_bool(val: bool) -> Self {
|
||||||
|
if val {
|
||||||
|
Self::Enabled
|
||||||
|
} else {
|
||||||
|
Self::Muted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) struct ChannelVol {
|
||||||
|
pub(super) left: Volume,
|
||||||
|
pub(super) right: Volume,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ChannelVol {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
left: Volume::Muted,
|
||||||
|
right: Volume::Muted,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) struct Mixer {
|
||||||
|
pub(super) vol_left: u8,
|
||||||
|
pub(super) vol_right: u8,
|
||||||
|
pub(super) ch1: ChannelVol,
|
||||||
|
pub(super) ch2: ChannelVol,
|
||||||
|
pub(super) ch3: ChannelVol,
|
||||||
|
pub(super) ch4: ChannelVol,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Mixer {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
vol_left: 7,
|
||||||
|
vol_right: 7,
|
||||||
|
ch1: Default::default(),
|
||||||
|
ch2: Default::default(),
|
||||||
|
ch3: Default::default(),
|
||||||
|
ch4: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub(super) struct DacSample {
|
||||||
|
pub(super) one: f32,
|
||||||
|
pub(super) two: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DacSample {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self { one: 0., two: 0. }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,8 @@
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
processor::Cpu,
|
processor::Cpu,
|
||||||
util::{get_bit, set_bit},
|
util::{get_bit, set_bit},
|
||||||
};
|
};
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
pub(super) struct Timers {
|
pub(super) struct Timers {
|
||||||
div_counter: usize,
|
div_counter: usize,
|
||||||
|
|
Loading…
Reference in a new issue