.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();
}
}
}
SoundPlayerクラスによるWAVE音声の読み込み・再生
Imports System
Imports System.Media
Imports System.Threading
Class Sample
Shared Sub Main()
Using sound As New SoundPlayer()
' 読み込むWAVEファイルを指定
sound.SoundLocation = "test.wav"
' ファイルを非同期的に読み込む
sound.LoadAsync()
' 読み込みが完了するまで待つ
Do Until sound.IsLoadCompleted
Thread.Sleep(100)
Console.WriteLine("loading...")
Loop
' 非同期的に再生
sound.Play()
' 再生を開始したら、3秒間待機
Console.WriteLine("playing...")
Thread.Sleep(3000)
' 再生を停止
sound.Stop()
End Using
End Sub
End Class
なお、.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 );
}
PlaySound関数を使ったWAVE音声の再生
' ファイルから再生する
<DllImport("winmm.dll", EntryPoint:="PlaySound")> _
Private Shared Function PlaySound( _
<MarshalAs(UnmanagedType.LPStr)> ByVal pszSound As String, _
ByVal hModule As Integer, _
ByVal dwFlags As Integer) _
As Integer
End Function
' メモリ上のバッファから再生する
<DllImport("winmm.dll", EntryPoint:="PlaySound")> _
Private Shared Function PlaySound( _
<MarshalAs(UnmanagedType.LPArray)> ByVal pszSound As Byte(), _
ByVal hModule As Integer, _
ByVal dwFlags As Integer) _
As Integer
End Function
' 再生フラグ
Private Const SND_SYNC As Integer = &H0 ' 同期再生
Private Const SND_ASYNC As Integer = &H1 ' 非同期再生
Private Const SND_MEMORY As Integer = &H4 ' バッファからの再生
Private Const SND_LOOP As Integer = &H8 ' ループ再生
Private Const SND_NOSTOP As Integer = &H10 ' 再生中のサウンドを停止しない
Private Const SND_NOWAIT As Integer = &H2000 ' ビジー状態なら即座に処理を返す
' バッファ
Dim buffer() As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ファイルからバイト配列に読み込み
Dim stream As FileStream
Dim reader As BinaryReader
stream = New FileStream("E:\Test.wav", FileMode.Open, FileAccess.Read)
reader = New BinaryReader(stream)
buffer = reader.ReadBytes(CInt(stream.Length))
reader.Close()
stream.Close()
End Sub
Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
buffer = Nothing
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ファイルから再生
PlaySound("E:\Test.wav", Nothing, SND_ASYNC)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' バッファから再生
PlaySound(buffer, Nothing, SND_MEMORY Or SND_ASYNC)
End Sub