篩選、釘選和節點屬性

Microsoft Windows 驅動程式模型 (WDM) 音訊驅動程式代表音訊裝置做為 KS 篩選器,而它們代表裝置上的硬體緩衝區做為篩選上的針腳。 當用戶端將屬性要求傳送至其中一個篩選或釘選物件時,埠驅動程式會收到要求,並將要求路由傳送至埠驅動程式或迷你埠驅動程式中的適當屬性處理常式。

音訊裝置支援三種屬性:

  • 篩選屬性

    篩選屬性是篩選準則整體的屬性,而不是篩選準則內特定針腳或節點的屬性。 篩選屬性的要求會指定篩選控制碼,但不會指定節點識別碼。

  • 釘選屬性

    pin 屬性是篩選上特定針腳實例的屬性。 這些屬性的要求會指定針腳控制碼,但不會指定節點識別碼。

  • 節點屬性

    節點屬性是篩選內拓撲節點的屬性。 節點屬性的要求會指定篩選控制碼或針腳控制碼,加上節點識別碼。

節點屬性要求是否指定篩選準則或針腳控制碼,取決於節點是否對篩選是唯一的。 如需詳細資訊,請參閱下列節點屬性一節。

下圖顯示這三種屬性要求:傳送至釘選實例的 pin 屬性要求、傳送至篩選或釘選實例 (節點的節點屬性要求) ,以及傳送至篩選實例的篩選屬性要求。

說明篩選、釘選和節點屬性要求的圖表。

一般而言,埠驅動程式會處理篩選和釘選屬性的大部分要求,而迷你埠驅動程式會處理節點屬性的要求。

埠驅動程式會為 SysAudio 系統驅動程式 所使用的篩選和釘選屬性提供自己的內建處理常式, (請參閱 KSPROPSETID_SysaudioKSPROPSETID_Sysaudio_Pin) 和 WDMAud 系統驅動程式。 迷你埠驅動程式不需要實作埠驅動程式所處理之屬性的處理常式。 一般的迷你埠驅動程式會提供篩選和釘選屬性的幾個處理常式。 迷你埠驅動程式會提供節點屬性的處理常式,這些屬性代表音訊裝置的硬體相依功能。 埠驅動程式不提供節點屬性的內建處理,但 KSPROPERTY_TOPOLOGY_NAME除外。

當埠驅動程式和迷你埠驅動程式都提供相同屬性的處理常式時,埠驅動程式會使用自己的處理常式,並忽略迷你埠驅動程式的處理常式。

篩選描述項

埠驅動程式會藉由呼叫 IMiniport::GetDescription 方法來取得迷你埠驅動程式屬性處理常式的指標。 透過這個方法,埠驅動程式會擷取迷你埠驅動程式篩選描述元的指標,這是類型 PCFILTER_DESCRIPTOR的結構。 此結構會指定篩選、釘選和節點屬性的迷你埠驅動程式屬性處理常式:

  • PCFILTER_DESCRIPTOR 結構的 AutomationTable 成員會指向篩選的自動化資料表。 此資料表會指定篩選屬性的迷你埠驅動程式屬性處理常式。

  • PCFILTER_DESCRIPTOR結構的 Pins 成員包含針腳的自動化資料表。 每個資料表都會指定特定針腳類型之針腳屬性的屬性處理常式。

  • PCFILTER_DESCRIPTOR結構的 Nodes 成員包含篩選內拓撲節點的自動化資料表。 每個資料表都會指定特定節點類型之節點屬性的屬性處理常式。

篩選屬性

埠驅動程式會透過 PCFILTER_DESCRIPTOR 的 AutomationTable 成員,存取迷你埠驅動程式的 filter-property 處理常式。 一般而言,此自動化資料表包含幾個處理常式,因為埠驅動程式會針對 SysAudio 和 WDMAud 用來查詢及設定音訊裝置的所有篩選屬性提供自己的內建處理常式。

不過,迷你埠驅動程式可以提供篩選屬性的處理常式,例如 KSPROPERTY_GENERAL_COMPONENTID 提供埠驅動程式無法使用的硬體相依資訊。 Microsoft Windows 驅動程式套件中的兩個範例音訊驅動程式 (WDK) 處理KSPROPERTY_GENERAL_COMPONENTID屬性。 如需詳細資訊,請參閱 Sysvad 範例驅動程式中的迷你埠驅動程式實作,其會在 範例音訊驅動程式中討論。

