.NET Framework 2.0以降ではWAVE形式の音声の再生にSoundPlayerクラスまたはSystemSoundsクラスを用いることができる。 WAVEファイルから読み込んで再生する場合はSoundPlayerクラスを用いる。 システム音を再生する場合はSystemSoundsクラスを用いる。
SoundPlayerクラスによるWAVE音声の読み込み・再生
using System;
using System.Media;
using System.Threading;
class Sample {
static void Main()
{
using (var sound = new SoundPlayer()) {
// 読み込むWAVEファイルを指定
sound.SoundLocation = "test.wav";
// ファイルを非同期的に読み込む
sound.LoadAsync();
// 読み込みが完了するまで待つ
while (!sound.IsLoadCompleted) {
Thread.Sleep(100);
Console.WriteLine("loading...");
}
// 非同期的に再生
sound.Play();
// 再生を開始したら、3秒間待機
Console.WriteLine("playing...");
Thread.Sleep(3000);
// 再生を停止
sound.Stop();
}
}
}
なお、.NET Framework 1.xにはWAVEファイルの再生に関するクラスがないので、API関数のPlaySoundを用いる必要がある。 PlaySound関数はファイルから直接再生するバージョンと、メモリ上にあるバッファから再生するバージョンがある。 何度も再生されるような音声は、バッファを作成した方が効率的。
PlaySound関数を使ったWAVE音声の再生
// ファイルから再生する
[DllImport( "winmm.dll", EntryPoint = "PlaySound" )]
private static extern int PlaySound(
[MarshalAs(UnmanagedType.LPStr)] string pszSound,
int hModule,
int dwFlags );
// メモリ上のバッファから再生する
[DllImport( "winmm.dll", EntryPoint = "PlaySound" )]
private static extern int PlaySound(
[MarshalAs(UnmanagedType.LPArray)] byte[] pszSound,
int hModule,
int dwFlags );
// 再生フラグ
private const int SND_SYNC = 0x0; // 同期再生
private const int SND_ASYNC = 0x1; // 非同期再生
private const int SND_MEMORY = 0x4; // バッファからの再生
private const int SND_LOOP = 0x8; // ループ再生
private const int SND_NOSTOP = 0x10; // 再生中のサウンドを停止しない
private const int SND_NOWAIT = 0x2000; // ビジー状態なら即座に処理を返す
// バッファ
byte[] buffer;
private void Form1_Load( System.Object sender, System.EventArgs e )
{
// ファイルからバイト配列に読み込み
FileStream stream;
BinaryReader reader;
stream = new FileStream( @"E:\Test.wav", FileMode.Open, FileAccess.Read );
reader = new BinaryReader( stream );
buffer = reader.ReadBytes( (int)stream.Length );
reader.Close();
stream.Close();
}
private void Form1_Closed( object sender, System.EventArgs e )
{
buffer = null;
}
private void Button1_Click( System.Object sender, System.EventArgs e )
{
// ファイルから再生
PlaySound( @"E:\Test.wav", 0, SND_ASYNC );
}
private void Button2_Click( System.Object sender, System.EventArgs e )
{
// バッファから再生
PlaySound( buffer, 0, SND_MEMORY | SND_ASYNC );
}