2010-10-21 63 views
12

基本上,我需要的是挖掘到當前的音頻輸出,並檢查音量的方式,即我需要能夠檢查是否有一些播放音頻設備或不上。如何以編程方式獲取當前的音頻級別?

我並不需要檢查音量設置,但實際播放音頻流的音量。

對不起,我是問如何做到這一點在Windows上的Visual Studio 2008

@mikerobi:形成我推理的一部分 - 如果正在對系統音量計顯示它,必須有是一個系統調用,可以拿回來

+0

我不明白消極的反應,肯定有一種方式來看待正在播放什麼聲音?我不知道是否容易從該流中提取和獲取有用的信息,但這些評論並沒有指出正確的方向。 – 2010-10-21 23:34:16

+0

+1,現在該平臺被提及。從Windows Vista/7開始,我們有[核心音頻API](http://msdn.microsoft.com/en-us/library/dd370784%28VS.85%29.aspx),但我肯定從未使用過他們。讓我們嘗試標記這個「windows-api」並看看我們畫的是誰。:) – 2010-10-21 23:42:23

+0

也許你可以在這裏找到一些東西http://www.dreamincode.net/forums/topic/45693-controlling-sound-volume-in-c%23/#/ – BrunoLM 2010-10-21 23:50:21

回答

2

這是一個很好的問題。對於32位Windows應用程序,答案是掛鉤到winmm.dll和其他低級音頻控制DLL。在C#我想創建一個包裝類包含的extern方法原型:

public class MyAudioWrapper 
{ 
    [DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")] 
    public extern void GetWaveVolume(IntPtr devicehandle, out int Volume); 

    ... 
} 

看一看this link對於Windows音頻方法的列表;您可以使用調音臺或僅使用波形控制器來設置音量。你想用什麼來決定要導入的庫。您必須研究如何最好地定義原型,以及如何獲得音頻/混音器設備的句柄。

+1

Vista和更高版本的更好的答案是以環回模式打開音頻流並從中捕獲。 – 2010-10-22 01:48:07

2

這裏是一個有用的鏈接,Windows API的invokations,而這裏也正是你在找什麼:

http://www.pinvoke.net/default.aspx/winmm.waveOutGetVolume


由於需求變化,你不需要的音頻電平,我建議下面可能會有幫助:

我認爲你需要閱讀的是什麼的輸出流,並通過一些算法,你也許能決定耐候一些分析數據playedback正在playedback與否。要做到這一點,你需要的MMDevice API

http://msdn.microsoft.com/en-us/library/dd316556(v=VS.85).aspx

我不想discorage你,但相信我,這不是一件容易的事要完成,如果你不熟悉的非託管代碼。

  • 您必須在每個調用中填充許多結構。
  • 您必須按特定順序執行invokations。
  • 編組參考結構。

即使你完成了,你也無法預測設備的結果行爲。 祝你好運。

相關問題