Microsoft Windows 驅動程式模型(WDM)音訊驅動程式會將音訊裝置表示為 KS 濾波器,並將裝置上的硬體緩衝區表示為濾波器上的插腳。 當用戶端將屬性要求傳送至其中一個篩選或釘選物件時,埠驅動程式會收到要求,並將其路由至埠驅動程式或迷你埠驅動程式中的適當屬性處理常式。
音訊裝置支援三種屬性:
篩選屬性
篩選屬性是篩選整體的屬性,而不是篩選內特定針腳或節點的屬性。 篩選屬性的要求會指定篩選控制碼,但不會指定節點識別碼。
釘選屬性
針腳屬性是篩選器上特定針腳實例的屬性。 針對這些屬性的要求會指定引腳控制碼,但不會指定節點識別碼。
節點屬性
節點屬性是篩選器內拓蹼節點的屬性。 節點屬性的要求會指定篩選控制碼或針腳控制碼,以及節點識別碼。
節點屬性請求是否指定篩選器或釘控制碼,取決於該節點是否是篩選器專屬的。 如需詳細資訊,請參閱下列節點屬性一節。
下圖顯示這三種屬性要求:傳送至針腳實例的針腳屬性要求、傳送至位於濾波器或針腳實例上的節點的節點屬性要求,以及傳送至濾波器實例的濾波器屬性要求。
一般而言,埠驅動程式會處理篩選和釘選屬性的大部分要求,而迷你埠驅動程式會處理節點屬性的要求。
埠驅動程式會針對 SysAudio 系統驅動程式 所使用的篩選和針腳屬性提供內建的處理常式 (請參閱 KSPROPSETID_Sysaudio 和 KSPROPSETID_Sysaudio_Pin) 和 WDMAud 系統驅動程式。 迷你埠驅動程式不需要實作埠驅動程式所處理屬性的處理常式。 典型的迷你埠驅動程式通常不提供,有的話也只提供很少的篩選和針腳屬性的處理函式。 迷你埠驅動程式會提供節點屬性的處理常式,這些屬性代表音訊裝置的硬體相依功能。 埠驅動程式不提供節點屬性的內建處理,但 KSPROPERTY_TOPOLOGY_NAME 除外。
當埠驅動程式和迷你埠驅動程式都提供相同屬性的處理常式時,埠驅動程式會使用自己的處理常式,並忽略迷你埠驅動程式的處理常式。
篩選描述元
埠驅動程式會呼叫 IMiniport::GetDescription 方法,以取得迷你埠驅動程式屬性處理常式的指標。 透過這個方法,埠驅動程式會擷取迷你埠驅動程式篩選描述元的指標,這是類型 PCFILTER_DESCRIPTOR 的結構。 此結構指定篩選器、引腳和節點屬性的迷你埠驅動程式的屬性處理常式:
PCFILTER_DESCRIPTOR結構的 AutomationTable 成員會指向篩選的自動化資料表。 下表指定篩選屬性的迷你埠驅動程式屬性處理常式。
PCFILTER_DESCRIPTOR結構的Pins成員包含接腳的自動化表格。 每個數據表都會指定特定針腳類型針腳屬性的屬性處理常式。
PCFILTER_DESCRIPTOR結構的 Nodes 成員包含篩選內拓撲節點的自動化資料表。 每個表格都會指定特定節點類型之節點屬性的屬性處理常式。
篩選器屬性
埠驅動程式會透過 PCFILTER_DESCRIPTOR 的 AutomationTable 成員來存取迷你埠驅動程式的篩選屬性處理常式。 一般而言,此自動化數據表包含很少的處理常式,因為埠驅動程式會針對 SysAudio 和 WDMAud 用來查詢和設定音訊裝置的所有篩選屬性提供自己的內建處理常式。
迷你埠驅動程式可以提供過濾屬性的處理常式,例如 KSPROPERTY_GENERAL_COMPONENTID,從而提供埠驅動程式無法取得的硬體相依資訊。 Microsoft Windows 驅動程式套件 (WDK) 中的兩個範例音訊驅動程式會處理 KSPROPERTY_GENERAL_COMPONENTID 屬性。 如需詳細資訊,請參閱 Sysvad 範例驅動程式中的迷你埠驅動程式實作,如 範例音訊驅動程式中所述。
Portcls.sys 中的所有埠驅動程式都會提供 KSPROPSETID_Pin 和 KSPROPSETID_Topology 屬性集的處理。 這些集合中的所有屬性都是篩選器屬性,但 KSPROPERTY_TOPOLOGY_NAME 除外,它是節點屬性(使用篩選器控制代碼,而不是 pin 控制代碼,來指定請求的目標)。 埠驅動程式支援下列KSPROPSETID_Pin屬性子集:
KSPROPERTY_PIN_CONSTRAINEDDATARANGES
KSPROPERTY_PIN_DATAINTERSECTION
KSPROPERTY_PIN_GLOBALCINSTANCES
KSPROPERTY_PIN_NECESSARYINSTANCES
KSPROPERTY_PIN_PHYSICALCONNECTION
KSPROPERTY_PIN_PROPOSEDATAFORMAT
KSPROPERTY_PIN_PROPOSEDATAFORMAT2
這些屬性提供隸屬於過濾器的 pin 工廠的相關資訊。 一般而言,客戶端會在建立 pin 实例之前,先查詢這些屬性的濾鏡。 埠驅動程式支援所有四個KSPROPSETID_Topology屬性,這些屬性提供篩選內部拓撲的相關資訊。
此外,DMus 埠驅動程式會提供 KSPROPERTY_SYNTH_MASTERCLOCK 屬性的處理常式,這是 DirectMusic 篩選器的僅供取得的屬性。 KSPROPERTY_SYNTH_MASTERCLOCK 是 KSPROPSETID_SynthClock 屬性集的成員。
針腳屬性
埠驅動程式會透過 PCFILTER_DESCRIPTOR 的管腳成員來存取小埠驅動程式的管腳屬性處理程序。 此成員會指向針腳描述元的陣列,而每個描述元都會指向針腳類型的自動化資料表 (由針腳識別碼識別,這只是陣列索引) 。
一般而言,這些自動化表格包含很少的項目,因為埠驅動程式會針對 SysAudio 和 WDMAud 使用的所有端點屬性提供自己的處理常式。 迷你埠驅動程式可以選擇為埠驅動程式未處理的一或多個針腳屬性提供處理函式,但只有了解這些屬性的用戶端才能傳送屬性要求。
除了拓撲埠驅動程式之外,Portcls.sys 中的所有埠驅動程式都會提供下列針腳屬性的內建處理常式:
KSPROPERTY_CONNECTION_DATAFORMAT
KSPROPERTY_CONNECTION_ALLOCATORFRAMING
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
此清單中的某些屬性需要來自迷你埠驅動程式的硬體相依資訊。 當埠驅動程式收到包含其中一個屬性要求的 IRP 時,它不會將 IRP 傳遞至迷你埠驅動程式。 相反地,埠驅動程式會自行處理要求,但其處理常式會藉由呼叫迷你埠驅動程式中的進入點來取得所需的資訊。 例如,埠驅動程式會針對KSPROPERTY_AUDIO_POSITION要求提供自己的屬性處理常式。 此處理器會呼叫迷你埠驅動程式資料流的GetPosition方法(例如IMiniportWavePciStream::GetPosition)來獲取當前的位置。
節點屬性
埠驅動程式會透過 PCFILTER_DESCRIPTOR 的 Nodes 成員來存取迷你埠驅動程式的節點屬性處理常式。 此成員指向節點描述元的陣列,而每一個描述元都指向節點類型的自動化表格 (由節點識別碼識別,這只是陣列索引) 。 一般而言,屬於迷你埠驅動程式的所有或大部分屬性處理常式都位於 Nodes 陣列中。 音訊驅動程式會將音訊裝置中的硬體控制項表示為拓撲節點,而且它會使用屬性機制來提供用戶端對硬體相依控制項設定的存取權。
如先前所述,客戶端會將篩選器屬性請求傳送至篩選器控制碼,並將連接埠屬性請求傳送至連接埠控制碼。 不同於篩選或針腳實例,節點不是核心物件,而且沒有控制碼。 客戶端會將節點屬性請求傳送至針腳控制碼或篩選控制碼,但請求也會指定節點 ID,以指出請求是針對節點屬性,而不是針腳或篩選屬性。
以下是判斷節點屬性是否應該使用篩選控制碼或引腳控制碼的一般規則:
如果篩選包含特定針腳類型的數個實例,且該類型的每個針腳都包含具有特定節點標識碼的節點,則每個針腳實例都包含節點的實例。 在此情況下,節點屬性要求必須指定針腳控制碼 (,而不只是篩選控制碼) ,以區分相同節點類型的數個實例。 引腳句柄和節點識別碼的組合能夠明確地將某個特定節點實例確定為該請求的目標。
如果篩選器只包含特定節點的一個實例,則節點屬性要求會指定篩選器控點。 篩選控制碼和節點識別碼的組合足以明確識別作為要求目標的節點。
不過,在實作特定節點屬性的處理常式之前,驅動程式寫入器應該參考 音訊驅動程式屬性集 ,以檢查屬性的目標是否應該指定為篩選控制碼或針腳控制碼。
Portcls.sys 中的埠驅動程式目前不提供節點屬性的內建處理,但KSPROPERTY_TOPOLOGY_NAME除外。
過度指定和未充分指定的屬性要求
司機應準備好處理不遵守上述規則的客戶的財產請求。 要求可以過度指定或不足指定:
過度指定的要求
如果屬性要求只需要篩選句柄,但用戶端改為將要求傳送至釘選句柄,則要求的目標會過度指定。 不過,驅動程式通常會將要求視為有效,也就是說,他們會將要求視為已傳送至包含接腳的篩選器。
未指定的請求
如果屬性請求需要傳入 pin 控制碼,但用戶端改為將請求傳送至篩選控制碼,則該請求的目標會指定不足。 例如,如果篩選包含數個具有相同節點類型的針腳實例,而且用戶端會將該節點類型屬性的要求傳送至篩選句柄,而不是針腳句柄,驅動程式就無法判斷哪個節點實例應該接收要求。 在這種情況下,行為取決於驅動程序。 某些驅動程式不會自動失敗所有未指定的要求,而是將未指定的集合屬性要求視為有效。 在這種情況下,這種解釋是該要求會設定指定節點 ID 的預設值。 當接腳處理站建立新的節點實例時,屬於新節點的屬性會初始化為預設值。 變更預設值的要求不會影響在該要求之前已建立的節點執行個體。 此外,驅動程式普遍無法處理未具體指定的 get-property 請求,因為處理常式無法判斷需要查詢哪個節點實例以獲取屬性。
規則的例外狀況
由於歷史原因,一些音訊屬性具有違反這些一般規則的行為怪癖。 以下是一些範例:
如套用 Speaker-Configuration 設定中所述,用戶端可以設定 3-D 節點 (KSNODETYPE_3D_EFFECTS) 的 KSPROPERTY_AUDIO_CHANNEL_CONFIG 屬性,以變更音訊裝置的喇叭設定。 喇叭配置設定是全域的,因為它會變更所有參與之混音的串流的喇叭配置,裝置透過喇叭播放。 根據一般規則,影響整個篩選器的節點屬性請求應該指定篩選控制代碼(加上節點識別碼)。 不過,此特定屬性需要埠針控制碼,而不是濾波器控制碼。 針腳控制碼會指定包含 3-D 節點的針腳實例,其中該 3-D 節點是作為請求的目標。
KSPROPERTY_SYNTH_VOLUME 和 KSPROPERTY_SYNTH_MASTERCLOCK 是合成器節點 (KSNODETYPE_SYNTHESIZER) 的屬性。 雖然兩者都是節點屬性,但這些屬性的請求不包括節點 ID。 (請注意,要求的屬性描述項是 KSPROPERTY 類型的結構,而不是 KSNODEPROPERTY。)此行為違反節點屬性需要節點標識碼的一般規則。 儘管有此差異,但支援任一屬性的迷你埠驅動程式應該透過 PCFILTER_DESCRIPTOR 的 Nodes 成員 (而不是 Pins 成員) 提供屬性處理常式。