Freigeben über


Daten schnittmenge

In einem Audiofilterdiagramm kann ein Audiodatenstrom nur dann vom Quellpin eines Filters zum Senkenstift eines anderen Filters fließen, wenn die beiden Pins ein gemeinsames Format für den Stream unterstützen. Ebenso kann ein Client einen Audiodatenstrom nur dann an eine Senkennadel an einen Filter senden oder einen Audiodatenstrom von einem Quellpin in einem Filter empfangen, wenn client und Pin ein gängiges Streamformat unterstützen. Audiofilter verwenden eine Technik, die als Datenschnitt bezeichnet wird (kurz für Datenbereichs-Schnittmenge), um ein Datenstromformat zu identifizieren, das zwei Pins oder einen Client und eine Pin gemeinsam ist.

In Windows Server 2003, Windows XP, Windows 2000 und Windows Me/98 verwendet der SysAudio-Systemtreiber beispielsweise die Datenschneidetechnik, um ein Audiofilterdiagramm zu erstellen, indem Er 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 Sample

  • Beispielhäufigkeit

  • Anzahl der Kanäle

Die KSDATARANGE_AUDIO-Struktur gibt sowohl minimale als auch maximale Werte für die Bits-pro-Sample- und Sample-Frequency-Bereiche an, aber nur ein Maximum für den Kanalanzahlbereich. Die Mindestanzahl von Kanälen ist implizit eins.

Die Aufgabe, ein gemeinsames Datenformat für zwei Pins auszuhandeln, besteht darin, zwei Datenbereiche zu finden – einen von jedem Stift – die sich überschneiden. Ein Paar von Datenbereichen überschneidet sich, wenn:

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

  • Ihre Bits pro Stichprobe überschneiden sich.

  • Ihre Stichprobenhäufigkeitsbereiche ü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. Nach diesem Modell sollten sich die Anzahl der Kanäle für zwei beliebige Pins immer überlappen, da beide Pins mindestens einen Kanal unterstützen. Offensichtlich entspricht ein Hardwareadapter mit einer Mindestanzahl von Kanälen, die größer als eins sind, nicht diesem Modell, aber der Adaptertreiber kann einen proprietären Datenschneidehandler enthalten, um diese Art von Problem zu behandeln (siehe beispiel unter Proprietäre Data-Intersection Handler).

Wenn ein Paar sich überschneidende Datenbereiche für die beiden Pins gefunden wird, wählt der Handler ein allgemeines Datenformat aus dem Schnittpunktbereich wie folgt aus:

  • Die Anzahl der Bits pro Stichprobe wird aus dem Bereich ausgewählt, in dem sich die zwei Bits pro Stichprobe überlappen.

  • Die Stichprobenhäufigkeit wird aus dem Bereich ausgewählt, in dem sich die beiden Stichprobenhäufigkeitsbereiche überschneiden.

  • Die Anzahl der Kanäle wird aus der Region ausgewählt, in der sich die beiden Kanalnummernbereiche überschneiden.

Wenn Sie beispielsweise ein gängiges Format für den Senkenpin eines Audioporttreibers und den Quellpin eines anderen Filters (in der Regel den KMixer-Systemtreiber) aushandeln, ruft SysAudio zuerst das Datenbereichsarray des Quellpins ab. SysAudio sendet dann eine KSPROPERTY_PIN_DATAINTERSECTION-Anforderung an die Senkennadel und schließt das Datenbereichsarray des Quellpins in diese Anforderung ein. Die Kernelstreamingschicht fängt die Anforderung ab und ruft den Datenschnitthandler des Porttreibers iterativ einmal für jedes aufeinanderfolgende Element im Datenbereichsarray des Quellpins auf, beginnend mit dem ersten Element, bis der Handler eine Daten schnittmenge gefunden hat.

Bei jedem Aufruf, den SysAudio an den Datenkreuzungshandler des Porttreibers sendet, ruft der Handler zuerst das Datenbereichsarray des Senkenpins vom Miniporttreiber ab. Anschließend wird das Array durchlaufen, beginnend mit dem ersten Element, bis es gelingt, eine Schnittmenge zwischen einem Senken-Pin-Datenbereich und dem aktuellen Quell-Pin-Datenbereich zu finden. Der Handler wählt ein allgemeines Format aus, das sich innerhalb der Schnittmenge befindet, und gibt dieses Format an den Aufrufer aus.

Bei jedem Schritt der Iteration ruft der Porttreiber den proprietären Datenkreuzungshandler des Miniporttreibers mit den beiden Datenbereichen auf – einen für jeden der beiden Pins. Wenn der proprietäre Handler in einem Schritt die Verarbeitung einer Datenkreuzungsprüfung zwischen den beiden Datenbereichen ablehnt, führt der Datenschnitthandler des Porttreibers stattdessen die Überprüfung durch.

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

  • In der äußeren Schleife durchläuft die Kernelstreamingschicht aufeinanderfolgende Elemente im Datenbereichsarray des Quellpins, beginnend mit dem ersten Arrayelement.

  • In der inneren Schleife durchläuft der Porttreiber aufeinanderfolgende Elemente im Datenbereichsarray des Senkenpins, beginnend mit dem ersten Arrayelement.

Die Suche wird beendet, wenn die erste Daten schnittmenge gefunden wird. Dieser Prozess neigt dazu, die Elemente am Anfang des Datenbereichsarrays jedes Pins zu bevorzugen. Wenn Sie ein Array von Datenbereichen für einen Pin angeben, sollte ein Adaptertreiber die Arrayelemente sortieren, indem datenbereiche für bevorzugte Formate am Anfang des Arrays platziert werden.