|
|
|
@ -5,6 +5,7 @@ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "sample.hpp" |
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
|
|
#include <cstdint> |
|
|
|
|
|
|
|
|
@ -15,11 +16,16 @@ namespace sample { |
|
|
|
|
static uint64_t sSeed1{0}; |
|
|
|
|
static uint64_t sSeed2{0}; |
|
|
|
|
|
|
|
|
|
auto applyDither(int64_t src, uint_fast8_t bits) -> int32_t { |
|
|
|
|
uint64_t mask = 0xFFFFFFFF; // 32 ones
|
|
|
|
|
mask >>= 32 - bits; // `bits` ones
|
|
|
|
|
uint64_t noise = komirand(&sSeed1, &sSeed2) & mask; // `bits` random noise
|
|
|
|
|
return std::clamp<int64_t>(src + noise, INT32_MIN, INT32_MAX); |
|
|
|
|
auto shiftWithDither(int64_t src, uint_fast8_t bits) -> Sample { |
|
|
|
|
// Generate `bits` random bits
|
|
|
|
|
uint64_t mask = 0xFFFFFFFF; |
|
|
|
|
mask >>= 32 - bits; |
|
|
|
|
int64_t noise = static_cast<int32_t>(komirand(&sSeed1, &sSeed2) & mask); |
|
|
|
|
// Centre the noise around 0.
|
|
|
|
|
noise -= (mask >> 1); |
|
|
|
|
// Apply to the sample, then clip and shift to 16 bit.
|
|
|
|
|
Sample clipped = Clip((src + noise) >> bits); |
|
|
|
|
return clipped; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace sample
|
|
|
|
|