noise.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use super::{
  2. FactoryParameters, GenBox, GenFactoryError, Generator, GeneratorFactory, Parameters, Rate,
  3. SampleBuffer,
  4. };
  5. use std::mem;
  6. use ::rand::{Rng, SeedableRng, XorShiftRng};
  7. #[derive(Debug)]
  8. pub struct Noise {
  9. pub rng: XorShiftRng,
  10. pub buf: SampleBuffer,
  11. }
  12. impl Generator for Noise {
  13. fn eval<'a>(&'a mut self, _params: &Parameters) -> &'a SampleBuffer {
  14. self.buf.rate = Rate::Sample;
  15. for i in 0..self.buf.len() {
  16. self.buf[i] = self.rng.next_f32();
  17. }
  18. &self.buf
  19. }
  20. fn buffer(&self) -> &SampleBuffer {
  21. &self.buf
  22. }
  23. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  24. mem::replace(&mut self.buf, buf)
  25. }
  26. }
  27. pub struct NoiseFactory;
  28. impl GeneratorFactory for NoiseFactory {
  29. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  30. Ok(Box::new(Noise {
  31. rng: XorShiftRng::from_seed(::rand::random()),
  32. buf: SampleBuffer::new(params.env.default_buffer_size),
  33. }))
  34. }
  35. }
  36. pub static Factory: NoiseFactory = NoiseFactory;