Desplazamientos de captura previa
Un controlador de miniport de WavePci llama al método IPreFetchOffset::SetPreFetchOffset para especificar el desplazamiento de captura previa de un flujo de salida 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 el controlador de puerto WavePci para las posiciones actuales de la reproducción y escribe cursores enviando 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 miniporte llamando 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 miniporte. Con cada llamada a IPortWavePciStream::GetMapping, el desplazamiento de captura previa predeterminado aumenta de tamaño. Si el controlador de miniporte WavePci adquiere un gran número de asignaciones, el desplazamiento predeterminado puede crecer muy grande.
Al llamar a SetPreFetchOffset , se invalida el valor predeterminado. Después de esta llamada, el controlador de puerto calcula la posición de escritura agregando el desplazamiento de captura previa especificado a la posición de reproducción (teniendo en cuenta la solución de ajuste al final del búfer de DirectSound).
Un controlador de minipuerto puede asignar un gran número de asignaciones por un par de motivos. 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 los datos. Otra razón es que la asignación de más asignaciones reduce la probabilidad de que la reproducción de audio sufra problemas cuando los controladores de dispositivos mal comportados atan el sistema durante breves períodos.
Un problema con un desplazamiento de captura previa grande es que algunas aplicaciones de DirectSound pueden confundirse sobre las posiciones relativas de los cursores de reproducción y escritura. En Windows 95/98, los VxD de audio mantienen un desplazamiento de captura previa relativamente pequeño y las aplicaciones directSound escritas para estos sistemas operativos podrían no ejecutarse correctamente si el desplazamiento es mayor de lo esperado.
Por ejemplo, una aplicación podría dividir el búfer de DirectSound en una mitad superior y una mitad inferior y luego "ping pong" las dos mitades entre la aplicación y el dispositivo. Cuando el cursor de escritura entra primero en la mitad superior o inferior del búfer, escribe la mitad de los datos de un búfer medio en esa mitad del búfer. Este esquema supone que el cursor de reproducción siempre está colocado en la otra mitad del búfer, la mitad en la que no se está escribiendo. Tenga en cuenta que esta suposición es incorrecta si el desplazamiento de captura previa 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 la cantidad de datos de un búfer medio 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 miniport de 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 captura previa en un valor más pequeño, el cursor de escritura resultante se acerca al cursor de reproducción. Debe establecer el desplazamiento de captura previa en el tamaño FIFO del hardware. Un desplazamiento de captura previa típico es de aproximadamente 64 muestras, dependiendo del 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 información adicional sobre cómo administrar cursores de escritura y reproducir cursores en el nivel de controlador, vea Propiedad De posición de audio.