Portcls.sys 中的所有埠驅動程式都提供 KSPROPSETID_PinKSPROPSETID_Topology 屬性集的處理。 這些集合中的所有屬性都是篩選屬性,但 KSPROPERTY_TOPOLOGY_NAME除外,這是使用篩選控制碼而非針腳控制碼的節點屬性 (,以指定要求) 的目標。 埠驅動程式支援下列KSPROPSETID_Pin屬性子集:

KSPROPERTY_PIN_CATEGORY

KSPROPERTY_PIN_CINSTANCES

KSPROPERTY_PIN_COMMUNICATION

KSPROPERTY_PIN_CONSTRAINEDDATARANGES

KSPROPERTY_PIN_CTYPES

KSPROPERTY_PIN_DATAFLOW

KSPROPERTY_PIN_DATAINTERSECTION

KSPROPERTY_PIN_DATARANGES

KSPROPERTY_PIN_GLOBALCINSTANCES

KSPROPERTY_PIN_INTERFACES

KSPROPERTY_PIN_MEDIUMS

KSPROPERTY_PIN_NAME

KSPROPERTY_PIN_NECESSARYINSTANCES

KSPROPERTY_PIN_PHYSICALCONNECTION

KSPROPERTY_PIN_PROPOSEDATAFORMAT

KSPROPERTY_PIN_PROPOSEDATAFORMAT2

這些屬性提供屬於篩選準則的針腳處理站相關資訊。 一般而言,用戶端會先查詢這些屬性的篩選準則,再建立釘選實例。 埠驅動程式支援這四個KSPROPSETID_Topology屬性,以提供篩選內部拓撲的相關資訊。

此外,DMus 埠驅動程式會提供 KSPROPERTY_SYNTH_MASTERCLOCK 屬性的處理常式,這是 DirectMusic 篩選的僅限 get 屬性。 KSPROPERTY_SYNTH_MASTERCLOCK是 KSPROPSETID_SynthClock 屬性集的成員。

釘選屬性

埠驅動程式會透過 PCFILTER_DESCRIPTOR 的 Pin 成員存取迷你埠驅動程式的 pin 屬性處理常式。 這個成員會指向針腳描述元的陣列,而每個描述項指向針腳識別碼所識別之針腳類型的自動化資料表 (,這只是陣列索引) 。

一般而言,這些自動化資料表包含幾個專案,因為埠驅動程式會針對 SysAudio 和 WDMAud 使用的所有針腳屬性提供自己的處理常式。 迷你埠驅動程式可以選擇為埠驅動程式未處理的一或多個針腳屬性提供處理常式,但只有知道這些屬性的用戶端可以為其傳送屬性要求。

除了拓撲埠驅動程式之外,Portcls.sys 中的所有埠驅動程式都提供下列針腳屬性的內建處理常式:

KSPROPERTY_CONNECTION_STATE

KSPROPERTY_CONNECTION_DATAFORMAT

KSPROPERTY_CONNECTION_ALLOCATORFRAMING

KSPROPERTY_STREAM_ALLOCATOR

KSPROPERTY_STREAM_MASTERCLOCK

KSPROPERTY_AUDIO_POSITION

KSPROPERTY_DRMAUDIOSTREAM_CONTENTID

此清單中的某些屬性需要迷你埠驅動程式的硬體相依資訊。 當埠驅動程式收到包含其中一個屬性要求的 IRP 時,它不會將 IRP 傳遞至迷你埠驅動程式。 相反地,埠驅動程式會處理要求本身,但其處理常式會藉由呼叫迷你埠驅動程式中的進入點來取得所需的資訊。 例如,埠驅動程式會為KSPROPERTY_AUDIO_POSITION要求提供自己的屬性處理常式。 此處理程式只會呼叫迷你埠驅動程式資料流程的 GetPosition 方法 (,例如 IMiniportWavePciStream::GetPosition) 以取得目前的位置。

節點屬性

埠驅動程式會透過 PCFILTER_DESCRIPTOR 的 Nodes 成員存取迷你埠驅動程式的 node-property 處理常式。 這個成員指向節點描述項的陣列,而每個描述項指向節點類型 (由節點識別碼識別的自動化資料表,這只是陣列索引) 。 一般而言,屬於迷你埠驅動程式的所有或大部分屬性處理常式都位於 Nodes 陣列中。 音訊驅動程式會將音訊裝置中的硬體控制項表示為拓撲節點,並使用 屬性機制來提供用戶端硬體相依控制項設定的存取權。

