SewiGの日記
2005-06-27 [月]
■ [Music][Video] Lia 1st Concert Lia's Cafe 'Prologue' at Shibuya O-East
さすがLiaさん、生でもハイクオリティの歌声を披露してくれました。まだ、ライブ慣れしてない感じですが、これからもがんばってほしいと思います。バンドアレンジされた楽曲もまた斬新で聴いてて面白いです。
ところで、DVD版はカットされすぎだと思うのですが。
2006-06-27 [火]
■ [C#][Programming] C#でサウンド(5)
DirectSoundを使う
C#でDirectXを利用する場合はDirectX9が前提になります。しかし、DirectXなら複数のサウンドも勝手にミックスしてくれたりしますし、もし描画にDirect3Dを使ってるならぜひあわせて使うといいでしょう。
まず、初期化。
Microsoft.DirectX.DirectSound.Deviceがデバイスのオブジェクトです。この辺はDirect3Dなんかと設計が統一されているので分かりやすいですね。それから、SecondaryBuffer。SetCooperativeLevelは強調レベルという優先度みたいな設定があるのですが、なぜか、引数にSystem.Windows.Forms.Controlを要求してきます。new Form()でも与えれば良さそうだけど、ここは真面目に親フォームを指定しておきましょう。SecondaryBufferがあるのだからPrimaryBufferも当然あるのですが、PrimaryBufferは意識する必要がありません。SecondaryBufferに書き込んだデータがしかるべきタイミングでPrimaryBufferに書き込まれこれが再生されます。
using Microsoft.DirectX.DirectSound; Device device; SecondaryBuffer buffer; device = new Device(); device.SetCooperativeLevel(owner, CooperativeLevel.Normal); BufferDescription desc = new BufferDescription(); buffer = new SecondaryBuffer(filename, desc, device);
なんか、SecondaryBufferのコンストラクタにファイル名を書き込むあたりに抽象度の高さを感じざるを得ませんが変更しないオーディオを再生させるだけならこれでもOK。もちろんメモリをオーディオの大きさだけ消費します。
再生は
buffer.Play(0, BufferPlayFlags.Default);
ループ再生なら
buffer.Play(0, BufferPlayFlags.Looping);
停止は
buffer.Stop();
ただし、停止後の再生箇所は停止位置からとなるので、もし最初から再生したければ、再生位置を変更します。
buffer.SetCurrentPosition(0);
使い終わったら解放します。解放するのはSecondaryBufferとDeviceの両方です。
まとめると以下のようになります。
using System; using System.Windows.Forms; using Microsoft.DirectX.DirectSound; namespace Sample { public class DSPlay { private Device device; private SecondaryBuffer buffer; public DSPlay(Control owner, string filename) { device = new Device(); device.SetCooperativeLevel(owner, CooperativeLevel.Normal); BufferDescription desc = new BufferDescription(); buffer = new SecondaryBuffer(filename, desc, device); } public void close() { if (buffer != null) { buffer.Stop(); buffer.SetCurrentPosition(0); buffer.Dispose(); } if (device != null) { device.Dispose(); } } public void play() { buffer.Play(0, BufferPlayFlags.Default); // buffer.Play(0, BufferPlayFlags.Looping); } public void stop() { buffer.Stop(); } } }
● Icuhjbru [A kissaten is in on administrative leave with pay.There ar..]