我感覺聲音的播放比較簡單
我們從播放聲音開始
為什麼我這麼覺得?我也不知道
這裡是展示最簡單的DirectX播放聲音的例子
我盡量省略了無關的代碼
最後的代碼只有
行
夠簡單了吧?
准備工作
安裝了DirectX SDK(有
個DLL文件)
這裡我們只用到MicroSoft
DirectX
dll 和 Microsoft
Directx
DirectSound
dll
一個WAV文件
(這樣的文件比較好找
在QQ的目錄裡就不少啊
這裡就不多說了
)名字叫SND
WAV
放在最後目標程序的同個目錄下面
開始寫程序啦
隨便用個UltraEdit就好了
引入DirectX 的DLL文件的名字空間
using Microsoft
DirectX;
using Microsoft
DirectX
DirectSound;
建立設備
在我們導入的Microsoft
DirectX
DirectSound空間中
有個Device的類
這個是表示系統中的聲音設備
Device dv=new Device();
設置CooperativeLevel
因為Windows是多任務的系統
設備不是獨占的
所以在使用設備前要為這個設備設置CooperativeLevel
調用Device的SetCooperativeLevel方法
其中
第一個參數是一個Control
第二個參數是個枚舉類型
在這個程序中
Control我隨便弄了個參數塞進去(很汗吧!)
如果在windows程序中
可以用this代替
第二個參數就是優先級別
這裡表示優先播放
dv
SetCooperativeLevel((new UF())
CooperativeLevel
Priority);
開辟緩沖區
對於上面的聲音設備
他有個自己的緩沖區
叫主緩沖區
系統中
一個設備有唯一的主緩沖區
由於windows是多任務(又是這個!)
所以可以有幾個程序同時利用一個設備播放聲音
所以每個程序都自己開辟一個二級緩沖區
放自己的聲音
系統根據各個程序的優先級別
按照相應的順序分別去各個二級緩沖區中讀取內容到主緩沖區中播放
這裡
我們為SND
WAV開辟一個緩沖區
其中
第一個參數表示文件名(傻瓜都看出來了!)
第二個就是需要使用的設備
SecondaryBuffer buf=new SecondaryBuffer(@
snd
wav
dv);
接下來就可以播放啦
第一個參數表示優先級別
是最低的
第
個參數是播放方式
這裡是循環播放
buf
Play(
BuffERPlayFlags
Looping);
由於命令行程序沒有消息循環
執行完代碼就退出了
所以
我們需要暫停程序
Console
Read();
關鍵的部分已經完了
這裡只是交代一下剛才的那個倒霉的new UF() 是什麼東西
這個完全是為了應付SetCooperativeLevel的參數要求
我不知道這樣做有什麼附作用(各位如果因此把聲卡燒了…………)
class UF:Form{}
代碼寫完啦~~~
下面可以編譯了
這裡編譯比較復雜點
csc /r:directX\MicroSoft
DirectX
dll;directX\Microsoft
Directx
DirectSound
dll dxsnd
cs
這裡
我把
個DLL文件放在當前目錄的directx目錄下(這個是我自己建的
你只需要指出這
個文件的位置就可以了
)
順便把我的目錄結構說明一下
|
|
dxsnd
cs
|
snd
wav
|
<directx>
|
|
MicroSoft
DirectX
dll
|
Microsoft
Directx
dll
下面是完整代碼
//dxsnd
cs
using System;
using Microsoft
DirectX;
using Microsoft
DirectX
DirectSound;
using System
Windows
Forms;
namespace test
{
class test
{
public static void Main(string [] args)
{
Device dv=new Device();
dv
SetCooperativeLevel((new UF())
CooperativeLevel
Priority);
SecondaryBuffer buf=new SecondaryBuffer(@
snd
wav
dv);
buf
Play(
BufferPlayFlags
Looping);
Console
ReadLine();
}
class UF:Form{}
}
}
From:http://tw.wingwit.com/Article/program/net/201311/12004.html