Intersection des données

Dans un graphique de filtre audio, un flux audio peut passer de la broche source d’un filtre à la broche récepteur d’un autre filtre uniquement si les deux broches prennent en charge un format commun pour le flux. De même, un client peut envoyer un flux audio à une broche récepteur sur un filtre ou recevoir un flux audio à partir d’une broche source sur un filtre uniquement si le client et l’épingle prennent en charge un format de flux commun. Les filtres audio utilisent une technique appelée intersection de données (abréviation de l’intersection de plage de données) pour identifier un format de flux commun à deux broches ou à un client et une broche.

Par exemple, dans Windows Server 2003, Windows XP, Windows 2000 et Windows Me/98, le pilote système SysAudio utilise la technique d’intersection des données pour construire un graphique de filtre audio en connectant des paires de broches de filtre qui prennent en charge des formats de données audio compatibles.

Une fabrique de broches spécifie l’ensemble de formats pris en charge par chaque broche en tant que tableau de plages de données, où chaque plage de données est une structure de type KSDATARANGE_AUDIO. Une plage de données spécifie un type de format général, qui peut être KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND. En outre, la plage de données spécifie une plage de valeurs pour chacun des paramètres suivants :

  • Bits par échantillon

  • Fréquence de l’échantillon

  • Nombre de canaux

La structure de KSDATARANGE_AUDIO spécifie à la fois les valeurs minimales et maximales pour les plages de bits par échantillon et de fréquence d’échantillon, mais uniquement une valeur maximale pour la plage de nombre de canaux. Le nombre minimal de canaux est implicitement un.

Le travail de négociation d’un format de données commun pour deux broches consiste à trouver deux plages de données (une de chaque broche) qui se croisent. Une paire de plages de données se croise si :

  • Ils prennent en charge le même format d’onde général (KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND).

  • Leurs plages de bits par échantillon se chevauchent.

  • Leurs plages d’échantillonnage et de fréquence se chevauchent.

Comme mentionné précédemment, la structure KSDATAFORMAT_AUDIO implique un modèle matériel dans lequel le nombre minimal de canaux pris en charge par une broche est toujours un. Selon ce modèle, les plages de nombre de canaux pour deux broches doivent toujours se chevaucher, car les deux broches prennent en charge au moins un canal. De toute évidence, une carte matérielle avec un nombre minimal de canaux supérieur à un n’est pas conforme à ce modèle, mais le pilote de l’adaptateur peut inclure un gestionnaire d’intersection de données propriétaire pour traiter ce type de problème (voir l’exemple dans Gestionnaires de Data-Intersection propriétaires).

Lors de la recherche d’une paire de plages de données croisées pour les deux broches, le gestionnaire sélectionne un format de données commun dans la région d’intersection comme suit :

  • Le nombre de bits par échantillon est sélectionné dans la région dans laquelle les deux plages de bits par échantillon se chevauchent.

  • La fréquence de l’échantillon est sélectionnée à partir de la région dans laquelle les deux plages échantillon-fréquence se chevauchent.

  • Le nombre de canaux est sélectionné à partir de la région dans laquelle les deux plages de nombres de canaux se chevauchent.

Par exemple, lors de la négociation d’un format commun pour la broche récepteur d’un pilote de port audio et la broche source d’un autre filtre (généralement, le pilote système KMixer), SysAudio obtient d’abord le tableau de plage de données de la broche source. SysAudio envoie ensuite une requête KSPROPERTY_PIN_DATAINTERSECTION à la broche du récepteur et inclut le tableau de plage de données de la broche source avec cette requête. La couche de diffusion en continu du noyau intercepte la requête et appelle de façon itérative le gestionnaire d’intersection de données du pilote de port une fois pour chaque élément successif dans le tableau de plage de données de la broche source, en commençant par le premier élément, jusqu’à ce que le gestionnaire réussisse à trouver une intersection de données.

À chaque appel que SysAudio effectue au gestionnaire d’intersection de données du pilote de port, le gestionnaire obtient d’abord le tableau de plage de données de la broche du récepteur à partir du pilote miniport. Il effectue ensuite une itération dans le tableau, en commençant par le premier élément, jusqu’à trouver une intersection entre une plage de données récepteur-broche et la plage de données source-broche actuelle. Le gestionnaire sélectionne un format commun qui se trouve dans l’intersection et génère ce format à l’appelant.

À chaque étape de l’itération, le pilote de port appelle le gestionnaire d’intersection de données propriétaire du pilote miniport avec les deux plages de données , une pour chacune des deux broches. Si, à une étape quelconque, le gestionnaire propriétaire refuse de gérer une case activée d’intersection de données entre les deux plages de données, le gestionnaire d’intersection de données du pilote de port effectue l’case activée à la place.

Pour résumer, la recherche d’une intersection entre une plage de données source-broche et une plage de données récepteur-broche est un processus itératif :

  • Dans la boucle externe, la couche de diffusion en continu du noyau effectue une itération au sein des éléments successifs dans le tableau de plage de données de la broche source, en commençant par le premier élément de tableau.

  • Dans la boucle interne, le pilote de port effectue une itération au sein des éléments successifs dans le tableau de plage de données de la broche du récepteur, en commençant par le premier élément de tableau.

La recherche s’arrête lors de la recherche de la première intersection de données. Ce processus tend à favoriser les éléments vers le début du tableau de plage de données de chaque broche. Lorsque vous spécifiez un tableau de plages de données pour une broche, un pilote d’adaptateur doit classer les éléments du tableau en plaçant les plages de données pour les formats préférés vers le début du tableau.