使用.net多次播放wav文件异步

时间:2010-12-13 13:57:25

标签: c# audio wav

我有一个应用程序,我需要在按下一个键时播放一个wav文件,我使用SoundPlayer类,但是如果在按下一个新键时正在播放另一个声音,它会停止声音再次播放它看起来很难看......

有没有办法再次播放相同的声音,即使还有其他的播放?

谢谢!

4 个答案:

答案 0 :(得分:5)

将Windows API中的PlaySoundSND_ASYNCSND_NOSTOP标记结合使用。

http://www.pinvoke.net/default.aspx/winmm.playsound

用法

//And the actual usage
PlaySound (fileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC | SoundFlags.SND_NOSTOP));

声明

[Flags]
public enum SoundFlags
{
    /// <summary>play synchronously (default)</summary>
    SND_SYNC = 0x0000,    
    /// <summary>play asynchronously</summary>
    SND_ASYNC = 0x0001,
    /// <summary>silence (!default) if sound not found</summary>
    SND_NODEFAULT = 0x0002,
    /// <summary>pszSound points to a memory file</summary>
    SND_MEMORY = 0x0004,
    /// <summary>loop the sound until next sndPlaySound</summary>
    SND_LOOP = 0x0008,    
    /// <summary>don't stop any currently playing sound</summary>
    SND_NOSTOP = 0x0010,
    /// <summary>Stop Playing Wave</summary>
    SND_PURGE = 0x40,
    /// <summary>don't wait if the driver is busy</summary>
    SND_NOWAIT = 0x00002000,
    /// <summary>name is a registry alias</summary>
    SND_ALIAS = 0x00010000,
    /// <summary>alias is a predefined id</summary>
    SND_ALIAS_ID = 0x00110000,
    /// <summary>name is file name</summary>
    SND_FILENAME = 0x00020000,
    /// <summary>name is resource name or atom</summary>
    SND_RESOURCE = 0x00040004
}

[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);

<强>更新

抱歉,你是对的。 API不能用于同时播放声音。你应该使用waveOut api。看看这篇文章:http://www.codeproject.com/KB/audio-video/cswavrec.aspx

答案 1 :(得分:1)

NAudio可能会提供您所需要的。我自己没有用它,但它相对受欢迎。

答案 2 :(得分:1)

有一个名为Irrklang的免费(用于非商业应用程序)声音库,它支持同时播放多个声音(至少是我可以收集的wav和mp3),{{3}这个案例特别涵盖了库的基本用法。

答案 3 :(得分:0)

如果你问,“我怎么能一次播放多个声音”,那么SoundPlayer永远不会成为答案。 我相信PlaySound也同样有限。

您可以查看this questionthis question以获取有关声音API的更多选项。我快速浏览了SDL和SDL Mixer并认为SDL过于原始(你必须自己混合声音)和SDL Mixer太重量级了(它就是一袋芯片 - 无限制混音和音乐的频道(mp3,ogg,midi等)。我看不到BASS的C#绑定的在线参考,但它可以免费用于非商业用途。