0

我正在尝试输出音频样本,并使用来自http://www.codeproject.com/KB/audio-video/cswavplay.aspx的 cswavplay 来执行此操作,而后者似乎又DllImports来自 winmm.dll。

我确实让它使用 8 位样本播放,但是当我尝试向它提供 16 位样本时它失败了。我尽我所能挖掘代码,我将其理解为:

每次 cswavplay 播放完最后一个缓冲区时,我都会得到一个指向缓冲区的指针。它适用于一次迭代,它播放一个缓冲区,有时......我得到了各种有趣的异常,例如当我尝试使用 44100 的缓冲区大小来更清楚地听到播放了多少时,AccessViolationException。但是当我在 WaveOut 类(cswavplay 的一部分)内的不同位置放置断点时,似乎它使用的所有对象(如缓冲区和 AutoResetEvent 的实例)在第二次迭代中仍然存在。我最好的猜测是这些问题与线程或 GC 有关。例外情况似乎很随机,而且我经验不足,无法完全理解发生了什么。

我要求以下任何一项:

1)关于可能是什么问题的疯狂猜测

2)有根据的猜测可能是什么问题

3) 指向使用 C# 实时输出声音的另一种方法

我不是要求对我没有编写的软件进行彻底的错误跟踪,所以不要介意 cswavplay ......

归根结底,我可能在这里做错了什么,但很难知道我什么时候没有得到相关的异常(沿着BufferAllocationException或其他的线)......

编辑:

感谢所有关于其他声音 API 的建议。他们似乎都假设一个 .wav 文件。很抱歉不清楚,我不是在播放 .wav 文件,我是实时合成样本。

4

1 回答 1

2

我想到了DirectSound和 .NET 的XNA 框架。有许多非常高质量的示例,如何使用 .NET 同时播放声音和动画图形。

于 2011-11-07T20:29:36.007 回答