Condividi tramite


Intersezione dei dati

In un grafico di filtro audio un flusso audio può scorrere dal pin di origine di un filtro al pin sink di un altro filtro solo se i due pin supportano un formato comune per il flusso. Analogamente, un client può inviare un flusso audio a un pin sink su un filtro o ricevere un flusso audio da un pin di origine su un filtro solo se il client e il pin supportano un formato di flusso comune. I filtri audio usano una tecnica denominata intersezione dati (breve per l'intersezione tra intervalli di dati) per identificare un formato di flusso comune a due pin o a un client e un pin.

Ad esempio, in Windows Server 2003, Windows XP, Windows 2000 e Windows Me/98, il driver di sistema SysAudio usa la tecnica di intersezione dati per costruire un grafico di filtro audio connettendo coppie di pin di filtro che supportano formati di dati audio compatibili.

Una pin factory specifica il set di formati supportati da ogni pin come matrice di intervalli di dati, in cui ogni intervallo di dati è una struttura di tipo KSDATARANGE_AUDIO. Un intervallo di dati specifica un tipo di formato generale, che può essere KSDATAFORMAT_WAVEFORMATEX o KSDATAFORMAT_DSOUND. Inoltre, l'intervallo di dati specifica un intervallo di valori per ognuno dei parametri seguenti:

  • Bit per esempio

  • Frequenza di esempio

  • Numero di canali

La struttura KSDATARANGE_AUDIO specifica sia i valori minimi che massimi per i bit per esempio e gli intervalli di frequenza di esempio, ma solo un valore massimo per l'intervallo di numeri di canali. Il numero minimo di canali è implicitamente uno.

Il processo di negoziazione di un formato di dati comune per due pin consiste nel trovare due intervalli di dati, uno da ogni pin, che si intersecano tra loro. Una coppia di intervalli di dati si interseca se:

  • Supportano lo stesso formato di onda generale (KSDATAFORMAT_WAVEFORMATEX o KSDATAFORMAT_DSOUND).

  • I relativi intervalli di bit per esempio si sovrappongono.

  • Gli intervalli di frequenza di esempio si sovrappongono.

Come accennato in precedenza, la struttura KSDATAFORMAT_AUDIO implica un modello hardware in cui il numero minimo di canali supportati da un pin è sempre uno. In base a questo modello, il numero di canali per qualsiasi due pin deve sempre sovrapporsi perché entrambi i pin supportano almeno un canale. Ovviamente, una scheda hardware con un numero minimo di canali maggiori di uno non conforme a questo modello, ma il driver dell'adattatore può includere un gestore di intersezione dati proprietario per gestire questo tipo di problema (vedere l'esempio in Gestori proprietari Data-Intersection).

Dopo aver trovato una coppia di intervalli di dati intersecanti per i due pin, il gestore seleziona un formato di dati comune dall'area dell'intersezione come indicato di seguito:

  • Il numero di bit per esempio viene selezionato dall'area in cui si sovrappongono i due bit per intervalli di esempio.

  • La frequenza di esempio viene selezionata dall'area in cui si sovrappongono i due intervalli di frequenza di esempio.

  • Il numero di canali viene selezionato dall'area in cui si sovrappongono i due intervalli di canali.

Ad esempio, quando si negozia un formato comune per il pin sink di un driver della porta audio e il pin di origine di un altro filtro (in genere, il driver di sistema KMixer), SysAudio ottiene prima di tutto la matrice dell'intervallo di dati del pin di origine. SysAudio invia quindi una richiesta di KSPROPERTY_PIN_DATAINTERSECTION al pin sink e include la matrice di intervallo di dati del pin di origine con questa richiesta. Il livello di streaming del kernel intercetta la richiesta e chiama in modo iterativo il gestore dell'intersezione dei dati del driver di porta una volta per ogni elemento successivo nella matrice dell'intervallo di dati del pin di origine, a partire dal primo elemento, fino a quando il gestore non riesce a trovare un'intersezione dei dati.

Con ogni chiamata eseguita da SysAudio al gestore dell'intersezione dati del driver di porta, il gestore ottiene prima di tutto la matrice dell'intervallo di dati del pin sink dal driver miniport. Esegue quindi l'iterazione tramite la matrice, a partire dal primo elemento, fino a quando non riesce a trovare un'intersezione tra un intervallo di dati di pin sink e l'intervallo di dati del pin di origine corrente. Il gestore seleziona un formato comune che si trova all'interno dell'intersezione e restituisce questo formato al chiamante.

In ogni passaggio dell'iterazione, il driver della porta chiama il gestore dell'intersezione dati proprietario del driver miniport con i due intervalli di dati uno per ognuno dei due pin. Se in qualsiasi passaggio il gestore proprietario rifiuta di gestire un controllo di intersezione dati tra i due intervalli di dati, il gestore dell'intersezione dei dati del driver di porta esegue invece il controllo.

Per riepilogare, la ricerca di un'intersezione tra un intervallo di dati di pin di origine e un intervallo di dati sink-pin è un processo iterativo:

  • Nel ciclo esterno, il livello di streaming del kernel esegue l'iterazione tramite elementi successivi nella matrice dell'intervallo di dati del pin di origine, a partire dal primo elemento della matrice.

  • Nel ciclo interno il driver di porta esegue l'iterazione degli elementi successivi nella matrice di intervallo di dati del pin sink, a partire dal primo elemento della matrice.

La ricerca si arresta dopo aver trovato la prima intersezione dei dati. Questo processo tende a favorire gli elementi verso l'inizio della matrice di intervallo di dati di ogni pin. Quando si specifica una matrice di intervalli di dati per un pin, un driver dell'adattatore deve ordinare gli elementi della matrice inserendo gli intervalli di dati per i formati preferiti verso l'inizio della matrice.