Décalages de prérécupération
Un pilote de miniport WavePci appelle la méthode IPreFetchOffset::SetPreFetchOffset pour spécifier le décalage de prérécupération d’un flux de sortie DirectSound accéléré par le matériel. Ce décalage est le nombre d’octets de données séparant le curseur d’écriture du curseur de lecture dans la mémoire tampon matérielle du périphérique audio. Le curseur d’écriture spécifie la position de la mémoire tampon dans laquelle une application DirectSound peut écrire en toute sécurité l’exemple de son suivant. Le curseur de lecture spécifie la position de la mémoire tampon de l’échantillon de son en cours de lecture par le périphérique audio.
DirectSound interroge le pilote de port WavePci pour connaître les positions actuelles des curseurs de lecture et d’écriture en envoyant une demande de propriété KSPROPERTY_AUDIO_POSITION . En réponse à cette demande, le pilote de port obtient la position de lecture actuelle du pilote miniport en appelant IMiniportWavePciStream::GetPosition. La façon dont le pilote de port détermine la position d’écriture dépend de l’appel de SetPreFetchOffset ou non.
Par défaut, le pilote de port positionne le curseur d’écriture dans le dernier mappage demandé par le pilote miniport. À chaque appel à IPortWavePciStream::GetMapping, le décalage de prérécupération par défaut augmente. Si le pilote de miniport WavePci acquiert un grand nombre de mappages, le décalage par défaut peut augmenter très grand.
L’appel de SetPreFetchOffset remplace la valeur par défaut. Après cet appel, le pilote de port calcule la position d’écriture en ajoutant le décalage de prérécupération spécifié à la position de lecture (en tenant compte du wraparound à la fin de la mémoire tampon DirectSound).
Un pilote miniport peut allouer un grand nombre de mappages pour deux raisons. L’une consiste à réduire la surcharge des opérations audio sur le processeur système. Avec plus de mappages, le pilote nécessite moins d’interruptions pour que le périphérique audio reste fourni en continu avec des données. Une autre raison est que l’allocation d’un plus grand nombre de mappages réduit la probabilité que la lecture audio souffre de problèmes lorsque des pilotes de périphériques mal comportementaux lient le système pendant de courtes périodes.
Un problème avec un décalage de prérécupération important est que certaines applications DirectSound peuvent devenir confuses quant aux positions relatives des curseurs de lecture et d’écriture. Dans Windows 95/98, les VxD audio conservent un décalage de prérécupération relativement faible, et les applications DirectSound écrites pour ces systèmes d’exploitation peuvent ne pas s’exécuter correctement si le décalage est supérieur à ce qu’ils attendent.
Par exemple, une application peut diviser la mémoire tampon DirectSound en une moitié supérieure et une moitié inférieure, puis « ping pong » les deux moitiés entre l’application et l’appareil. Lorsque le curseur d’écriture entre pour la première fois dans la moitié supérieure ou inférieure de la mémoire tampon, il écrit la valeur des données d’une demi-mémoire tampon dans cette moitié de la mémoire tampon. Ce schéma suppose que le curseur de lecture est toujours positionné dans l’autre moitié de la mémoire tampon, c’est-à-dire la moitié dans laquelle l’écriture n’est pas effectuée. Notez que cette hypothèse est incorrecte si le décalage de prérécupération dépasse la moitié de la taille de la mémoire tampon. Dans ce cas, lorsque le curseur d’écriture atteint la fin de la mémoire tampon DirectSound et s’encapsule au début de la mémoire tampon, il se trouve dans la même moitié de la mémoire tampon que le curseur de lecture. Lorsque l’application écrit la valeur de la moitié des données d’une mémoire tampon dans la nouvelle position du curseur d’écriture, elle finit par remplacer la position du curseur de lecture et détruire les données qui n’ont pas encore été lues.
Bien que l’application elle-même puisse certainement être responsable de ce type de défaillance, un pilote de miniport WavePci peut éliminer le mode d’échec simplement en appelant SetPreFetchOffset pour définir le décalage de prérécupération sur une valeur plus petite.
Si vous définissez le décalage de prérécupération sur une valeur plus petite, le curseur d’écriture résultant se rapproche du curseur de lecture. Vous devez définir le décalage de prérécupération sur la taille FIFO de votre matériel. Un décalage de prérécupération classique est d’environ 64 exemples, selon la conception matérielle du moteur DMA.
Pour rester compatible avec certaines applications DirectSound plus anciennes, DirectSound rembourse actuellement les curseurs d’écriture des broches à accélération matérielle de 10 millisecondes. Notez que la quantité de remplissage peut changer à l’avenir.
Pour plus d’informations sur la gestion des curseurs d’écriture et de la lecture des curseurs au niveau du pilote, consultez Audio Position Property.