Pin Factory
Le pin factory di un filtro audio descrivono tutti i pin che il filtro può creare un'istanza. Come accennato in precedenza, un driver miniport audio archivia le informazioni sui pin in una matrice di strutture PCPIN_DESCRIPTOR . Ogni struttura specifica una factory di pin e una factory di pin viene identificata dal relativo indice nella matrice. Questo indice viene spesso definito ID pin.
Una struttura PCPIN_DESCRIPTOR contiene una tabella di automazione e una struttura KSPIN_DESCRIPTOR .
La struttura KSPIN_DESCRIPTOR contiene le informazioni seguenti sui pin nella factory di pin:
Direzione relativa al filtro del flusso di dati
Direzione relativa del filtro del flusso di comunicazione (in tutte le versioni correnti di Windows, i filtri KS usano i runtime di integrazione per la comunicazione).
Aggiungi categoria
Nome descrittivo
Funzionalità dell'istanza
Funzionalità di formato dati
I membri Category e Name della struttura specificano la categoria di pin e il nome descrittivo della factory di pin. Per ogni factory di pin nel filtro, il driver miniport specifica una combinazione di GUID categoria e nome che identificano in modo univoco la factory dei pin. Se due o più pin factory condividono lo stesso valore Category , ogni pin factory ha un valore Name che lo distingue dagli altri. Se solo una singola factory di pin ha un determinato valore Category , tale valore è sufficiente per identificare la factory dei pin e il valore Name per tale pin factory può essere impostato su NULL. Per un esempio di codifica, vedere Esposizione della topologia filtro. Per informazioni sulle categorie di pin, vedere Proprietà Pin Category.
Una factory di pin specifica l'intervallo di formati di dati supportati come matrice di strutture KSDATARANGE estese:
Una factory di pin che supporta un intervallo di formati di dati Wave o DirectSound per il flusso di input o output specifica una matrice di strutture KSDATARANGE_AUDIO .
Una factory di pin che supporta un intervallo di formati di dati MIDI o DirectMusic per il flusso di input o output specifica una matrice di strutture KSDATARANGE_MUSIC .
KSDATARANGE_AUDIO e KSDATARANGE_MUSIC sono versioni estese di KSDATARANGE. Per esempi di entrambi i tipi di intervalli di dati, vedere Formati di dati audio e intervalli di dati.
Prima di connettere un segnaposto sink su un filtro a un pin di origine su un altro filtro, un generatore di gragrafi (ad esempio, il driver di sistema SysAudio) può cercare un formato compatibile negli intervalli di dati. Il generatore di gragrafi chiama in genere il gestore di intersezione dati del filtro, che consente al filtro stesso di scegliere un formato compatibile.
Un filtro può avere più pin factory e una factory di pin può supportare più istanze di pin.
La presenza di più pin factory in un filtro è utile per distinguere percorsi di dati distinti per i diversi tipi di dati che passano attraverso il filtro. Ad esempio, una factory di pin potrebbe supportare flussi di dati PCM e un'altra factory di pin potrebbe supportare flussi AC-3.
Un singolo filtro può supportare il rendering e l'acquisizione simultanea dei flussi. I percorsi di rendering e acquisizione hanno set separati di factory di filtri.
La presenza di più istanze di pin in una factory di pin sink implica spesso la combinazione, nel qual caso il filtro contiene un nodo SUM (KSNODETYPE_SUM).
Come i filtri, i pin sono oggetti kernel e sono identificati dagli handle del kernel. L'handle per un'istanza di pin viene creato chiamando KsCreatePin. Come oggetto kernel, un pin può essere specificato come destinazione di un IRP. Un client del driver specifica l'handle pin durante l'invio di una richiesta IOCTL a un pin.
Quando si compila un grafico di filtro audio, SysAudio collega un filtro a un altro collegando i pin. Un pin di origine da un filtro può essere connesso al pin sink di un altro filtro. I dati e i runtime di integrazione del flusso del pin di origine nel pin sink tramite questa connessione. Per stabilire la connessione, un generatore di gragrafi (in genere SysAudio) crea prima il pin di origine chiamando KsCreatePin e quindi crea nuovamente il pin sink chiamando KsCreatePin . Nella seconda chiamata, tuttavia, il client specifica che il nuovo pin sink deve essere connesso al pin di origine creato nella prima chiamata.