DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

WAVEファイルを再生する

ここではWAVE音声ファイルを再生する方法をいくつか紹介します。

.NET Framework 2.0以降で、SoundPlayerクラスを使用する方法

.NET Framework 2.0から追加されたSoundPlayerクラスを使用すれば、簡単にWAVEファイルを再生できます。

SoundPlayerクラスには、WAVEファイルを再生するためのメソッドが3つ用意されています。それぞれ以下のような違いがあります。

SoundPlayerクラスのメソッド 説明
PlaySync サウンドを最後まで再生し終えるまで待機します(同期再生)。つまりPlaySyncメソッドを呼び出した後、サウンドが終了するまでユーザーインターフェイスがブロックされ、何もできなくなります。
Play サウンドをバックグラウンドで再生します(非同期再生)。つまりPlayメソッドを呼び出した後も、すぐに次のコードが実行されます。
PlayLooping サウンドをバックグラウンドで再生し、さらにループ再生(サウンドが終了すると、頭に戻って再び再生する)します。

以下にSoundPlayerクラスを使ってWAVEファイルを再生、停止する例を示します。フォームに2つのボタンコントロール"Button1"と"Button2"が配置されているときに、Button1で再生し、Button2で停止します。

VB.NET
コードを隠すコードを選択
Private player As System.Media.SoundPlayer = Nothing

'WAVEファイルを再生する
Private Sub PlaySound(ByVal waveFile As String)
    '再生されているときは止める
    If Not (player Is Nothing) Then
        StopSound()
    End If

    '読み込む
    player = New System.Media.SoundPlayer(waveFile)
    '非同期再生する
    player.Play()

    '次のようにすると、ループ再生される
    'player.PlayLooping()

    '次のようにすると、最後まで再生し終えるまで待機する
    'player.PlaySync()
End Sub

'再生されている音を止める
Private Sub StopSound()
    If Not (player Is Nothing) Then
        player.Stop()
        player.Dispose()
        player = Nothing
    End If
End Sub

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click
    PlaySound("C:\music.wav")
End Sub

'Button2のClickイベントハンドラ
Private Sub Button2_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button2.Click
    StopSound()
End Sub
C#
コードを隠すコードを選択
private System.Media.SoundPlayer player = null;

//WAVEファイルを再生する
private void PlaySound(string waveFile)
{
    //再生されているときは止める
    if (player != null)
        StopSound();

    //読み込む
    player = new System.Media.SoundPlayer(waveFile);
    //非同期再生する
    player.Play();

    //次のようにすると、ループ再生される
    //player.PlayLooping();

    //次のようにすると、最後まで再生し終えるまで待機する
    //player.PlaySync();
}

//再生されている音を止める
private void StopSound()
{
    if (player != null)
    {
        player.Stop();
        player.Dispose();
        player = null;
    }
}

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    PlaySound("C:\\music.wav");
}

//Button2のClickイベントハンドラ
private void Button2_Click(object sender, EventArgs e)
{
    StopSound();
}

.NET Framework 2.0以降で、My.Computer.Audioを使用する方法

.NET Framework 2.0以降のVB.NETでは、My.Computer.Audioを使ってWAVEファイルを再生することもできます。Audio.Playメソッドは内部でSoundPlayerクラスを使用しているため、SoundPlayerクラスを使用した方法と根本的には同じです。

以下にMy.Computer.Audioを使ってWAVEファイルを再生、停止する例を示します。SoundPlayerクラスの例と同じ事を行っています。

VB.NET
コードを隠すコードを選択
'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
        Handles Button1.Click
    'バックグラウンドでWAVを再生する
    My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.Background)

    '次のようにすると、ループ再生される
    'My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.BackgroundLoop)

    '次のようにすると、最後まで再生し終えるまで待機する
    'My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.WaitToComplete)
End Sub

'Button2のClickイベントハンドラ
Private Sub Button2_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button2.Click
    '再生しているWAVを停止する
    My.Computer.Audio.Stop()
End Sub
C#
コードを隠すコードを選択
//参照にMicrosoft.VisualBasic.dllが追加されている必要がある

