【问题标题】:AlreadyAllocated calling waveOutOpen error已分配调用 waveOutOpen 错误
【发布时间】:2024-04-29 06:00:01
【问题描述】:
 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 :- 正如你所说,我尝试过使用 BufferedWaveProvider,但我如何才能为 bufferedWaveProvider 提供“audioDataStream”

【问题讨论】:

  • 请发布整个例外情况。
  • @abatishchev:- MmException 未处理。已分配调用 waveOutOpen
  • 我有一个 waveOut,它在一个从 UDP 套接字接收数据的循环内播放。但不幸的是,它在大约 30 秒后抛出一个错误,说“MemoryAllocationError 调用 waveOutOpen”或“MmException 未处理。AlreadyAllocated 调用 waveOutOpen”
  • @abatishchev:-我有一个 waveOut,它在一个循环中播放,它从 UDP 套接字接收数据。但不幸的是,它在大约 30 秒后抛出一个错误,说“MemoryAllocationError 调用 waveOutOpen”或“MmException 未处理。AlreadyAllocated 调用 waveOutOpen”
  • 你试过这个吗:naudio.codeplex.com/discussions/350724

标签: c# .net wpf exception-handling naudio


【解决方案1】:

您在 while 循环中不断创建未处理的 WaveOut 对象,这是问题的一部分。在这种情况下,最好的方法是创建一个 WaveOut 对象并使用 BufferedWaveProvider 提供给它。然后当音频可用时,将其写入 BufferedWaveProvider。

【讨论】:

  • 正如“Mark Heath”所说,我尝试过使用 BufferedWaveProvider,但是如何使用“audioDataStream”来提供“bufferedWaveProvider”
  • 我正在解决同样的问题。如果我可以问,你是怎么过去的?
【解决方案2】:

在使用 SineWaveProviders 初始化新的 WaveOut 对象时,我遇到了类似的问题。我想到了使用类似于 ringlist 的东西来交换不同提供者的值(频率和幅度)的想法,因为至少在我的情况下,我听不到 5 个恒定正弦波以上的任何差异。此外,在我在不同机器上的测试中,一次使用超过 6 到 7 个 WaveOut 对象通常会导致 MemoryAllocationErrors 从而成为 ringlist。这就是我得出的结论:

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();
    }
}

注意:SineWaveGenerator 在其构造函数中初始化一个新的WaveOut

【讨论】: