2010-12-13 10 views
4

キーを押したときにwavファイルを再生する必要があるアプリがありますが、SoundPlayerクラスを使用しますが、新しいキーを押したときに別のサウンドが再生されている場合、もう一度再生すると音が止まり、醜く見えます。.wavファイルを非同期で複数回再生する。

もう1つ演奏しても同じ音を再生する方法はありますか?

ありがとうございました!

答えて

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

+0

こんにちは、助けてくれてありがとうございますが、私が必要とすることをしません...サウンドが再生されるまで待っています。私が必要とするのは、新しいものが同時に再生を開始することです。他の作品では、銃が発射されるとwavファイルが再生され、それは〜2秒かかり、銃は毎秒多く発射されるというゲームです。 second –

+0

'PlaySound'を呼び出すときに' SND_ASYNC'フラグを設定しましたか?それは問題を解決するはずです。 – CodesInChaos

+0

しかし、私はPlaySoundを数年間使用していましたが、それは確実に動作しませんでした。あなたの使い方に適したサウンドAPIを使用することはおそらく良い考えです。当時私はDirectSound上でいくつかのラッパーを使用しましたが、他にも多くのものがあります。 – CodesInChaos

0

「複数のサウンドを一度に再生するにはどうすればいいですか」と尋ねると、SoundPlayerは決して答えられません。 PlaySoundも同様に限定されていると私は信じている。

サウンドAPIのその他のオプションについては、this questionthis questionをご覧ください。私はSDLとSDLミキサーを簡単に見て、SDLはあまりにも原始的であると思っていました(あなたは自分でサウンドをミックスする必要があります).SDLミキサーも重すぎました(すべてミックスと音楽の無制限のチャンネル(mp3、ogg、midiなど))。私はBASSのC#バインディングのオンラインリファレンスを見ることができませんでしたが、非営利目的では無料です。

1

NAudioが必要な場合があります。私は自分で使ったことはありませんが、比較的人気があります。

1

Irrklangという名前の.NET用のサウンドライブラリ(非商用アプリケーション用)は、複数のサウンド(少なくとも収集できるものからwavとmp3)を再生することができます。tutorialは、ライブラリの基本的な使い方。

関連する問題