Чтобы добавить к отличным ответам выше.
Ваш вопрос о латентности Windows ни пообещал, ни позаботился. И как таковой, он может быть совершенно другим в зависимости от версии ОС, аппаратного обеспечения и других факторов. WaveOut API и DirectSound тоже (не уверен насчет WASAPI, но я полагаю, что это верно и для этого последнего Vista + аудио API) - все они настроены для буферизованного вывода звука. Определенная точность обратного вызова не требуется, если вы вовремя ставите в очередь следующий буфер, пока текущий еще воспроизводится.
Когда вы начинаете воспроизведение звука, у вас есть несколько предположений, таких как отсутствие потерь во время воспроизведения, и весь вывод непрерывен, а частота звука точно соответствует ожидаемой, например, 44100 Гц. Затем вы делаете простую математику, чтобы запланировать выход волны во времени, преобразовав время в сэмплы, а затем в байты.
К сожалению, эффективная скорость воспроизведения не является точной, например, Представьте, что реальная аппаратная частота дискретизации может составлять 44,100 Гц -3%, и в долгосрочной перспективе математика времени до байта может вас подвести. Была предпринята попытка компенсировать этот эффект, например, сделать аудиоаппаратуру тактовой частотой воспроизведения и синхронизировать видео с ней (так работают плееры), а также использовать метод согласования скорости, чтобы согласовать скорость входящих данных с фактической скоростью воспроизведения на аппаратном уровне. И то, и другое делает измерения абсолютного времени и задержки весьма спекулятивным знанием.
Более того, задержки API 20 мс, 30 мс, 50 мс и так далее. С давних пор waveOut API - это слой поверх других API. Это означает, что некоторая обработка выполняется до того, как данные действительно достигают аппаратного обеспечения, и эта обработка требует, чтобы вы заблаговременно убрали руки с очередей, иначе данные не достигнут аппаратного обеспечения. Допустим, если вы попытаетесь поставить в очередь свои данные в 10 мс буферах непосредственно перед временем воспроизведения, API примет эти данные, но сам опоздает с передачей этих данных в нисходящем направлении, и на громкоговорителях будет тихий или комфортный шум.
Теперь это также относится к обратным вызовам, которые вы получаете. Вы можете сказать, что вас не волнует задержка буферов, и для вас важно точное время обратного вызова. Однако, поскольку API является многоуровневым, вы получаете обратный вызов с точностью синхронизации внутреннего уровня, такой второй внутренний уровень уведомляет о свободном буфере, и первый внутренний уровень обновляет свои записи и проверяет, может ли он также освободить ваш буфер (эй, эти буферы не не должно совпадать). Это делает ожидания точности обратного вызова очень слабыми и ненадежными.
При условии, что я не касался API waveOut в течение достаточно долгого времени, если бы возник такой вопрос о точности синхронизации, я бы, вероятно, прежде всего подумал о двух вещах:
Windows обеспечивает доступ к звуковым аппаратным часам (я знаю об интерфейсе IReferenceClock, доступном через DirectShow, и, вероятно, это происходит из-за другой вещи более низкого уровня, которая также доступна), и имея такую доступность, я попытался бы синхронизироваться с ней
Новейший аудио API от Microsoft, WASAPI, предоставляет специальную поддержку для аудио с малой задержкой, добавляя новые интересные вещи, такие как улучшенное планирование потоков мультимедиа, потоки в эксклюзивном режиме и задержка <10 мс для PCM - это то, где лучше синхронизировать смотреть на </p>