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

C# 使用.net多次异步播放wav文件,c#,audio,wav,C#,Audio,Wav,我有一个应用程序,我需要在按下一个键时播放一个wav文件,我使用SoundPlayer类,但如果在按下一个新键时播放另一个声音,它会停止声音并再次播放,使其看起来很难看 有没有办法再次播放相同的声音,即使播放的是另一种声音 谢谢 将windows API中的PlaySound与SND_ASYNC和SND_NOSTOP标志结合使用 用法 声明 [Flags] public enum SoundFlags { /// <summary>play synchronously (d

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

有没有办法再次播放相同的声音,即使播放的是另一种声音


谢谢

将windows API中的
PlaySound
SND_ASYNC
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);
[标志]
公共枚举声音标志
{
///同步播放(默认)
SND_SYNC=0x0000,
///异步播放
SND_ASYNC=0x0001,
///如果找不到声音,则静音(!默认值)
SND_NODEFAULT=0x0002,
///pszSound指向一个内存文件
SND_内存=0x0004,
///循环播放声音,直到下一个sndPlaySound
SND_循环=0x0008,
///不要停止任何当前播放的声音
SND_NOSTOP=0x0010,
///停止挥手
SND_清除=0x40,
///如果司机很忙,不要等
SND_NOWAIT=0x00002000,
///名称是注册表别名
SND_别名=0x00010000,
///别名是一个预定义的id
SND_别名_ID=0x00110000,
///名称是文件名
SND_文件名=0x00020000,
///name是资源名或atom
SND_资源=0x00040004
}
[DllImport(“winmm.dll”,SetLastError=true)]
静态外部布尔播放声音(字符串PSZ声音、UIntPtr hmod、uint FDW声音);
更新

抱歉,你是对的。API不能用于同时播放声音。您应该使用
waveOut
api。看看这篇文章:

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


您可以查看和了解有关声音API的更多选项。我快速浏览了一下SDL和SDL混音器,认为SDL太原始了(你必须自己混音),SDL混音器太重了(仅此而已,还有一袋芯片——无限的混音和音乐通道(mp3、ogg、midi等))。我看不到BASS的C#绑定的在线参考资料,但它对非商业用途是免费的。

可能会提供您所需要的。我自己没有用过它,但它比较流行。

有一个免费的.NET声音库(针对非商业应用程序),它支持同时播放多种声音(至少可以从我收集的声音中播放wav和mp3),它们专门介绍了这种情况,作为该库的基本用法。

您好,谢谢您的帮助,但它不能满足我的需要。。。它一直等到声音播放完毕,我需要的是一个新的声音同时开始播放。在其他作品中,这是一个游戏,当枪被发射时,一个wav文件被播放,需要约2秒,枪每秒可以发射很多次。。。因此,我每秒需要大量枪声。在调用
PlaySound
时,您是否设置了
SND\u ASYNC
标志?这应该可以解决问题。但几年前我在游戏中使用PlaySound时,它的工作并不可靠。使用更适合您使用的声音api可能是个好主意。当时我在DirectSound上使用了一些包装器,但还有很多其他的。
[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);