I had a similar problem when initializing new WaveOut objects using SineWaveProviders. I came across the idea of ββusing something like a ringlist to exchange different provider values ββ(frequency and amplitude), because, at least in my case, I could not hear the difference above 5 constant sine waves. In addition, in my tests on different machines at the same time using more than 6-7 WaveOut objects, the MemoryAllocationError list of calls was usually given. This is what I came out with:
private Queue<SineWaveGenerator> generators; // constructor public Player() { for (int i = 0; i < 5; i++) { var generator = new SineWaveGenerator(); generator.Amplitude = 0.25f; generators.Enqueue(generator); } } // just a helper method private SineWaveGenerator GetGenerator(int frequency) { return generators.FirstOrDefault(x => x.Frequency == frequency); } private void Play(int frequency) { var generator = GetGenerator(frequency); if (generator == null) { generator = generators.Dequeue(); // get generator from the top of the list generator.Frequency = GetFrequency(key); // modify the generator generators.Enqueue(generator); // and append it to the back } generator.Play(); } private void Stop(int frequency) { var generator = GetGenerator(frequency); if (generator != null) { generator.Stop(); } }
Note. SineWaveGenerator initializes a new WaveOut in its constructor.
source share