熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 09:55:44  來源: .NET編程 

  我感覺聲音的播放比較簡單我們從播放聲音開始為什麼我這麼覺得?我也不知道
  
  這裡是展示最簡單的DirectX播放聲音的例子我盡量省略了無關的代碼最後的代碼只有夠簡單了吧?
  
  准備工作
  

  安裝了DirectX SDK(有個DLL文件)這裡我們只用到MicroSoftDirectXdll 和 MicrosoftDirectxDirectSounddll
  
  一個WAV文件(這樣的文件比較好找在QQ的目錄裡就不少啊這裡就不多說了)名字叫SNDWAV放在最後目標程序的同個目錄下面
  
  開始寫程序啦隨便用個UltraEdit就好了
  
  引入DirectX 的DLL文件的名字空間
  
  using MicrosoftDirectX;
  using MicrosoftDirectXDirectSound;
  
  建立設備在我們導入的MicrosoftDirectXDirectSound空間中有個Device的類這個是表示系統中的聲音設備
  
  Device dv=new Device();
  
  設置CooperativeLevel因為Windows是多任務的系統設備不是獨占的所以在使用設備前要為這個設備設置CooperativeLevel調用Device的SetCooperativeLevel方法其中第一個參數是一個Control第二個參數是個枚舉類型
  
  在這個程序中Control我隨便弄了個參數塞進去(很汗吧!)如果在windows程序中可以用this代替第二個參數就是優先級別這裡表示優先播放
  
  dvSetCooperativeLevel((new UF())CooperativeLevelPriority);
  
  開辟緩沖區對於上面的聲音設備他有個自己的緩沖區叫主緩沖區系統中一個設備有唯一的主緩沖區由於windows是多任務(又是這個!)所以可以有幾個程序同時利用一個設備播放聲音所以每個程序都自己開辟一個二級緩沖區放自己的聲音
  
  系統根據各個程序的優先級別按照相應的順序分別去各個二級緩沖區中讀取內容到主緩沖區中播放這裡我們為SNDWAV開辟一個緩沖區
  
  其中第一個參數表示文件名(傻瓜都看出來了!)第二個就是需要使用的設備
  
  SecondaryBuffer buf=new SecondaryBuffer(@sndwavdv);
  
  接下來就可以播放啦第一個參數表示優先級別是最低的個參數是播放方式這裡是循環播放
  
  bufPlay(BuffERPlayFlagsLooping);
  
  由於命令行程序沒有消息循環執行完代碼就退出了所以我們需要暫停程序
  
  ConsoleRead();
  
  關鍵的部分已經完了這裡只是交代一下剛才的那個倒霉的new UF() 是什麼東西這個完全是為了應付SetCooperativeLevel的參數要求我不知道這樣做有什麼附作用(各位如果因此把聲卡燒了…………)
  
  class UF:Form{}
  
  代碼寫完啦~~~下面可以編譯了這裡編譯比較復雜點
  
  csc /r:directX\MicroSoftDirectXdll;directX\MicrosoftDirectxDirectSounddll dxsndcs
  
  這裡我把個DLL文件放在當前目錄的directx目錄下(這個是我自己建的你只需要指出這個文件的位置就可以了
  
  順便把我的目錄結構說明一下
  
  |
  |dxsndcs
  |sndwav
  |<directx>
  |
  |MicroSoftDirectXdll
  |MicrosoftDirectxdll
  
  下面是完整代碼
  
  //dxsndcs
  using System;
  using MicrosoftDirectX;
  using MicrosoftDirectXDirectSound;
  using SystemWindowsForms;
  namespace test
  {
  class test
  {
  public static void Main(string [] args)
  {
  Device dv=new Device();
  dvSetCooperativeLevel((new UF())CooperativeLevelPriority);
  SecondaryBuffer buf=new SecondaryBuffer(@sndwavdv);
  bufPlay(BufferPlayFlagsLooping);
  ConsoleReadLine();
  }
  class UF:Form{}
  }
  }
From:http://tw.wingwit.com/Article/program/net/201311/12004.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.