Смещения предварительной выборки

Драйвер miniport WavePci вызывает метод IPreFetchOffset::SetPreFetchOffset , чтобы указать смещение предварительной выборки потока вывода DirectSound с аппаратным ускорением. Это смещение — количество байтов данных, отделяющих курсор записи от курсора воспроизведения в аппаратном буфере звукового устройства. Курсор записи указывает позицию буфера, в которую приложение DirectSound может безопасно записать следующий образец звука. Курсор воспроизведения указывает расположение буфера образца звука, который в настоящее время воспроизводится звуковым устройством.

DirectSound запрашивает у драйвера порта WavePci текущие позиции курсоров воспроизведения и записи, отправляя запрос KSPROPERTY_AUDIO_POSITION свойства. В ответ на этот запрос драйвер порта получает текущую позицию воспроизведения от драйвера мини-порта, вызвав IMiniportWavePciStream::GetPosition. То, как драйвер порта определяет позицию записи, зависит от того, был ли вызван setPreFetchOffset .

По умолчанию драйвер порта размещает курсор записи в последнем сопоставлении, запрошенном драйвером мини-порта. С каждым вызовом IPortWavePciStream::GetMapping смещение предварительной выборки по умолчанию увеличивается. Если драйвер miniport WavePci получает большое количество сопоставлений, смещение по умолчанию может очень увеличиться.

Вызов SetPreFetchOffset переопределяет значение по умолчанию. После этого вызова драйвер порта вычисляет позицию записи, добавляя указанное смещение предварительной выборки к позиции воспроизведения (с учетом обходного пути переноса в конце буфера DirectSound).

Драйвер мини-порта может выделить большое количество сопоставлений по нескольким причинам. Один из них заключается в сокращении издержек звуковых операций на системном процессоре. При большем количестве сопоставлений драйверу требуется меньше прерываний, чтобы обеспечить непрерывное поставки данных звуковому устройству. Другая причина заключается в том, что выделение большего количества сопоставлений снижает вероятность того, что воспроизведение звука будет страдать от сбоев, когда плохо ведущее себя драйверы устройств связывают систему на короткие периоды времени.

Одна из проблем с большим смещением предварительной выборки заключается в том, что некоторые приложения DirectSound могут запутаться в относительных положениях курсоров воспроизведения и записи. В Windows 95/98 звуковые VXD поддерживают относительно небольшое смещение предварительной выборки, а приложения DirectSound, написанные для этих операционных систем, могут работать неправильно, если смещение больше ожидаемого.

Например, приложение может разделить буфер DirectSound на верхнюю и нижнюю половины, а затем "пинг-понг" две половины между приложением и устройством. Когда курсор записи впервые входит в верхнюю или нижнюю половину буфера, он записывает половину данных буфера в ту половину буфера. В этой схеме предполагается, что курсор воспроизведения всегда располагается в другой половине буфера — в половину, в которую не записывается. Обратите внимание, что это предположение неверно, если смещение предварительной выборки превышает половину размера буфера. В этом случае, когда курсор записи достигает конца буфера DirectSound и переносится в начало буфера, он будет находиться в той же половине буфера, что и курсор воспроизведения. Когда приложение записывает половину данных буфера в новую позицию курсора записи, оно в конечном итоге перезаписывает позицию курсора воспроизведения и уничтожает данные, которые еще не были воспроизведены.

Хотя само приложение, безусловно, может быть обвинено в этом типе сбоя, драйвер miniport WavePci может устранить режим сбоя, просто вызвав SetPreFetchOffset , чтобы задать смещение предварительной выборки на меньшее значение.

Установка меньшего значения смещения предварительной выборки перемещает результирующий курсор записи ближе к курсору воспроизведения. Необходимо задать смещение предварительной выборки в размере FIFO оборудования. Типичное смещение предварительной выборки составляет около 64 выборок в зависимости от аппаратной конструкции подсистемы DMA.

Чтобы обеспечить совместимость с некоторыми старыми приложениями DirectSound, DirectSound в настоящее время заполняет курсоры записи контактов с аппаратным ускорением на 10 миллисекунд. Обратите внимание, что объем заполнения может измениться в будущем.

Дополнительные сведения об управлении курсорами записи и воспроизведения курсоров на уровне драйвера см. в разделе Audio Position Property.