共用方式為


拓撲篩選

拓撲篩選條件代表音訊配接卡上線路的部分,可處理卡片上所管理之各種波浪和 MIDI 資料流程之間的互動。 此線路會混合轉譯資料流程和擷取資料流程的多工處理。

拓撲篩選器提供網 橋針 腳 (請參閱 音訊篩選圖形) ,代表音訊介面卡與外部裝置的實體連線。 這些連線通常會攜帶類比輸出訊號,以驅動來自麥克風的喇叭和類比輸入訊號。 拓撲篩選器的橋接器接腳也可能代表類比線路路和線路輸出插孔,甚至甚至數位輸入和輸出連接器。

「拓撲篩選」一詞是錯誤的一種意義。 儘管其名稱如此,拓撲篩選準則只是公開其內部拓撲或版面配置的數種音訊篩選類型之一。 雖然拓撲篩選包含主要拓撲功能,但它不一定包含配接器的整個拓撲。 Wave 和 MIDI 篩選準則有自己的拓撲。 例如,最小 WaveCyclic 或 WavePci 篩選 (請參閱 Wave Filter) 可能會公開由兩個針腳組成的拓撲,以及 DAC (數位對類比轉換器) 或 ADC (類比轉數位轉換器) ,視基礎裝置是否執行音訊轉譯或擷取而定。

拓撲篩選器會實作為埠/迷你埠組。 拓撲篩選處理站會建立拓撲篩選,如下所示:

  • 它會具現化拓撲迷你埠驅動程式物件。

  • 它會呼叫具有 GUID 值CLSID_PortTopology的 PcNewPort,以具現化拓撲埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation中的程式碼範例說明此程式。

拓撲埠和迷你埠驅動程式會透過各自的 IPortTopologyIMiniportTopology 介面彼此通訊。 相較于 wave 和 MIDI 埠和迷你埠驅動程式,這些介面相當簡單,因為拓撲篩選不需要明確管理通過其針腳的資料流程。 拓撲篩選器的針腳代表介面卡硬體中的硬式連線。 拓撲篩選接腳基礎的實體連線通常會有類比音訊訊號,但可能會根據硬體實作而改為攜帶數位音訊串流。

相較于 IMiniportWaveCyclicIMiniportWavePciIMiniportMidiIMiniportDMus 介面, IMiniportTopology 介面沒有 NewStream 方法。

拓撲篩選器的大部分功能都是由其屬性處理常式所提供。 拓撲篩選主要是為了將拓撲資訊提供給 SysAudio 系統驅動程式 ,以及使用 Microsoft Windows 多媒體混音器 API 的應用程式。 拓撲篩選準則中的屬性處理常式可讓您存取各種控制項, (例如音量、等等位和殘響) 音訊配接器通常會提供。 透過屬性要求,混音器 API 可以列舉配接器硬體中的控制節點、探索節點之間的連線,以及查詢並設定節點的控制參數。 SndVol32 應用程式 (請參閱 SysTray 和 SndVol32) 使用混音器 API 來探索配接器的個別資料流程磁片區和靜音控制項。

建置篩選圖形時,SysAudio 會查詢其針腳上 KSPROPERTY_PIN_PHYSICALCONNECTION 屬性的拓撲篩選,以判斷哪個波、MIDI 或 DirectMusic 篩選針腳會連線到哪個拓撲篩選針腳。

不同于波浪、MIDI 或 DirectMusic 篩選,拓撲篩選器不會具現化針腳。 因此,沒有 pin 物件可用來處理拓撲篩選的針腳屬性查詢。 拓撲篩選本身會處理其針腳上實體連線的所有查詢。 如需詳細資訊,請參閱 KSPROPSETID_Pin

類似于其他類型的音訊篩選器,拓撲篩選準則會使用 PCCONNECTION_DESCRIPTOR 結構的陣列來描述其內部拓撲。 迷你埠驅動程式會在從IMiniport::GetDescription方法輸出的 PCFILTER_DESCRIPTOR結構中公開此陣列。 陣列會將拓撲指定為拓撲篩選節點與針腳之間的連線清單, (請參閱 節點和 連線) 。 WDMAud 系統驅動程式會將這些連線和節點轉譯成混合器線路,以及混合器 API 向應用程式公開的控制項。 如 音訊篩選器中所述,KS 篩選準則上的輸入針腳會對應至 SRC 混音器線,而篩選準則上的輸出針腳會對應至 DST 混音器線條。