如先前所述,用戶端會將篩選屬性要求傳送至篩選控制碼,並將 pin 屬性要求傳送至針腳控制碼。 不同于篩選或釘選實例,節點不是核心物件,而且沒有控制碼。 用戶端會將節點屬性要求傳送至針腳控制碼或篩選控制碼,但要求也會指定節點識別碼,以指出要求適用于節點屬性,而不是針腳或篩選屬性。

以下是判斷節點屬性是否應該使用篩選控制碼或釘選控制碼的一般規則:

  • 如果篩選包含特定針腳類型的數個實例,且該類型的每個針腳都包含具有特定節點識別碼的節點,則每個針腳實例都包含節點的實例。 在此情況下,node-property 要求必須指定針腳控制碼 (,而不只是篩選控制碼) 來區別相同節點類型的數個實例。 針腳控制碼和節點識別碼的組合,明確地將特定節點實例識別為要求的目標。

  • 如果篩選準則只包含特定節點的一個實例,節點屬性要求會指定篩選控制碼。 篩選控制碼和節點識別碼的組合就足以明確識別要求的目標節點。

不過,在實作特定節點屬性的處理常式之前,驅動程式寫入器應該參考 音訊驅動程式屬性集 ,以檢查屬性的目標是否應指定為篩選控制碼或針腳控制碼。

Portcls.sys 中的埠驅動程式目前不提供節點屬性的內建處理,但KSPROPERTY_TOPOLOGY_NAME除外。

Overspecified 和 Underspecified 屬性要求

驅動程式應該準備好處理未遵循上述規則之用戶端的屬性要求。 要求可以過度指定或未指定:

  • 過度指定的要求

    如果屬性要求只需要篩選控制碼,但用戶端會改為將要求傳送至釘選控制碼,則會過度指定要求的目標。 不過,驅動程式通常會將要求視為有效;也就是說,他們會將要求視為已傳送至包含針腳的篩選。

  • 未指定的要求

    如果屬性要求需要針腳控制碼,但用戶端會改為將要求傳送至篩選控制碼,則要求的目標會過低。 例如,如果篩選包含數個具有相同節點類型的針腳實例,而用戶端會將該節點類型之屬性的要求傳送至篩選控制碼,而不是針腳控制碼,則驅動程式無法判斷哪個節點實例應該接收要求。 在此情況下,行為取決於驅動程式。 某些驅動程式會將未指定的 set-property 要求視為有效,而不是自動失敗所有未指定的要求。 在此情況下,解譯是要求會設定指定節點識別碼的預設值。 當釘選處理站建立新的節點實例時,屬於新節點的屬性會初始化為預設值。 變更預設值的要求不會影響在要求之前建立的節點實例。 此外,驅動程式會統一失敗,因為處理常式無法判斷要查詢屬性的節點實例。

規則的例外狀況

基於歷史理由,有幾個音訊屬性具有違反這些一般規則的行為引數。 範例如下:

  • 套用 Speaker-Configuration 設定中所述,用戶端可以藉由設定 3D 節點 (KSNODETYPE_3D_EFFECTS) KSPROPERTY_AUDIO_CHANNEL_CONFIG屬性來變更音訊裝置的喇叭設定。 喇叭組態設定是全域的,因為它會變更裝置透過喇叭播放之混合的所有資料流程的喇叭組態。 根據一般規則,影響整體篩選準則的 node-property 要求應該指定篩選控制碼 (加上節點識別碼) 。 不過,這個特定屬性需要針腳控制碼,而不是篩選控制碼。 針腳控制碼會指定包含要求目標的 3D 節點的針腳實例。

  • KSPROPERTY_SYNTH_VOLUMEKSPROPERTY_SYNTH_MASTERCLOCK 是 synth-節點的屬性 (KSNODETYPE_SYNTHESIZER) 。 雖然兩者都是節點屬性,但這些屬性的要求不包含節點識別碼。 (請注意,要求的屬性描述項是KSPROPERTY 類型的結構,而不是 KSNODEPROPERTY.) 此行為違反節點屬性需要節點識別碼的一般規則。 儘管有這種差異,支援任一屬性的迷你埠驅動程式應該透過 PCFILTER_DESCRIPTOR (的 Nodes 成員提供屬性處理常式,而不是 pins 成員) 。