国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

在C#中利用DirectX實現聲音播放

2024-07-21 02:17:39
字體:
來源:轉載
供稿:網友
    我感覺聲音的播放比較簡單。我們從播放聲音開始。為什么我這么覺得?我也不知道。

 這里是展示最簡單的directx播放聲音的例子,我盡量省略了無關的代碼。最后的代碼只有19行,夠簡單了吧?

 準備工作:

 1.安裝了directx sdk(有9個dll文件)。這里我們只用到microsoft.directx.dll 和 microsoft.directx.directsound.dll

 2.一個wav文件。(這樣的文件比較好找,在qq的目錄里就不少啊。這里就不多說了。)名字叫snd.wav,放在最后目標程序的同個目錄下面

 開始寫程序啦。隨便用個ultraedit就好了。

 1.引入directx 的dll文件的名字空間:

using microsoft.directx;
using microsoft.directx.directsound;


 2.建立設備。在我們導入的microsoft.directx.directsound空間中,有個device的類。這個是表示系統中的聲音設備。

device dv=new device();


 3.設置cooperativelevel。因為windows是多任務的系統,設備不是獨占的,所以在使用設備前要為這個設備設置cooperativelevel。調用device的setcooperativelevel方法:其中,第一個參數是一個control,第二個參數是個枚舉類型。

 在這個程序中,control我隨便弄了個參數塞進去(很汗吧?。?。如果在windows程序中,可以用this代替。第二個參數就是優先級別,這里表示優先播放。

dv.setcooperativelevel((new uf()),cooperativelevel.priority);


 4.開辟緩沖區。對于上面的聲音設備,他有個自己的緩沖區,叫主緩沖區。系統中,一個設備有唯一的主緩沖區。由于windows是多任務(又是這個!),所以可以有幾個程序同時利用一個設備播放聲音,所以每個程序都自己開辟一個二級緩沖區,放自己的聲音。

 系統根據各個程序的優先級別,按照相應的順序分別去各個二級緩沖區中讀取內容到主緩沖區中播放。這里,我們為snd.wav開辟一個緩沖區。

 其中,第一個參數表示文件名(傻瓜都看出來了?。?,第二個就是需要使用的設備。

secondarybuffer buf=new secondarybuffer(@"snd.wav",dv);


 5.接下來就可以播放啦。第一個參數表示優先級別,0是最低的。第2個參數是播放方式,這里是循環播放。

buf.play(0,bufferplayflags.looping);


 6.由于命令行程序沒有消息循環,執行完代碼就退出了,所以,我們需要暫停程序。

console.read();


 7.關鍵的部分已經完了,這里只是交代一下剛才的那個倒霉的new uf() 是什么東西。這個完全是為了應付setcooperativelevel的參數要求。我不知道這樣做有什么附作用(各位如果因此把聲卡燒了…………)

class uf:form{}


 8.代碼寫完啦~~~。下面可以編譯了,這里編譯比較復雜點。

csc /r:directx/microsoft.directx.dll;directx/microsoft.directx.directsound.dll dxsnd.cs


 這里,我把2個dll文件放在當前目錄的directx目錄下(這個是我自己建的,你只需要指出這2個文件的位置就可以了。)

 順便把我的目錄結構說明一下:

|
|--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 test1
{
 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(0,bufferplayflags.looping);
   console.readline();
  }
  class uf:form{}
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂托克前旗| 志丹县| 长丰县| 晋州市| 宁强县| 万全县| 乌什县| 沙田区| 崇义县| 永平县| 九寨沟县| 新巴尔虎右旗| 汝阳县| 洞口县| 许昌县| 舒兰市| 城步| 重庆市| 灵武市| 扶沟县| 大荔县| 浦江县| 富平县| 万全县| 华亭县| 常熟市| 英德市| 美姑县| 藁城市| 香港 | 明溪县| 乐都县| 吕梁市| 永泰县| 镇雄县| 洪江市| 将乐县| 江门市| 太原市| 全州县| 巴林右旗|