1から9までの各キーが異なる音を出すサンプラープログラムを作っています。すべて正常に動作しますが、2つ(またはそれ以上)のサウンドを同時に押すと、2番目のサウンドが最初のサウンドを「強制終了」します。
を使用して、.WAVファイルのサウンドを再生していますSoundPlayer
。どうすればこれを解決できますか?
複数のサウンドを同時に再生できるように設計されたDirectX(DirectSound)または同様のAPIを使用する必要があります。
C# または VB.Net で一度に複数のサウンドを再生する簡単な方法が 1 つあります。mciSendString()
各 .wav ファイルを再生するには、API 関数を呼び出す必要があります。ループ再生をしない限り、マルチスレッドを行う必要さえありません。を使用して作成されたクラスの完全な動作例を次に示します。MusicPlayer
mciSendString()
// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
上記の関数では、キーは最初のパラメーター コマンドです。別のコマンド名で 2 つの関数を呼び出す限り、それらは別々に/同時に再生されます。これは、C# プログラムの 1 つで行ったことです。
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;
}
編集:実際の例へのリンクを追加しました。
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");
このコードは2 つのオーディオ ファイルを同時に再生できます。2 番目のオーディオの呼び出しはtrack2.wav
の再生を妨げませんtrack1.wav
。
あなたはこれを行うことができます:
SoundPlayer
WAVストリームに対応。あなたは出来る
そして、そのようなストリームをコンストラクターにSoundPlayer
パラメーターとして提供します。
そうすれば、やや複雑な DirectSound ライブラリを使用する必要がなくなり、ミキシング (一度に複数のサウンド) が可能になります。
KeyPressイベント(または使用しているもの)で、WAVファイルへのパスを取得するコンストラクターを使用してSoundPlayerの新しいインスタンスを作成し、そのPlayメソッドを呼び出していると思います。理論的には、WindowsはWindows 98以降複数のWAVファイルを同時に再生できるため、これによって発生する「モノラル」効果が発生することはありません。聞いていると思います(このクラスの私自身の使用に基づく)これは、2番目のサウンドが開始したときの最初のサウンドのカットオフではありませんが、実際には、WAVファイルがディスクからロードされるときに全体的な再生が一時停止した結果として発生するグリッチです。
キーを押すたびにSoundPlayerの新しいインスタンスをロードする代わりに、クラススコープのSoundPlayerオブジェクトの配列を作成し、フォームのLoadイベントでディスクからそれらをプリロードしてみてください。次に、キーが押されたときに各SoundPlayerのPlayメソッドを呼び出すだけです。これで問題が解決する可能性がありますが、この方法でも時折グリッチが発生すると思います。