Freigeben über


Datenüberschneidung

In einem Audiofiltergraph kann ein Audiodatenstrom nur vom Quell-Pin eines Filters zum Senken-Pin eines anderen Filters fließen, wenn die beiden Pins ein gemeinsames Format für den Datenstrom unterstützen. Ebenso kann ein Client einen Audiodatenstrom an eine Sink-Pin auf einem Filter senden oder einen Audiodatenstrom von einer Quell-Pin auf einem Filter empfangen, wenn der Client und die Pin ein gemeinsames Streamformat unterstützen. Audiofilter verwenden eine Technik, die als Datenschnittmenge (kurz für Datenbereichsschnittmenge) bezeichnet wird, um ein Datenstromformat zu identifizieren, das für zwei Pins oder für einen Client und einen Pin üblich ist.

Zum Beispiel verwendet der SysAudio-Systemtreiber in Windows Server 2003, Windows XP, Windows 2000 und Windows Me/98 die Datenkreuzungstechnik, um ein Audiofilterdiagramm zu erstellen, indem es Paare von Filterstiften verbindet, die kompatible Audiodatenformate unterstützen.

Eine Pinfactory gibt den Satz von Formaten an, die jeder Pin als Array von Datenbereichen unterstützt, wobei jeder Datenbereich eine Struktur vom Typ KSDATARANGE_AUDIO ist. Ein Datenbereich gibt einen allgemeinen Formattyp an, der KSDATAFORMAT_WAVEFORMATEX oder KSDATAFORMAT_DSOUND sein kann. Darüber hinaus gibt der Datenbereich einen Wertebereich für jeden der folgenden Parameter an:

  • Bits pro Beispiel

  • Beispielhäufigkeit

  • Anzahl der Kanäle

Die KSDATARANGE_AUDIO-Struktur gibt sowohl mindest- als auch maximal zulässige Werte für die Bits pro Beispiel- und Beispielhäufigkeitsbereich an, jedoch nur ein Maximum für den Bereich "Anzahl der Kanäle". Die mindeste Anzahl von Kanälen ist implizit eins.

Die Aufgabe, ein gemeinsames Datenformat für zwei Pins auszuhandeln, besteht darin, zwei Datenbereiche zu finden – eine aus jedem Pin - die sich gegenseitig schneiden. Ein Paar von Datenbereichen überschneiden sich, wenn:

  • Sie unterstützen das gleiche allgemeine Wellenformat (KSDATAFORMAT_WAVEFORMATEX oder KSDATAFORMAT_DSOUND).

  • Ihre Bits-pro-Sample-Bereiche überlappen sich.

  • Ihre Stichprobenfrequenzbereiche überlappen sich.

Wie bereits erwähnt, impliziert die KSDATAFORMAT_AUDIO-Struktur ein Hardwaremodell, bei dem die mindeste Anzahl von Kanälen, die von einem Pin unterstützt werden, immer eins ist. Laut diesem Modell sollte sich die Anzahl der Kanäle für beliebige zwei Pins immer überlappen, da beide Pins mindestens einen Kanal unterstützen. Offensichtlich entspricht ein Hardwareadapter mit einer Mindestanzahl von Kanälen größer als eins diesem Modell nicht, aber der Adaptertreiber kann einen proprietären Daten-Intersection-Handler enthalten, um diese Art von Problem zu lösen (siehe das Beispiel in proprietären Data-Intersection-Handlern).

Beim Suchen eines Paars von überschneidenen Datenbereichen für die beiden Pins wählt der Handler ein gemeinsames Datenformat aus dem Schnittpunktbereich wie folgt aus:

  • Die Anzahl der Bits pro Abtastung wird aus dem Bereich ausgewählt, in dem sich die beiden Bits-pro-Abtastung-Bereiche überlappen.

  • Die Stichprobenhäufigkeit wird aus der Region ausgewählt, in der sich die beiden Stichprobenfrequenzbereiche überlappen.

  • Die Anzahl der Kanäle wird aus der Region ausgewählt, in der sich die beiden Anzahl von Kanälen überlappen.

Wenn Sie beispielsweise ein gemeinsames Format für den Sink-Pin eines Audioporttreibers und den Quell-Pin eines anderen Filters aushandeln (in der Regel der KMixer-Systemtreiber), ruft SysAudio zunächst das Datenbereichsarray des Quell-Pins ab. SysAudio sendet dann eine KSPROPERTY_PIN_DATAINTERSECTION Anforderung an den Sink-Pin und schließt das Datenbereichsarray der Quell-Pin mit dieser Anforderung ein. Die Kernelstreaming-Ebene fängt die Anforderung ab und ruft iterativ den Datenschnittpunkthandler des Porttreibers einmal für jedes aufeinanderfolgende Element im Datenbereich-Array des Quell-Pins auf, angefangen mit dem ersten Element, bis der Handler erfolgreich einen Datenschnittpunkt findet.

Bei jedem Aufruf, den SysAudio an den Datenabschnittshandler des Porttreibers sendet, ruft der Handler zunächst das Datenbereichsarray des Sink-Pins vom Miniporttreiber ab. Anschließend durchläuft es das Array, beginnend mit dem ersten Element, bis es erfolgreich ist, eine Schnittmenge zwischen einem Sink-Pin-Datenbereich und dem aktuellen Quell-Pin-Datenbereich zu finden. Der Handler wählt ein gängiges Format aus, das sich innerhalb der Schnittmenge befindet, und gibt dieses Format an den Aufrufer aus.

Bei jedem Schritt in der Iteration ruft der Porttreiber den proprietären Datenüberschneidungshandler des Miniporttreibers mit den zwei Datenbereichen auf – jeweils einen für die beiden Pins. Wenn der proprietäre Handler in irgendeinem Schritt eine Datenkreuzungsprüfung zwischen den beiden Datenbereichen ablehnt, führt der Datenkreuzungshandler des Porttreibers stattdessen die Überprüfung aus.

Zusammenfassend ist die Suche nach einer Schnittmenge zwischen einem Quell-Pin-Datenbereich und einem Sink-Pin-Datenbereich ein iterativer Prozess:

  • In der äußeren Schleife durchläuft die Kernel-Streaming-Ebene die aufeinanderfolgenden Elemente im Datenbereichsarray des Quell-Pins, beginnend mit dem ersten Element des Arrays.

  • In der inneren Schleife durchläuft der Porttreiber aufeinanderfolgende Elemente im Datenbereichs-Array des Sink-Pins, beginnend mit dem ersten Element des Arrays.

Die Suche wird beendet, sobald die erste Datenschnittmenge gefunden wird. Dieser Prozess tendiert dazu, die Elemente am Anfang des Datenbereichs-Arrays jedes Pins zu bevorzugen. Wenn Sie ein Array von Datenbereichen für einen Pin angeben, sollte ein Adaptertreiber die Arrayelemente anordnen, indem Datenbereiche für bevorzugte Formate am Anfang des Arrays platziert werden.