Filtri topologia

Un filtro di topologia rappresenta la parte del circuito su una scheda adattatore audio che gestisce le interazioni tra i vari flussi wave e MIDI gestiti sulla scheda. Questo circuito esegue la combinazione di flussi di rendering e multiplexing dei flussi di acquisizione.

Un filtro di topologia fornisce i pin bridge (vedere Grafici filtro audio) che rappresentano le connessioni fisiche dell'adattatore audio a dispositivi esterni. Queste connessioni in genere trasportano segnali di output analogico che guidano altoparlanti e segnali di input analogici dai microfoni. I pin di ponte di un filtro topologia possono anche rappresentare jack linein e lineout analogici e possibilmente anche connettori di input e output digitali.

Il termine "filtro topologia" è in un certo senso un errore. Nonostante il nome, un filtro di topologia è solo uno dei diversi tipi di filtro audio che espongono la topologia o il layout interno. Anche se il filtro della topologia contiene funzionalità topologiche chiave, non contiene necessariamente l'intera topologia dell'adattatore. I filtri Wave e MIDI hanno topologie personalizzate. Ad esempio, un filtro WaveCyclic o WavePci minimo (vedere Wave Filters) potrebbe esporre una topologia costituita da due pin e un daC (convertitore digitale-analogico) o ADC (convertitore analogico-digitale) a seconda che il dispositivo sottostante esemplifica il rendering o l'acquisizione dell'audio.

Un filtro di topologia viene implementato come coppia porta/miniport. Una factory di filtro della topologia crea un filtro di topologia come segue:

  • Crea un'istanza di un oggetto driver miniport topologia.

  • Crea un'istanza di un oggetto driver di porta topologia chiamando PcNewPort con il valore GUID CLSID_PortTopology.

  • Chiama il metodo IPort::Init del driver della porta per associare il driver miniport al driver della porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo.

I driver porta topologia e miniport comunicano tra loro tramite le rispettive interfacce IPortTopology e IMiniportTopology . Queste interfacce sono relativamente semplici rispetto a quelle per le porte wave e MIDI e i driver miniport perché i filtri di topologia non devono gestire in modo esplicito i flussi che passano attraverso i loro pin. I pin di un filtro di topologia rappresentano connessioni cablate nell'hardware dell'adattatore. La connessione fisica sottostante un pin di filtro della topologia in genere contiene un segnale audio analogico, ma può invece trasportare un flusso audio digitale, a seconda dell'implementazione hardware.

A differenza delle interfacce IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi e IMiniportDMus , l'interfaccia IMiniportTopology non ha alcun metodo NewStream .

La maggior parte delle funzionalità di un filtro di topologia viene fornita dai gestori delle proprietà. Il filtro della topologia esiste principalmente per fornire informazioni sulla topologia al driver di sistema SysAudio e alle applicazioni che usano l'API mixer multimediale Microsoft Windows. I gestori di proprietà nel filtro della topologia forniscono l'accesso ai vari controlli (ad esempio volume, equalizzazione e riverbero) offerti in genere dagli adattatori audio. Tramite le richieste di proprietà, l'API mixer può enumerare i nodi di controllo nell'hardware dell'adattatore, individuare le connessioni tra i nodi ed eseguire query e impostare i parametri di controllo dei nodi. L'applicazione SndVol32 (vedere SysTray e SndVol32) usa l'API mixer per individuare il volume per flusso dell'adattatore e disattivare i controlli.

Quando si compila un grafico di filtro, SysAudio esegue una query sul filtro della topologia per le proprietà KSPROPERTY_PIN_PHYSICALCONNECTION ai relativi pin per determinare quale pin di filtro wave, MIDI o DirectMusic è connesso al pin del filtro della topologia.

A differenza di un filtro wave, MIDI o DirectMusic, un filtro di topologia non crea un'istanza dei pin. Di conseguenza, non sono disponibili oggetti pin per gestire le query per le proprietà del pin di un filtro della topologia. Il filtro della topologia gestisce tutte le query relative alle connessioni fisiche ai relativi pin. Per altre informazioni, vedere KSPROPSETID_Pin.

Analogamente ad altri tipi di filtri audio, un filtro di topologia usa una matrice di strutture PCCONNECTION_DESCRIPTOR per descrivere la topologia interna. Il driver miniport espone questa matrice nella struttura PCFILTER_DESCRIPTOR restituita dal metodo IMiniport::GetDescription . La matrice specifica la topologia come elenco di connessioni tra i nodi e i pin del filtro della topologia . Vedere Nodi e connessioni. Il driver di sistema WDMAud converte queste connessioni e nodi nelle linee mixer e i controlli esposti dall'API mixer alle applicazioni. Come descritto in Filtri audio, un pin di input su un filtro KS esegue il mapping a una linea mixer SRC e un pin di output su un filtro esegue il mapping a una linea mixer DST.

Un adattatore audio tipico può riprodurre file wave e MIDI attraverso un altoparlante e può acquisire segnali audio da un microfono e da un sintetizzatore MIDI. L'esempio di codice seguente contiene la matrice di PCCONNECTION_DESCRIPTOR per un filtro di topologia che espone queste funzionalità:

    // 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 }
    };