private Microsoft.VisualBasic.Devices.Audio audio =
    new Microsoft.VisualBasic.Devices.Audio();

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{

    //バックグラウンドでWAVを再生する
    audio.Play("C:\\music.wav",
        Microsoft.VisualBasic.AudioPlayMode.Background);

    //次のようにすると、ループ再生される
    //audio.Play("C:\\music.wav",
    //    Microsoft.VisualBasic.AudioPlayMode.BackgroundLoop);

    //次のようにすると、最後まで再生し終えるまで待機する
    //audio.Play("C:\\music.wav",
    //    Microsoft.VisualBasic.AudioPlayMode.WaitToComplete);
}

//Button2のClickイベントハンドラ
private void Button2_Click(object sender, EventArgs e)
{
    //再生しているWAVを停止する
    audio.Stop();
}

Win32 APIのPlaySound関数を使用する方法

次に、Win32 APIのPlaySound関数を使用して再生する方法を紹介します。この方法は、ヘルプの「方法 : プラットフォーム呼び出しを使用して Wave ファイルを再生する (C# プログラミング ガイド)」で紹介されていますので、そちらも参考になるでしょう。

以下に例を示します。My.Computer.Audioで紹介した例と同じ事を行っています。

VB.NET
コードを隠すコードを選択
'サウンドを再生するWin32 APIの宣言
<Flags()> _
Public Enum PlaySoundFlags
    SND_SYNC = &H0
    SND_ASYNC = &H1
    SND_NODEFAULT = &H2
    SND_MEMORY = &H4
    SND_LOOP = &H8
    SND_NOSTOP = &H10
    SND_NOWAIT = &H2000
    SND_ALIAS = &H10000
    SND_ALIAS_ID = &H110000
    SND_FILENAME = &H20000
    SND_RESOURCE = &H40004
    SND_PURGE = &H40
    SND_APPLICATION = &H80
End Enum
<System.Runtime.InteropServices.DllImport("winmm.dll", _
    CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function PlaySound(ByVal pszSound As String, _
    ByVal hmod As IntPtr, ByVal fdwSound As PlaySoundFlags) As Boolean
End Function

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click
    '非同期再生する
    PlaySound("C:\music.wav", IntPtr.Zero, _
        PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC)

    'ループ再生するには、次のようにする
    'PlaySound("C:\music.wav", IntPtr.Zero, _
    '    PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC Or _
    '    PlaySoundFlags.SND_LOOP)

    '同期再生するには、次のようにする
    'PlaySound("C:\music.wav", IntPtr.Zero, _
    '    PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_SYNC)
End Sub

'Button2のClickイベントハンドラ
Private Sub Button2_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button2.Click
    '再生しているWAVを停止する
    PlaySound(Nothing, IntPtr.Zero, PlaySoundFlags.SND_PURGE)
End Sub
C#
コードを隠すコードを選択
//サウンドを再生するWin32 APIの宣言
[Flags]
public enum PlaySoundFlags : int
{
    SND_SYNC = 0x0000,
    SND_ASYNC = 0x0001,
    SND_NODEFAULT = 0x0002,
    SND_MEMORY = 0x0004,
    SND_LOOP = 0x0008,
    SND_NOSTOP = 0x0010,
    SND_NOWAIT = 0x00002000,
    SND_ALIAS = 0x00010000,
    SND_ALIAS_ID = 0x00110000,
    SND_FILENAME = 0x00020000,
    SND_RESOURCE = 0x00040004,
    SND_PURGE = 0x0040,
    SND_APPLICATION = 0x0080
}
[System.Runtime.InteropServices.DllImport("winmm.dll",
    CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool PlaySound(
    string pszSound, IntPtr hmod, PlaySoundFlags fdwSound);

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    //非同期再生する
    PlaySound("C:\\music.wav", IntPtr.Zero,
        PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_ASYNC);

    //ループ再生するには、次のようにする
    //PlaySound("C:\\music.wav", IntPtr.Zero,
    //    PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_ASYNC |
    //    PlaySoundFlags.SND_LOOP);

    //同期再生するには、次のようにする
    //PlaySound("C:\\music.wav", IntPtr.Zero,
    //    PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_SYNC);
}

//Button2のClickイベントハンドラ
private void Button2_Click(object sender, EventArgs e)
{
    //再生しているWAVを停止する
    PlaySound(null, IntPtr.Zero, PlaySoundFlags.SND_PURGE);
}

MCIを使用する方法

MCI(Media Control Interface)を使用してもWaveファイルを再生できます。この方法については、こちらをご覧ください。

Windows Media Player Controlを使用する方法

Windows Media Player Controlを使用して音声ファイルを再生する方法は、こちらで紹介しています。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。