典型的音訊配接器可以透過喇叭播放波浪和 MIDI 檔案,而且可以從麥克風和 MIDI 合成器擷取音訊訊號。 下列程式碼範例包含公開這些功能之拓撲篩選器的PCCONNECTION_DESCRIPTOR陣列:

    // topology pins
    enum
    {
        KSPIN_TOPO_WAVEOUT_SRC = 0,
        KSPIN_TOPO_SYNTHOUT_SRC,
        KSPIN_TOPO_SYNTHIN_SRC,
        KSPIN_TOPO_MIC_SRC,
        KSPIN_TOPO_LINEOUT_DST,
        KSPIN_TOPO_WAVEIN_DST
    };
 
    // topology nodes
    enum
    {
        KSNODE_TOPO_WAVEOUT_VOLUME = 0,
        KSNODE_TOPO_WAVEOUT_MUTE,
        KSNODE_TOPO_SYNTHOUT_VOLUME,
        KSNODE_TOPO_SYNTHOUT_MUTE,
        KSNODE_TOPO_MIC_VOLUME,
        KSNODE_TOPO_SYNTHIN_VOLUME,
        KSNODE_TOPO_LINEOUT_MIX,
        KSNODE_TOPO_LINEOUT_VOLUME,
        KSNODE_TOPO_WAVEIN_MUX
    };
 
    static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
    {
       // FromNode---------------------FromPin------------------ToNode-----------------------ToPin
 
        { PCFILTER_NODE,               KSPIN_TOPO_WAVEOUT_SRC,  KSNODE_TOPO_WAVEOUT_VOLUME,  1 },
        { KSNODE_TOPO_WAVEOUT_VOLUME,  0,                       KSNODE_TOPO_WAVEOUT_MUTE,    1 },
        { KSNODE_TOPO_WAVEOUT_MUTE,    0,                       KSNODE_TOPO_LINEOUT_MIX,     1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHOUT_SRC, KSNODE_TOPO_SYNTHOUT_VOLUME, 1 },
        { KSNODE_TOPO_SYNTHOUT_VOLUME, 0,                       KSNODE_TOPO_SYNTHOUT_MUTE,   1 },
        { KSNODE_TOPO_SYNTHOUT_MUTE,   0,                       KSNODE_TOPO_LINEOUT_MIX,     2 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHIN_SRC,  KSNODE_TOPO_SYNTHIN_VOLUME,  1 },
        { KSNODE_TOPO_SYNTHIN_VOLUME,  0,                       KSNODE_TOPO_WAVEIN_MUX,      1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_MIC_SRC,      KSNODE_TOPO_MIC_VOLUME,      1 },
        { KSNODE_TOPO_MIC_VOLUME,      0,                       KSNODE_TOPO_WAVEIN_MUX,      2 },
 
        { KSNODE_TOPO_LINEOUT_MIX,     0,                       KSNODE_TOPO_LINEOUT_VOLUME,  1 },
        { KSNODE_TOPO_LINEOUT_VOLUME,  0,                 PCFILTER_NODE,  KSPIN_TOPO_LINEOUT_DST },
 
        { KSNODE_TOPO_WAVEIN_MUX,      0,                 PCFILTER_NODE,  KSPIN_TOPO_WAVEIN_DST }
    };

上述程式碼範例中的常 數PCFILTER_NODE 是 Null 節點識別碼,且定義于標頭檔 Portcls.h 中。 如需如何使用這個常數來區別篩選上的外部針腳與節點上邏輯針腳的描述,請參閱 PCCONNECTION_DESCRIPTOR

上述程式碼範例中的每個針腳名稱都會以 「SRC」 或 「DST」 結尾,視混音器 API 是否將針腳對應至來源或目的地混音器線而定。 若要避免混淆,請記住來源和目的地混音器線會分別對應至接收 (輸入) 和來源 (輸出) KS 篩選針腳。 如需詳細資訊,請參閱 音訊篩選

