Предварительные выборки смещения

Драйвер минипорта 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 миллисекунд к курсорам записи аппаратно ускоряемых каналов. Обратите внимание, что объем отступов может измениться в будущем.

Дополнительные сведения об управлении курсорами записи и воспроизведения курсоров на уровне драйвера см. в разделе "Свойство положения звука".