Condividi tramite


Esposizione di effetti di acquisizione di Hardware-Accelerated

In Windows XP e versioni successive il framework audio WDM supporta l'accelerazione hardware degli effetti di acquisizione audio esposti tramite DirectSound. Questi effetti includono l'annullamento dell'eco acustico (AEC) e l'eliminazione del rumore (NS). Per informazioni su come un'applicazione DirectSoundCapture consente l'uso di AEC e NS accelerati dall'hardware, vedere la documentazione di Microsoft Windows SDK.

Un driver miniport può esporre l'accelerazione hardware per qualsiasi subset di questi effetti, a seconda delle funzionalità del dispositivo sottostante. Per esporre le funzionalità dell'hardware per gli effetti AEC e NS, ogni pin nel filtro AEC implementato dal driver deve soddisfare questi requisiti:

Di seguito sono presentati i requisiti specifici per esporre i nodi AEC e NS con accelerazione hardware.

Annullamento dell'eco acustico

Un driver miniport PCM espone il supporto hardware per AEC sotto forma di topologia per i flussi di acquisizione e rendering che soddisfano questo requisito aggiuntivo:

  • Il pin deve includere un nodo AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), che deve essere specificato nella relativa posizione appropriata nella catena di nodi ordinata (vedere di seguito).

Eliminazione del rumore

Un driver miniport PCM espone il supporto hardware per NS sotto forma di topologia per il flusso di acquisizione che soddisfa questo requisito aggiuntivo:

  • Il pin deve includere un nodo NS (KSNODETYPE_NOISE_SUPPRESS), che deve essere specificato nella relativa posizione appropriata nella catena di nodi ordinata (vedere di seguito).

Ordinamento della catena di nodi

Attualmente, l'architettura degli effetti di acquisizione DirectSound richiede che i nodi vengano specificati nell'ordine in cui vengono richiesti dall'applicazione. Di conseguenza, l'ordine in cui il driver miniport specifica i relativi nodi deve corrispondere all'ordine usato dal filtro di sistema AEC (Aec.sys), che implementa gli algoritmi AEC e NS nel software.

Per abilitare l'accelerazione hardware, il driver deve specificare gli effetti implementati dall'hardware nell'ordine seguente:

KSNODETYPE_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

Si noti che questo elenco può omettere eventuali effetti non implementati finché l'ordinamento relativo viene mantenuto.

Assegnazioni di pin del nodo AEC

Un driver della scheda usa una matrice di strutture PCCONNECTION_DESCRIPTOR per specificare le connessioni all'interno di un filtro. Ogni elemento matrice descrive una connessione, che può essere node-to-node, node-to-pin o pin-to-pin. Per informazioni dettagliate, vedere Nodi e connessioni.

Per usare la struttura PCCONNECTION_DESCRIPTOR, il writer driver assegna i pin "logici" ai nodi. Questi sono "pin" nei nodi stessi e vengono usati esclusivamente per specificare le connessioni all'interno del filtro. Questo è al contrario dei pin esterni sul filtro, che vengono usati per connettersi ad altri filtri.

La tabella seguente mostra gli ID pin che il driver dell'adattatore deve assegnare ai quattro pin logici nel nodo AEC.

Nome del parametro PIN ID Valore Significato

KSNODEPIN_AEC_RENDER_IN

1

Pin sink (input del nodo) per il flusso di rendering

KSNODEPIN_AEC_RENDER_OUT

0

Pin di origine (output del nodo) per il flusso di rendering

KSNODEPIN_AEC_CAPTURE_IN

2

Pin sink (input del nodo) per il flusso di acquisizione

KSNODEPIN_AEC_CAPTURE_OUT

3

Pin di origine (output del nodo) per il flusso di acquisizione

Gli ID pin nella tabella precedente sono definiti nel file di intestazione Ksmedia.h.

Nell'esempio di codice seguente viene illustrato come un driver di adapter può specificare la topologia interna di un filtro AEC che contiene sia un nodo AEC che un nodo NS:

    // AEC Filter Topology

    // Pin IDs for external pins on AEC filter
    #define ID_CaptureOutPin   0   // microphone stream
    #define ID_CaptureInPin    1
    #define ID_RenderOutPin    2   // speaker stream
    #define ID_RenderInPin     3

    // Generic pin IDs for simple node with one input and one output
    #define NODE_INPUT_PIN     1
    #define NODE_OUTPUT_PIN    0

    // Node IDs
    #define NODE_ID_AEC        0   // acoustic echo cancellation
    #define NODE_ID_NS         1   // noise suppression

    // The array below defines the internal topology of an
    // AEC filter that contains an AEC node and an NS node.

    const PCCONNECTION_DESCRIPTOR AecConnections[] = {
        { PCFILTER_NODE, ID_RenderInPin,       NODE_ID_AEC,    KSNODEPIN_AEC_RENDER_IN  },
        { NODE_ID_AEC,   KSNODEPIN_AEC_RENDER_OUT,   PCFILTER_NODE,  ID_RenderOutPin    },
        { PCFILTER_NODE, ID_CaptureInPin,      NODE_ID_AEC,    KSNODEPIN_AEC_CAPTURE_IN },
        { NODE_ID_AEC,   KSNODEPIN_AEC_CAPTURE_OUT,  NODE_ID_NS,     NODE_INPUT_PIN     },
        { NODE_ID_NS,    NODE_OUTPUT_PIN,      PCFILTER_NODE,  ID_CaptureOutPin   }
    };

La matrice AecConnections nell'esempio di codice precedente definisce la topologia del filtro visualizzata nella figura seguente.

Diagramma che illustra la topologia interna di un filtro AEC con nodi AEC e NS.

La figura precedente rappresenta ogni connessione all'interno del filtro con una freccia tratteggiata che punta nella direzione del flusso di dati. Nella figura vengono visualizzate un totale di cinque connessioni. Ogni connessione corrisponde a uno dei cinque elementi della matrice AecConnections nell'esempio di codice.