AlreadyAllocated call waveOutOpen error

private void receiveAudio(object sender) { IPEndPoint senderEP = new IPEndPoint(IPAddress.Any, 0); MemoryStream audioDataStream; BufferedWaveProvider bufferedWaveProvider; //RawSourceWaveStream receivedRawAudioData; byte[] receivedAudioData; waveOutStream = new WaveOut(); while (IsAudioTransferActive) { receivedAudioData = audioUDPClient.Receive(ref senderEP); audioDataStream = new MemoryStream(receivedAudioData); //receivedRawAudioData = new RawSourceWaveStream(audioDataStream, audioFormat); bufferedWaveProvider = new BufferedWaveProvider(audioFormat); //How can I feed "audioDataStream " to "bufferedWaveProvider " waveOutStream.Init(bufferedWaveProvider); waveOutStream.Play(); } waveOutStream.Stop(); waveOutStream.Dispose(); } 

@Mark Heath: - As I said, I tried using BufferedWaveProvider, but how can I serve a buffered WaveProvider using "audioDataStream"

+4
source share
2 answers

You are constantly creating WaveOut objects inside the while loop that are not deleted, which is part of the problem. The best approach in this situation is to create a single WaveOut object and use it with the BufferedWaveProvider. Then, when audio becomes available, write it to the BufferedWaveProvider.

+3
source

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.

0
source

All Articles