.NET TIPS

WAVEサウンド(.wavファイル)を非同期で再生するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2007/08/16

 「TIPS:WAVEサウンド(.wavファイル)を再生するには?」では、Windows標準のサウンド・ファイル形式として採用されている「WAVE形式ファイル」(以降、.wavファイル)のサウンドを簡単に再生する方法を紹介した。具体的には、SoundPlayerクラス(System.Media名前空間)のPlaySyncメソッドを呼び出すことで.wavファイルを再生する。

 このPlaySyncメソッドは(「Sync」というメソッド名からも分かるように)同期呼び出し用のメソッドなので、再生が完了するまでコードの実行が先に進まなかった(=同期的な再生)。だが、SoundPlayerクラスには、PlaySync以外にもメソッドが提供されており、非同期で呼び出して、ほかの処理の実行中にそのバックグラウンドで.wavファイルを再生したりすることもできる(=非同期的な再生)。

 本TIPSではその非同期的な再生の方法について紹介する。

非同期呼び出しで.wavファイルを再生するには?

 非同期呼び出しで.wavファイルを再生するには、SoundPlayerオブジェクトのPlayメソッドを呼び出せばよい。SoundPlayerオブジェクトを作成するには、コンストラクタに.wavファイルのパスを指定してインスタンス化する。

 Playメソッドを呼び出すことにより、新しいスレッドが作成され、そのスレッドを使用して(バックグランドで).wavファイルが再生される。再生中も、(Playメソッドの)呼び出し元のスレッドでは、コードの実行が(Playメソッドで止まらず)先に進む。

 次のコードは、実際にPlayメソッドを使って.wavファイルを再生するサンプルのコンソール・アプリケーションだ。

using System;
using System.Media;
using System.Threading;

class Program
{
  static void Main()
  {
    string path = @"C:\WINDOWS\Media\tada.wav";
    SoundPlayer wavePlayer = new SoundPlayer(path);
    Console.WriteLine("再生開始");
    wavePlayer.Play();

    // サウンド再生中も以降の処理を実行する
    Thread.Sleep(500);
    Console.WriteLine("0.5秒経過");
    //wavePlayer.Stop(); // 再生をストップ
    Thread.Sleep(1000);
    Console.WriteLine("2秒経過");
  }
}
Imports System
Imports System.Media
Imports System.Threading

Module Module1

  Sub Main()
    Dim path As String = "C:\WINDOWS\Media\tada.wav"
    Dim wavePlayer As New SoundPlayer(path)
    Console.WriteLine("再生開始")
    wavePlayer.Play()


    ' サウンド再生中も以降の処理を実行する
    Thread.Sleep(500)
    Console.WriteLine("0.5秒経過")
    'wavePlayer.Stop() ' 再生をストップ
    Thread.Sleep(1000)
    Console.WriteLine("2秒経過")
  End Sub

End Module
.wavファイルを再生するコンソール・アプリケションのプログラム・コード(上:C#、下:VB)

 このプログラムを実行すると、「ジャジャーン」というサウンドが再生されている間に、コードの実行が先に進み、「0.5秒経過」というメッセージが表示される。

 なお、SoundPlayerオブジェクトのStopメソッドを呼び出せば、再生中のサウンドを停止できる。

 Playメソッドの問題点は、再生が完了した時点が分からないことだ。従って、再生完了を知る必要がある場合には、Playメソッドは使えない。非同期的な再生で、再生完了を管理するには、BackgroundWorkerコンポーネントなどを活用してバックグラウンドで実行される別スレッドを作成し(参考:「TIPS:時間のかかる処理をバックグラウンドで実行するには?」)、そのバックグランド・スレッドの中で同期的な再生(PlaySyncメソッド。参考:「TIPS:WAVEサウンド(.wavファイル)を再生するには?」)を利用すればよい。

 また注意点として、SoundPlayerクラスではサウンドを同時に再生できないことが挙げられる。1つの再生が完了するまで次のサウンド再生は待機する仕様になっているようなので注意してほしい。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:サウンド
使用ライブラリ:SoundPlayerクラス(System.Media名前空間)
関連TIPS:WAVEサウンド(.wavファイル)を再生するには?

この記事と関連性の高い別の.NET TIPS
WAVEサウンド(.wavファイル)を再生するには?
WAVEサウンド(.wavファイル)をループ再生するには?
WindowsフォームでアニメーションGIFを再生/停止するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間