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ドライバをDevicesCollectionクラスから取得してコンボボックスにリストアップします。
DevicesCollectionクラスのプロパティは以下のとおりです。
クラス名 | Microsoft.DirectX.DirectSound.DevicesCollection |
---|---|
基本型 | System.Object |
プロパティ名 | 説明 |
Count | オーディオ出力可能なDirectSoundドライバの個数を取得します。 |
Item(this) |
指定した番号のドライバ情報(DeviceInformation)を取得します。 |
DeviceInformation構造体の主なプロパティは以下のとおりです。
構造体名 | Microsoft.DirectX.DirectSound.DeviceInformation |
---|---|
プロパティ名 | 説明 |
Description | 出力デバイスの説明文を取得します。 |
DriverGuid | 出力デバイスのGUIDを取得します。 |
ModuleName | 出力デバイスのモジュール名を取得します。 |
サンプルコードでは、コンボボックスに出力デバイスのGUIDと表示用にデバイスの説明文を示す文字列をコンボボックスに登録しています。