迷你端口驅動程式以針腳、節點和連線的方式描述 KS 篩選器的內部拓撲。 此拓撲會透過篩選指定數據流路徑,並定義邏輯目標「針腳和節點」,以符合屬性要求。 內部濾波器拓撲是底層硬體裝置內部結構的邏輯表示。 迷你埠驅動程式會使用包含針腳、節點和連結描述符的靜態陣列來描述此拓撲。
引腳是在 PCPIN_DESCRIPTOR 結構的靜態陣列中指定。 每個針在陣列中都有其序數的ID。
節點是在 PCNODE_DESCRIPTOR 結構的靜態陣列中指定。 每個節點在陣列中都有其序數的標識碼。
連接(點對點、點對節點或節點對節點)是在PCCONNECTION_DESCRIPTOR結構的靜態陣列中指定的。
迷你埠驅動程式會在其IMiniport::GetDescription方法輸出的PCFILTER_DESCRIPTOR結構中展現這三個陣列。
範例
下列程式碼範例指定一個具有一個輸入端點和一個輸出端點的簡單 KS 篩選器的內部拓撲。 濾波器包含一個單一節點,即是一個音量控制。
#define KSPIN_WAVEOUT_SRC 0
#define KSPIN_SPEAKERS_DST 1
PCPIN_DESCRIPTOR
MiniportPins[] =
{
{ // Pin 0 -- KSPIN_WAVEOUT_SRC
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_LEGACY_AUDIO_CONNECTOR, // Category
NULL, // Name
0 // Reserved
}
},
{ // Pin 1 -- KSPIN_SPEAKERS_DST
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
&KSAUDFNAME_VOLUME_CONTROL, // Name (This name shows up as the
// playback panel name in SndVol32)
0 // Reserved
}
}
};
#define KSNODE_WAVEOUT_VOLUME 0
PCNODE_DESCRIPTOR TopologyNodes[] =
{
{ // KSNODE_WAVEOUT_VOLUME
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_WAVE_VOLUME // Name
}
};
PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{ //FromNode---------------FromPin------------ToNode-----------------ToPin
{ PCFILTER_NODE, KSPIN_WAVEOUT_SRC, KSNODE_WAVEOUT_VOLUME, 1 },
{ KSNODE_WAVEOUT_VOLUME, 0, PCFILTER_NODE, KSPIN_SPEAKERS_DST }
};
下圖顯示上述範例程式代碼所描述之篩選條件的拓撲。
此篩選是 拓撲篩選器的簡單範例,配接器驅動程式會將其 IMiniportTopology 物件系結至 PortCls 系統驅動程式所建立的 IPortTopology 物件來形成。 濾波器的匯入(sink)和匯出(source)針腳會命名為 KSPIN_WAVEOUT_SRC 和 KSPIN_SPEAKERS_DST。 兩個針腳都帶有模擬訊號。 混音器 API 分別將這些針腳映射為來源和目的地的混音線(MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT 和 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS)。
下表說明討論 KS 針腳與混音器線的對應時的潛在混淆來源。
| 釘選名稱 | 混合器 API 術語 | KS 篩選術語 |
|---|---|---|
KSPIN_WAVEOUT_SRC |
來源混音器線 |
接地針腳 |
KSPIN_SPEAKERS_DST |
目標混音線路 |
來源釘選 |
請注意,KSPIN_WAVEOUT_SRC 是源混音器線,而 KSPIN_SPEAKERS_DST 是源引腳。 如需詳細資訊,請參閱 核心串流拓撲至音訊混音器 API 翻譯中的 KS 和混音器行術語討論。
另請注意,名稱「KSPIN_WAVEOUT_SRC」包含「WAVEOUT」並不是因為接腳攜帶波形格式數字資料,而是因為它承載由波型過濾器生成的模擬訊號,這類過濾器是 WaveCyclic 或 WavePci 類型。 波浪篩選器代表音訊適配卡硬體的一部分,可將波串流轉換成類比訊號。 KSPIN_SPEAKERS_DST針腳輸出模擬訊號以驅動一組喇叭。
篩選器包含一個節點,KSNODE_WAVEOUT_VOLUME,混音器 API 將其表示為音量控制(MIXERCONTROL_CONTROLTYPE_VOLUME)。 音量控制的 KS 節點類型是 KSNODETYPE_VOLUME。 此類型的所有節點都支援 KSPROPERTY_AUDIO_VOLUMELEVEL 屬性,篩選的用戶端會使用此屬性來控制磁碟區層級。
音量節點有兩個「邏輯」針腳,編號為0和1。 MiniportConnections 陣列所指定的兩個連接會以指向數據流方向的虛線箭號表示於圖表中。 每個連接都會由陣列中兩個元素的其中一個來描述。
KSPIN_WAVEOUT_SRC和KSPIN_SPEAKERS_DST針腳都是 網橋接腳,這表示它們代表適配卡中的硬線連線。 在上述範例程式碼中,MiniportPins 陣列中的兩個針腳描述元都將其 IRP 傳遞方向設為 KSPIN_COMMUNICATION_NONE,這是合適的,因為橋接針腳不會傳送或接收 IRP。 這兩個針腳描述符也會參考一個名為 PinDataRangePointersBridge 的陣列,其定義如下:
static KSDATARANGE PinDataRangesBridge[] =
{
{
sizeof(KSDATARANGE),
0, 0, 0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
}
};
static PKSDATARANGE PinDataRangePointersBridge[] =
{
&PinDataRangesBridge[0]
};
PinDataRangePointersBridge 陣列會定義帶有類比音訊號之網橋接點的數據範圍。 如需詳細資訊,請參閱 音訊篩選圖形中的橋接針討論。
如需更複雜的拓撲範例,請參閱 拓撲篩選器。