La costante PCFILTER_NODE nell'esempio di codice precedente è l'ID nodo Null ed è definita nel file di intestazione Portcls.h. Per una descrizione del modo in cui questa costante viene usata per distinguere i pin esterni in un filtro da pin logici in un nodo, vedere PCCONNECTION_DESCRIPTOR.

Ogni nome di pin nell'esempio di codice precedente termina con "SRC" o "DST" a seconda che l'API mixer esempli il pin sia mappato a una linea mixer di origine o di destinazione. Per evitare confusione, tenere presente che le linee mixer di origine e di destinazione vengono mappate rispettivamente ai pin di sink (input) e di origine (output) KS. Per altre informazioni, vedere Filtri audio.

La matrice PCCONNECTION_DESCRIPTOR nell'esempio di codice precedente descrive il filtro della topologia nella figura seguente.

Diagramma che illustra le connessioni di filtro della topologia descritte dalla matrice PCCONNECTION_DESCRIPTOR.

Il filtro della topologia nella figura ha quattro pin di input (sink) a sinistra e due pin di output (origine) a destra. I percorsi dati che collegano i primi due pin di input e il pin di output superiore combinano i due segnali analogici di cui è stato eseguito il rendering dai flussi wave e MIDI riprodotti. I percorsi di dati che connettono i due pin di input e il pin di output inferiore multiplex i segnali analogici acquisiti registrati.

I quattro pin di input funzionano come segue:

  • Il pin KSPIN_TOPO_WAVEOUT_SRC è fisicamente connesso al pin di output di un filtro d'onda, che esegue il rendering di un flusso d'onda da un'origine, ad esempio un file wav per produrre il segnale analogico sul pin.

  • Il pin KSPIN_TOPO_SYNTHOUT_SRC è fisicamente connesso al pin di output di un filtro synth, che potrebbe eseguire il rendering, ad esempio, di un flusso MIDI da un'origine, ad esempio un file con estensione mid per produrre il segnale analogico sul pin.

  • Il pin KSPIN_TOPO_SYNTHIN_SRC è fisicamente connesso a un sintetizzatore che genera un segnale analogico. Si noti che un design hardware più pratico potrebbe prendere un flusso di input MIDI da un'interfaccia MIDI MPU-401 e convertirlo direttamente in formato onda, ignorando completamente il filtro della topologia.

  • Il pin KSPIN_TOPO_MIC_SRC è fisicamente collegato a un jack di input che accetta un segnale analogico da un microfono.

I due pin di output funzionano come segue:

  • Il pin KSPIN_TOPO_LINEOUT_DST è fisicamente collegato a un jack lineout analogico che in genere guida un set di altoparlanti.

  • Il pin KSPIN_TOPO_WAVEIN_DST è fisicamente connesso al pin di input di un filtro d'onda, che converte il segnale analogico in un flusso d'onda e lo scrive in una destinazione, ad esempio un file wav.

I nodi volume e disattivazione (vedere KSNODETYPE_VOLUME e KSNODETYPE_MUTE) vengono usati per controllare i livelli di volume dei vari flussi. Il nodo SUM (vedere KSNODETYPE_SUM) combina i flussi audio dagli input WAVE e MIDI. Il nodo MUX (vedere KSNODETYPE_MUX) seleziona tra i due flussi di input.

La figura usa una freccia tratteggiata per indicare una connessione tra due nodi o tra un pin e un nodo. La freccia punta nella direzione del flusso di dati. Il diagramma mostra un totale di 13 connessioni, ognuna delle quali corrisponde a uno dei 13 elementi nella matrice PCCONNECTION_DESCRIPTOR nell'esempio di codice precedente.

Oltre al filtro della topologia, il driver dell'adattatore crea altri filtri-onda, synth FM, tabella wave e così via, che si connettono ai pin nel filtro della topologia.

Ad esempio, il filtro d'onda connesso fisicamente al pin del filtro della topologia KSPIN_TOPO_WAVEOUT_SRC contiene un'applicazione livello dati (rappresentata da un nodo KSNODETYPE_DAC ) che converte i dati PCM nel segnale analogico che restituisce al pin del filtro della topologia. Il filtro SYNTH FM o un filtro synth wavetable fisicamente connesso al KSPIN_TOPO_SYNTHOUT_SRC del filtro topologia converte in modo analogo i dati MIDI in un segnale analogico che restituisce il pin del filtro della topologia. Il filtro della topologia combina i segnali analogici da questi due pin e restituisce il segnale misto agli altoparlanti.

Le connessioni fisiche del filtro della topologia ad altri filtri che rappresentano altri dispositivi hardware nella stessa scheda adattatore devono essere distinte da altri tipi di connessioni ai filtri. Ad esempio, alcuni pin su onda, MIDI e DirectMusic possono essere collegati o disconnessi sotto il controllo software.

Durante l'avvio del dispositivo, il driver dell'adattatore registra le connessioni fisiche del filtro della topologia chiamando PcRegisterPhysicalConnection una volta per ogni connessione. Il driver della porta necessita di queste informazioni per rispondere alle richieste di KSPROPERTY_PIN_PHYSICALCONNECTION get-property.