Волновая циклическая задержка
Если драйвер miniport WaveCyclic обеспечивает аппаратное смешивание потока воспроизведения звука, DirectSound отправляет IRP в драйвер порта WaveCyclic, который содержит весь поток волн DirectSound в одном циклическом буфере. Драйвер порта WaveCyclic получает IRP и передает данные волн по частям в буфер DMA, который предоставляет драйвер. WaveCyclic пытается сохранить указатель записи буфера DMA примерно на 40 миллисекундах перед указателем чтения. Даже если драйвер выполняет смешивание оборудования с DirectSound, он может ожидать около 40 миллисекунд дополнительных данных в буфере DMA.
Тот факт, что драйвер порта WaveCyclic пытается накопить до 40 миллисекундах данных в циклическом буфере, не означает, что драйвер порта WaveCyclic добавляет 40 миллисекунда к задержке потока. Фактически драйвер порта добавляет очень небольшую задержку. Непосредственно перед началом воспроизведения нового потока, в то время как драйвер порта по-прежнему записывает исходные данные в начало циклического буфера, драйвер порта продолжает запись до тех пор, пока данные больше не будут доступны или буфер не будет содержать полные 40 миллисекундах данных. Тем не менее, если меньше этого объема данных сразу же становится доступным, драйвер порта не будет принудительно ждать драйверу мини-порта. Вместо этого он позволяет драйверу мини-порта немедленно начать воспроизведение уже буферизированных данных. Позже, когда станет доступно больше данных, драйвер порта продолжает записывать данные в буфер до тех пор, пока данные больше не будут доступны или объем данных, буферизируемых между указателями чтения и записи, не достигнет 40 миллисекунд.
После периода почти голода поток KMixer может содержать интервалы тишины. Если waveCyclic получил от KMixer достаточное количество волновых данных для хранения тридцати миллисекундах дополнительных данных в буфере DMA, WaveCyclic начинает запись тишины в буфер DMA после окончания допустимых данных из KMixer. Эта политика гарантирует, что если происходит голод и устройство считывает допустимые данные, звуковое устройство отображает тишину, а не устаревшие или неинициализированные данные.
Объем тишины, записываемый в буфер DMA, остается довольно небольшим, и если KMixer успешно предоставил драйверу порта WaveCyclic дополнительные данные до того, как тишина была воспроизведена, эти данные перезаписывают тишину в буфере. При отсутствии голода звуковое устройство получает непрерывный поток смешанных данных без интервалов принудительной тишины. Однако при отладке драйвера может возникнуть вызов метода IMiniportWaveCyclicStream::Silence драйвера минипорта, даже если звуковой отрисовщик не голодает.