Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un controlador de miniporte WavePci llama al método IPreFetchOffset::SetPreFetchOffset para especificar el desplazamiento de prefetch de un flujo de salida de DirectSound acelerado por hardware. Este desplazamiento es el número de bytes de datos que separan el cursor de escritura del cursor de reproducción en el búfer de hardware del dispositivo de audio. El cursor de escritura especifica la posición del búfer en la que una aplicación DirectSound puede escribir de forma segura la siguiente muestra de sonido. El cursor de reproducción especifica la posición del búfer de la muestra de sonido que está reproduciendo actualmente el dispositivo de audio.
DirectSound consulta al controlador de puerto WavePci sobre las posiciones actuales de reproducción y escritura de los cursores mediante el envío de una solicitud de propiedad KSPROPERTY_AUDIO_POSITION. En respuesta a esta solicitud, el controlador de puerto obtiene la posición de reproducción actual del controlador de miniport mediante una llamada a IMiniportWavePciStream::GetPosition. La forma en que el controlador de puerto determina la posición de escritura depende de si se ha llamado a SetPreFetchOffset .
De forma predeterminada, el controlador de puerto coloca el cursor de escritura en la última asignación solicitada por el controlador de miniport. Con cada llamada a IPortWavePciStream::GetMapping, el desplazamiento predeterminado de captura previa aumenta. Si el controlador de miniporte WavePci adquiere un gran número de asignaciones, el desplazamiento predeterminado puede aumentar significativamente.
Llamar a SetPreFetchOffset invalida el valor predeterminado. Después de esta llamada, el controlador del puerto calcula la posición de escritura sumando el desplazamiento de lectura anticipada especificado a la posición de reproducción (teniendo en cuenta la envoltura al final del búfer de DirectSound).
Un controlador de miniport puede asignar un gran número de mapeos por varias razones. Uno es reducir la sobrecarga de las operaciones de audio en el procesador del sistema. Con más asignaciones, el controlador requiere menos interrupciones para mantener el dispositivo de audio suministrado continuamente con datos. Otra razón es que la asignación de más mapeos reduce la probabilidad de que la reproducción de audio sufra interrupciones cuando los controladores de dispositivo se comportan mal y bloquean el sistema durante períodos cortos.
Un problema con un desplazamiento previo grande es que algunas aplicaciones de DirectSound pueden confundirse con las posiciones relativas de los cursores de reproducción y escritura. En Windows 95/98, los VxDs de audio mantienen un desplazamiento de prefetch relativamente pequeño y las aplicaciones de DirectSound escritas para estos sistemas operativos podrían no ejecutarse correctamente si el desplazamiento es mayor de lo que esperan.
Por ejemplo, una aplicación podría dividir el búfer de DirectSound en una mitad superior y una mitad inferior y luego intercambiar estas dos mitades entre la aplicación y el dispositivo. Cuando el cursor de escritura entra por primera vez en la mitad superior o inferior del búfer, escribe una cantidad de datos equivalente a la mitad del búfer en esa mitad correspondiente del mismo. Este esquema supone que el cursor de reproducción siempre se coloca en la mitad del búfer en la que no se está escribiendo, es decir, en la otra mitad. Tenga en cuenta que esta suposición es incorrecta si el offset de prefetch supera la mitad del tamaño del búfer. En ese caso, cuando el cursor de escritura llega al final del búfer de DirectSound y se ajusta al principio del búfer, estará en la misma mitad del búfer que el cursor de reproducción. Cuando la aplicación escribe una cantidad de datos de medio búfer en la nueva posición del cursor de escritura, termina sobrescribiendo la posición del cursor de reproducción y destruyendo los datos que aún no se han reproducido.
Aunque ciertamente se puede culpar a la propia aplicación por este tipo de error, un controlador de miniporte WavePci puede eliminar el modo de error simplemente llamando a SetPreFetchOffset para establecer el desplazamiento de captura previa en un valor más pequeño.
Al establecer el desplazamiento de prefetch en un valor más pequeño, el cursor de escritura resultante se acerca al cursor de reproducción. Debe establecer el offset de prefetch al tamaño FIFO de su hardware. Un desplazamiento típico de captura previa es de aproximadamente 64 muestras, según el diseño de hardware del motor DMA.
Para seguir siendo compatible con ciertas aplicaciones anteriores de DirectSound, DirectSound actualmente rellena los cursores de escritura de pines acelerados por hardware en 10 milisegundos. Tenga en cuenta que la cantidad de relleno puede cambiar en el futuro.
Para obtener más información sobre cómo administrar cursores de escritura y cursores de reproducción a nivel de controlador, vea Propiedad de posición de audio.