Wednesday, May 02, 2007

在 Testcap 內新增 Audio Capture Pin,並且讓 Windows 的音效裝置可以選擇它



說實在的,這個問題在 microsoft.public.development.device.drivers 討論區內有人提過,不過講的不是很清楚。

Testcap 的 filter graph:



一開始我的想法很簡單:讓 testcap 自己長出一根 Audio Capture Pin,如此 Windows 應該會把這個裝置當作麥克風來使用吧...,結果當然是不行啦。看完討論區之後,發現,喔,原來我們在 Windows 的『聲音及音訊裝置』內看到的『音訊』都是 SysAudio.sys 這隻 driver 所 enumerate 完所有的 Audio Device 之後再回報給 Windows,所以是 SysAudio.sys 不認為 testcap 是個 audio capture device。

Testcap 的 filter graph:



所以,要如何讓 SysAudio.sys 認為 testcap 是個 Audio Capture Device?用圖來講比較簡單:




SysAudio.sys 要認定一個 Audio Capture Device 的條件有:
1. 有 Analog Audio Input Pin
2. 有 Audio Output Pin
3. 這兩根 Pin 之間必須有一個以上的 Node 存在。

Node 跟 Connection 在 DDK 的定義為:描述一個 Filter 內部的連接狀態。很模糊對不對?去看完 USB Video 或 Audio Class 之後就會比較清楚了。簡言之,就是讓 Host 能夠知道你這個裝置到底有哪些特異功能可以使用,如 Video 的話,就是能不能調整 Brigntness、Hue 等等,如果是 Audio 的話,就是能不能調整音量大小等等。

5 comments:

Unknown said...

您好,
請問Testcap 的filter,
是指DirectShow實作出來的Filter嗎?

GraphEdt.exe的Audio Capture Source裡,
有Microphone和Stereo Mix,
且如您所說有Input Pin(名稱為主音量)和Output Pin(Capture).

而我用DirectShow實作的Virtual Audio Filter, 只有1個Output Pin(Capture), 它也出現在GraphEdt.exe的Audio Capture Source裡, 並可成功輸出Audio.

然而在Flash Player裡, 沒有顯示我的Virtual Audio Device, 只有Microphone和 Stereo Mix.

可以請您指導一下嗎?
謝謝

OD said...

Testcap 是在 Windows DDK (也就是後來的 Windows Driver Kit - WDK). 他是一個虛擬的 audio device driver.

1. 你的 filter 有支援 Volume control 嗎?
2. 如果有的話,那應該就是 sysaudio.sys 會把 DirectShow filter 檔掉。

Unknown said...

1. 沒有支援Volume control
(用GraphEdt看時, 不像Microphone和 Stereo Mix, 有Filter Properies可以調整音量;
在Adobe Flash Live Encoder, 要調音量時, 顯示"不支援此介面").


我想試著依照您文章所述, 加一個Analog Audio Input Pin,
並且實作DirectShow IAMAudioInputMixer interface, 以支援Volume control.


在MSDN有個Audio Capture filter文件,
請問我是否要實作裡面所提及的所有interface?


我在CSDN技術論壇的提問([DirectShow] Virtual Audio Device)中,
有更多描述,
若您有空請幫我看看.

http://bbs.csdn.net/topics/390634907?page=1#post-396045603

謝謝您的回覆: )

OD said...

有幾個方向可以試:
1. System Device Enumerator 可以 enum 到你目前的 filter 嗎?如果可以的話,你目前的方向應該是錯的。如果不行的話,卻可以 enum 到其他的,那就只能想辦法讓他可以 enum 到。這個得先寫個程式才行,不過總比做完才發現不行好多了。
2. 直接換到 DDK 的 virtual audio driver,那個直接就可以用。不過我沒試過 windows vista 之後的環境,可能會遇到 driver certification 的問題。

Unknown said...

1. System Device Enumerator 可以 enum 到我的 filter. 可以請您再詳細一點告訴我, 為什麼方向是錯的?

2. 好, 我會試著使用DDK的MSVAD Sample.
謝謝您的回覆: )

codeblock