NAudio播放声音有4种方式,分别是:
Wave方式播放最终调用的函数如下。
[DllImport("winmm.dll")]
public static extern MmResult waveOutWrite(IntPtr hWaveOut, WaveHeader lpWaveOutHdr, int uSize);
即winmm库的waveOutWrite函数。
DirectSound方式使用的库是dsound.dll。
Wave方式播放声音,有两个类:WaveOut和WaveOutEvent。两者的区别是CallBack方式的不同。
WaveOutEvent采用的是AutoResetEvent对象,即在播放过程中,通过此信号量处理播放声音中的回调。
Wave方式有3种方式:FunctionCallback、NewWindow和ExistingWindow。
总的来说有两种方式:Function方式和Window方式,两者的区别是调用库函数winmm.dll的waveOutOpen()传入的参数不同。
Window方式使用WndProc消息类处理回调。
最简单的使用WaveOutEvent只需要3步。
private WaveOutEvent waveOutEvent = new WaveOutEvent();
private AudioFileReader audioFileReader;
audioFileReader = new AudioFileReader(fileName);
waveOutEvent.Init(audioFileReader);
waveOutEvent.Play();
private void CloseWaveOut()
{
if (waveOutEvent != null)
{
waveOutEvent.Stop();
}
if (audioFileReader != null)
{
// this one really closes the file and ACM conversion
audioFileReader.Dispose();
audioFileReader = null;
}
if (waveOutEvent != null)
{
waveOutEvent.Dispose();
waveOutEvent = null;
}
}
程序退出时,一定要停止,并且将两个对象销毁。
其它如设置音量、暂停、继续等功能都比较容易。
使用上和WaveOutEvent没有区别。