线程困境,至少我认为是

时间:2011-11-07 20:21:10

标签: c# audio waveout

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

我确实使用8位样本进行播放,但是当我尝试为16位样本提供数据时它失败了。我尽可能地挖掘代码,我理解为:

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

我要求以下任何一项:

1)狂野猜测可能是什么问题

2)受过教育的猜测可能是什么问题

3)指向使用C#

实时输出声音的替代方式

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

在一天结束时,我可能在这里做错了什么,但很难知道我什么时候没有得到相关的例外(按照BufferAllocationException或其他方式)...

修改

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

1 个答案:

答案 0 :(得分:2)

DirectSound对于.NET,XNA framework出现在我的脑海中。有许多very high quality samples out如何使用.NET同时播放声音和动画图形。