使用SoundPlayer播放多个声音

时间:2009-08-16 20:37:56

标签: c# .net audio wav

我正在制作一个采样器程序,其中1到9的每个键都会产生不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个“杀死”第一个声音。

我正在使用SoundPlayer播放来自.WAV文件的声音。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:6)

您需要使用DirectX(DirectSound)或类似的API,以便同时播放多种声音。

答案 1 :(得分:6)

有一种简单的方法可以在C#或VB.Net中一次播放多个声音。您必须调用mciSendString() API函数来播放每个.wav文件。除非你是循环播放,否则你甚至不需要做多线程。 Here是使用MusicPlayer创建的mciSendString()类的完整工作示例。

// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

在上面的功能中,键是第一个参数命令。只要您使用单独的命令名称调用两个函数,它们将单独/同时播放。这就是我在我的一个C#程序中所做的:

private void PlayWorker()
{
    StringBuilder sb = new StringBuilder();
    mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
    mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
    IsBeingPlayed = true;
}

编辑:添加了一个工作示例的链接。

答案 2 :(得分:3)

你可以这样做:

SoundPlayer支持WAV Stream。你可以

  • MIX样本你'手动'和
  • 假(从某个地方获取WAV标题,并不复杂)。

并将此类流作为参数提供给the SoundPlayer constructor

这样你就不必使用某种复杂的DirectSound库,并且仍然可以混合(一次发出多个声音)。

答案 3 :(得分:1)

我猜你的KeyPress事件(或者你正在使用的任何事件)你正在使用构造函数创建一个新的SoundPlayer实例,该构造函数接受WAV文件的路径,然后调用它的Play方法。从理论上讲,这不应该导致您遇到的“单声道”效果,因为Windows自Windows 98以来能够同时播放多个WAV文件。我认为您听到了什么(基于我自己使用的这个类)第二个启动时不是第一个声音的截止,但实际上是从磁盘加载WAV文件时整个播放暂停导致的故障。

不要在每次按键时加载SoundPlayer的新实例,而是尝试创建一个类范围的SoundPlayer对象数组,并在表单的Load事件中从磁盘预加载它们。然后在按下键时调用每个SoundPlayer的Play方法。这可能会解决您的问题,虽然我认为您仍会偶尔出现这种问题。

答案 4 :(得分:1)

using System.Windows.Media

Function void Play(string audioPath)
{
MediaPlayer myPlayer = new MediaPlayer();
myPlayer.Open(new System.Uri(audioPath));
myPlayer.Play();
}

Play(Application.StartupPath + "\\Track1.wav");
Play(Application.StartupPath + "\\Track2.wav");

此代码可以同时播放两个音频文件,第二个音频track2.wav中的来电不会影响track1.wav的播放。

答案 5 :(得分:0)

您需要通过SharpDX使用xAudio2,它是游戏开发专用的directX组件,您可以在此处找到完整的工作示例: https://github.com/sharpdx/SharpDX-Samples/tree/master/Desktop/XAudio2/PlaySound