1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Frame {
pub left: f32,
pub right: f32,
}
impl Frame {
pub fn new(left: f32, right: f32) -> Self {
Self { left, right }
}
pub fn from_mono(value: f32) -> Self {
Self::new(value, value)
}
pub fn from_i32(left: i32, right: i32, bit_depth: u32) -> Self {
let max_int = (1 << bit_depth) / 2;
let scale = 1.0 / max_int as f32;
Self::new(left as f32 * scale, right as f32 * scale)
}
pub fn panned(self, x: f32) -> Self {
Self::new(self.left * (1.0 - x).sqrt(), self.right * x.sqrt())
}
}
impl Add for Frame {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
Self::new(self.left + rhs.left, self.right + rhs.right)
}
}
impl AddAssign for Frame {
fn add_assign(&mut self, rhs: Self) {
self.left += rhs.left;
self.right += rhs.right;
}
}
impl Sub for Frame {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
Self::new(self.left - rhs.left, self.right - rhs.right)
}
}
impl SubAssign for Frame {
fn sub_assign(&mut self, rhs: Self) {
self.left -= rhs.left;
self.right -= rhs.right;
}
}
impl Mul<f32> for Frame {
type Output = Self;
fn mul(self, rhs: f32) -> Self::Output {
Self::new(self.left * rhs, self.right * rhs)
}
}
impl MulAssign<f32> for Frame {
fn mul_assign(&mut self, rhs: f32) {
self.left *= rhs;
self.right *= rhs;
}
}
impl Div<f32> for Frame {
type Output = Self;
fn div(self, rhs: f32) -> Self::Output {
Self::new(self.left / rhs, self.right / rhs)
}
}
impl DivAssign<f32> for Frame {
fn div_assign(&mut self, rhs: f32) {
self.left /= rhs;
self.right /= rhs;
}
}
impl Neg for Frame {
type Output = Self;
fn neg(self) -> Self::Output {
Self::new(-self.left, -self.right)
}
}