C#でDirectSoundを利用してWAVファイルを再生する
(その1)

概要

VB.NETでDirectSoundを利用してWAVファイルを再生する』で作成したサンプルコードのC#版です。

C#から.NET FrameworkのDirectSoundを利用して音声ファイル(WAVファイル)の再生を行います。

サンプルコードの処理の流れを簡単に説明すると、以下のようになります。

  • サウンド出力を行うデバイスのオブジェクトを作成します。
  • サウンド出力を行うデバイスのオブジェクトからストリームバッファを作成します。
  • ストリームバッファの任意の位置に再生完了イベントを設定します。
  • 作成したストリームバッファにサウンド出力するデータを投入します。
  • ストリームバッファ上の任意の位置まで再生が完了したときにイベント通知が受けられるので、ストリームバッファで再生が完了した部分に新たにサウンド出力するデータを投入します。
  • 出力するデータがなくなった場合、サウンド出力を終了します。

.NET FrameworkでDirectSoundを利用するには、以下のクラスを参照設定で追加します。

追加するクラス

Microsoft.DirectX.DirectSound

サンプルプログラムの仕様

作成するサンプルプログラムは以下の仕様にします。

  • ウインドウ・スタイルはダイアログにする。
  • サウンドを出力するデバイスが複数ある場合、ユーザーが選択できる。
  • 再生するWAVファイルは、ユーザーが選択できる。
  • WAVファイルを選択後、[再生]ボタンで再生を開始する。
  • WAVファイルの再生中に[一時停止]ボタンを押すと、再生を一時中断し、[再生]ボタンを押すと中断した時点から、再生を再開する。
  • [停止]ボタンを押すと再生を終了し、[再生]ボタンを押すとファイルの先頭から再生を開始する。
  • 音量調節および左右のバランス調節をダイアログから行えるようにする。

サンプルプログラムの外観は以下のようにします。

ダイアログの初期処理

ダイアログのLoad()メソッドでダイアログの初期処理を行います。

ダイアログの初期処理では、サウンド出力デバイスのリストを作成します。

サンプルコードを以下に示します。


/****************************************************************************/
/*!
 *  @brief  ダイアログの初期処理.
 *
 *  @param  [in]    sender  イベントの送信元のオブジェクト.
 *  @param  [in]    e       イベント情報.
 *
 *  @retval なし.
 */
private void Form1_Load(object sender, EventArgs e)
{
    //! デバイス名コンボボックスにDataTableオブジェクトを作成する.
    DataTable device_table = new DataTable();
    device_table.Columns.Add("NAME", typeof(string));
    device_table.Columns.Add("GUID", typeof(Guid));

    DevicesCollection   DsEnum = new DevicesCollection();
    DeviceInformation   info;
    int                 i;

    //! デバイス名コンボボックスにデバイス名と対応するGUIDを登録する.
    for( i = 0; i < DsEnum.Count; i++ ){
        info = DsEnum[i];

        //! 列挙したデバイス名が"プライマリ・デバイス"の場合、コンボボックスには追加しない.
        if( info.DriverGuid != System.Guid.Empty && info.Description != "" ){
            //! DataTableにデバイス名とGIUDを追加する.
            DataRow row = device_table.NewRow();
            row["NAME"] = info.Description;
            row["GUID"] = info.DriverGuid;
            device_table.Rows.Add( row );
        }
    }
    DsEnum = null;

    device_table.AcceptChanges();

    //! コンボボックスのDataSourceにDataTableを割り当てる.
    DeviceList_ComboBox.DataSource    = device_table;
    DeviceList_ComboBox.DisplayMember = "NAME";         // 表示.
    DeviceList_ComboBox.ValueMember   = "GUID";         // コンボボックスの値.
}
	

DirectSoundの出力デバイスをリストアップする

使用するオーディオドライバをユーザーが選択できるように、オーディオ出力可能なDirectSoundドライバをDevicesCollectionクラスから取得してコンボボックスにリストアップします。

DevicesCollectionクラスのプロパティは以下のとおりです。

クラス名Microsoft.DirectX.DirectSound.DevicesCollection
基本型

System.Object

プロパティ名説明
Count

オーディオ出力可能なDirectSoundドライバの個数を取得します。

Item(this)

指定した番号のドライバ情報(DeviceInformation)を取得します。
C#ではVBのように"Item"というプロパティ名はありません。
this[int index]というオブジェクト名+配列の添え字指定で"Item"相当のプロパティを取得します。

DeviceInformation構造体の主なプロパティは以下のとおりです。

構造体名Microsoft.DirectX.DirectSound.DeviceInformation
プロパティ名説明
Description

出力デバイスの説明文を取得します。

DriverGuid

出力デバイスのGUIDを取得します。

ModuleName

出力デバイスのモジュール名を取得します。

サンプルコードでは、コンボボックスに出力デバイスのGUIDと表示用にデバイスの説明文を示す文字列をコンボボックスに登録しています。



Windows、DirectXおよびDirectSoundは米国Microsoft Corporationの登録商標です。