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:
Il pin deve includere un singolo nodo nella catena di nodi per rappresentare ogni effetto hardware che deve essere incorporato nel grafico. I tipi di nodo KS per gli effetti AEC e NS sono specificati dai GUID seguenti: KSNODETYPE_ACOUSTIC_ECHO_CANCEL KSNODETYPE_NOISE_SUPPRESS
I nodi AEC e NS nel pin devono supportare il set di proprietà KSPROPSETID_General e devono fornire informazioni sul produttore quando viene eseguita una query per la proprietà KSPROPERTY_GENERAL_COMPONENTID .
I nodi AEC e NS nel pin devono supportare il set di proprietà KSPROPSETID_TopologyNode e le relative due proprietà:
KSPROPERTY_TOPOLOGYNODE_ENABLE abilita un effetto.
KSPROPERTY_TOPOLOGYNODE_RESET reimposta l'effetto sullo stato predefinito.
I nodi AEC e NS nel pin supportano le proprietà seguenti del set di proprietà KSPROPSETID_Audio: KSPROPERTY_AUDIO_CPU_RESOURCES KSPROPERTY_AUDIO_ALGORITHM_INSTANCE
Il pin deve supportare le proprietà seguenti del set di proprietà KSPROPSETID_Audio: KSPROPERTY_AUDIO_POSITION KSPROPERTY_AUDIO_LATENCY
Il pin deve esporre le funzionalità dell'intervallo di dati (vedere Aggiungere Data-Range e proprietà di intersezione).
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_ACOUSTIC_ECHO_CANCEL
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.
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.