それでは本格的に説明させて頂きます。
一応載せておきます。
using System; using System.Windows.Forms; using System.IO; using Microsoft.DirectX.DirectSound; using DS = Microsoft.DirectX.DirectSound; namespace Sound2 { /// <summary> /// Class1 の概要の説明です。 /// </summary> public class SoundForm:Form { private Device device_; private DS.SecondaryBuffer secondaryBufferA_; //開くファイル private string fileName =@"i:\temp\test.wav"; public SoundForm() { this.Text="DirectSoundのテスト"; DSInitialize(); } protected override void Dispose( bool disposing ) { if( disposing ) { if(secondaryBufferA_ != null) { secondaryBufferA_.Stop(); secondaryBufferA_.Dispose(); } if(device_ != null) { device_.Dispose(); } } base.Dispose( disposing ); } private void DSInitialize() { device_ =new Device(); //協調レベルの設定 device_.SetCooperativeLevel(this,CooperativeLevel.Normal); //バッファについての情報設定クラス BufferDescription desc=new BufferDescription(); //セカンダリバッファを作成 secondaryBufferA_ = new SecondaryBuffer(fileName,desc,device_); //再生開始 secondaryBufferA_.Play(0,0); } } public class Program { public static void Main() { Application.Run(new SoundForm()); } } }
かなり簡単に再生できます。
音を出す装置です。これがないと音を流せません。引数がないのでそのまま作成しましょう。
デバイスを使えるようにするためには「協調レベル」というものを設定しなければいけません。これは、Deviceが音を出すときの制限を定めるものです。Windowsはマルチタスクなので、他のアプリケーションを考える必要があるからです。次の三つがあります。
この協調レベルでは、22 KHz、ステレオ サウンド、8 ビット サンプリングのプライマリバッファフォーマットを使う。デバイスはアプリケーション間で最も円滑に切り替えられます。プライマリバッファのフォーマット設定、プライマリバッファへの書き込みデバイスのオンボードメモリ圧縮が使えない。
アプリケーションはハードウェアミキシングなどのハードウェアリソースに対して最高の権限を確保する。プライマリバッファのフォーマット設定、デバイスのオンボードメモリの圧縮を行える。
ゲームでは、たいてい優先協調レベルを使います。このレベルは、サンプリングレートとビット深度に対するアプリケーション制御を可能にしながら最も強力に動作します。
最上位の協調レベルはこれです。この協調レベルではプライマリサウンドバッファに直接アクセスできます。言い換えると、プライマリバッファに直接書き込みを行わなければなりません。この書き込み中は、セカンダリバッファを再生できません。
このサンプルではノーマルを設定していますが、ゲームであれば、「優先協調レベル」になるでしょう。
バッファにはプライマリバッファとセカンダリバッファがあります。今はまだプライマリバッファを気にする必要がないのでセカンダリバッファだけを考えます。
セカンダリバッファは複数作ることが出来ます。そして、それらをミキシングすることによってプライマリバッファを作り再生するのです。つまり、まずはセカンダリバッファに再生するデータを入れなければ再生できないのです。
//バッファについての情報設定クラス BufferDescription desc=new BufferDescription(); //セカンダリバッファを作成 secondaryBufferA_ = new SecondaryBuffer(fileName,desc,device_); //再生開始 secondaryBufferA_.Play(0,0);
今回は細かいことをしないので上のように短く収まっています。
どんな能力を持ったバッファを作るかを指定するためのものです。今回は初期設定のまま使います。
ファイル名と少しを渡すだけで作れます。信じられないくらい簡単です。
「Play(0,0)」で再生です。
今回はこんなモンです。とりあえず協調レベルさえ覚えておけば大丈夫です。他については後で詳しく解説していきます。