Skip to main content

max / audiofiles

715 B · 26 lines History Blame Raw
1 //! Shared TPDF dither PRNG for audio encoders.
2
3 /// Minimal xorshift64 PRNG for dither — no external dependency needed.
4 pub(crate) struct SimpleRng {
5 state: u64,
6 }
7
8 impl SimpleRng {
9 pub(crate) fn new(seed: u64) -> Self {
10 // xorshift64 is degenerate with state 0 (outputs 0 forever)
11 Self { state: if seed == 0 { 0x5A5A_5A5A_5A5A_5A5A } else { seed } }
12 }
13
14 fn next_u32(&mut self) -> u32 {
15 // xorshift64
16 self.state ^= self.state << 13;
17 self.state ^= self.state >> 7;
18 self.state ^= self.state << 17;
19 (self.state & 0xFFFF_FFFF) as u32
20 }
21
22 pub(crate) fn next_f32(&mut self) -> f32 {
23 self.next_u32() as f32 / u32::MAX as f32
24 }
25 }
26