我正在尝试输出音频样本,并使用来自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 文件,我是实时合成样本。