commit 297758d0f0be88c21f7bf20ba02a8a31546ca2a5 parent a60d1f285b962dbf8aaa74ce8f65673cc425e948 Author: Matt Demanett <matt@demanett.net> Date: Sun, 31 Dec 2017 15:55:31 -0500 Fixes #5: incorrect use of std::random_device could lead to a crash on too many open file descriptors when using Noise. Diffstat:
A | src/dsp/noise.cpp | | | 23 | +++++++++++++++++++++++ |
M | src/dsp/noise.hpp | | | 17 | +++++++++++++++-- |
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/src/dsp/noise.cpp b/src/dsp/noise.cpp @@ -0,0 +1,23 @@ + +#include "dsp.hpp" + +using namespace bogaudio::dsp; + + +Seeds::Seeds() { + std::random_device rd; + _generator.seed(rd()); +} + +unsigned int Seeds::_next() { + return _generator(); +} + +Seeds& Seeds::getInstance() { + static Seeds instance; + return instance; +} + +unsigned int Seeds::next() { + return getInstance()._next(); +}; diff --git a/src/dsp/noise.hpp b/src/dsp/noise.hpp @@ -4,11 +4,24 @@ namespace bogaudio { namespace dsp { +class Seeds { +private: + std::mt19937 _generator; + Seeds(); + unsigned int _next(); + +public: + Seeds(const Seeds&) = delete; + void operator=(const Seeds&) = delete; + static Seeds& getInstance(); + + static unsigned int next(); +}; + struct NoiseGenerator : Generator { - std::random_device _seed; std::minstd_rand _generator; // one of the faster options. - NoiseGenerator() : _generator(_seed()) {} + NoiseGenerator() : _generator(Seeds::next()) {} }; struct WhiteNoiseGenerator : NoiseGenerator {