上述程式碼範例中的PCCONNECTION_DESCRIPTOR陣列描述下圖中的拓撲篩選。

說明PCCONNECTION_DESCRIPTOR陣列所描述拓撲篩選連線的圖表。

圖中的拓撲篩選有四個輸入 (接收) 針腳,而右邊有兩個輸出 (來源) 針腳。 連接前兩個輸入針腳和頂端輸出針腳的資料路徑會混合從現正播放的波浪和 MIDI 資料流程轉譯的兩個類比訊號。 連接底部兩個輸入針腳和底部輸出針腳的資料路徑,會讓所錄製的擷取類比訊號多工。

四個輸入針腳的運作方式如下:

  • KSPIN_TOPO_WAVEOUT_SRC針腳會實際連接到波篩選器的輸出針腳,其會轉譯來自 .wav 檔案等來源的波串流,以在針腳產生類比訊號。

  • KSPIN_TOPO_SYNTHOUT_SRC針腳會實際連接到合成篩選器的輸出針腳,例如,來自 .mid 檔案等來源的 MIDI 資料流程,以在針腳產生類比訊號。

  • KSPIN_TOPO_SYNTHIN_SRC針腳會實際連接到產生類比訊號的合成器。 (請注意,較實用的硬體設計可能會從 MPU-401 MIDI 介面取得 MIDI 輸入資料流程,並將其直接轉換成波浪格式,完全略過拓撲篩選。)

  • KSPIN_TOPO_MIC_SRC針腳會實際連接到從麥克風取得類比訊號的輸入插接器。

兩個輸出針腳的運作方式如下:

  • KSPIN_TOPO_LINEOUT_DST針腳會實際連接到一組通常驅動一組喇叭的類比線路路插腳。

  • KSPIN_TOPO_WAVEIN_DST針腳實際上會連線到波篩選器的輸入針腳,可將類比訊號轉換成波串流,並將它寫入目的地,例如 .wav 檔案。

磁片區和靜音節點 (請參閱 KSNODETYPE_VOLUMEKSNODETYPE_MUTE) 用來控制各種資料流程的磁片區層級。 SUM 節點 (會看到 KSNODETYPE_SUM) 混合來自波和 MIDI 輸入的音訊資料流程。 MUX 節點 (會看到兩個輸入資料流程之間的 選取 KSNODETYPE_MUX) 。

此圖使用虛線箭號來表示兩個節點或針腳與節點之間的連線。 箭頭會指向資料流程的方向。 此圖顯示總共 13 個連接,每個連接都對應至上述程式碼範例中PCCONNECTION_DESCRIPTOR陣列中 13 個元素的其中一個。

除了拓撲篩選之外,配接器驅動程式還會建立其他篩選準則--wave、FM synth、wave 資料表等等,以連線到拓撲篩選上的針腳。

例如,實際連接到拓撲篩選KSPIN_TOPO_WAVEOUT_SRC針腳的波浪篩選器包含 DAC (,由 KSNODETYPE_DAC節點) 表示,可將 PCM 資料轉換成輸出至拓撲篩選器針腳的類比訊號。 FM-synth 或實際連線到拓撲篩選KSPIN_TOPO_SYNTHOUT_SRC針腳的波浪式合成篩選器,同樣會將 MIDI 資料轉換成輸出至拓撲篩選器針腳的類比訊號。 拓撲篩選會混合來自這兩個針腳的類比訊號,並將混合訊號輸出至喇叭。

拓撲篩選準則與其他代表相同介面卡上其他硬體裝置之篩選準則的實體連線必須與篩選的其他連線類型區別。 例如,波浪、MIDI 和 DirectMusic 篩選上的特定針腳可以在軟體控制下連接或中斷連線。

在裝置啟動期間,介面卡驅動程式會為每個連線呼叫 PcRegisterPhysicalConnection 一次來註冊拓撲篩選器的實體連線。 埠驅動程式需要此資訊,才能回應 KSPROPERTY_PIN_PHYSICALCONNECTION get-property 要求。