使用SoundPlayer播放多个声音
我正在制作一个采样器程序,其中从1到9的每个键将发出不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个“杀死”第一个声音。
我正在使用SoundPlayer
播放来自.WAV文件的声音。 我怎么解决这个问题?
您需要使用DirectX(DirectSound)或一些类似的API,旨在允许同时播放多个声音。
有一种简单的方法可以在C#或VB.Net中一次播放多个声音。 您必须调用mciSendString()
API函数来播放每个.wav文件。 除非你是循环播放,否则你甚至不需要做multithreading。 这是使用mciSendString()
创建的MusicPlayer
类的完整工作示例。
// 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; }
编辑:添加了一个工作示例的链接。
你可以这样做:
SoundPlayer
支持WAV Stream。 你可以
- MIX样本你’手动’玩,并且,
- 假(从某个地方获取WAV标题,它并不复杂)。
并将此流作为参数提供给SoundPlayer
构造函数 。
这样你就不必使用某种复杂的DirectSound库,并且仍然混合(一次多个声音)。
我猜你的KeyPress事件(或者你正在使用的任何事件)你正在使用构造函数创建一个新的SoundPlayer实例,该构造函数接受WAV文件的路径,然后调用它的Play方法。 从理论上讲,这不应该导致您遇到的“单声道”效果,因为Windows自Windows 98以来一直能够同时播放多个WAV文件。我认为您听到了什么(基于我自己使用的这个类)第二个启动时不是第一个声音的截止,但实际上是因为从磁盘加载WAV文件时整个播放暂停导致的故障。
而不是在每个按键上加载一个新的SoundPlayer实例,尝试创建一个类范围的SoundPlayer对象数组,并在表单的Load事件中从磁盘预加载它们。 然后在按下键时调用每个SoundPlayer的Play方法。 这可能会解决您的问题,但我认为您仍会偶尔出现这种问题。
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
的播放。
- RegAsm regfile开关没有提供与codebase开关相同的输出
- 在项目之间共享变量
- 如何将麦克风(Line-In)和播放设备(扬声器Line-Out)中的音频录制到一个MP3文件中
- 使用wpf打印的最佳方法4
- AppDomain.CurrentDomain.Evidence会引发SerializationException
- AppDomain.CurrentDomain.UnhandledException未被调用
- 更好的PropertyChanged和PropertyChanging事件处理
- 如何使用EntityFramework.BulkInsert?
- 为什么你可以在WinForms中交叉线程添加控件,而不是WPF?