Допустим, я воспроизводил стереофонический WAV-файл с 317 520 000 семплов, что теоретически 1 час. Если предположить, что воспроизведение не прерывается, файл завершит воспроизведение через ровно один час, или есть некоторые незначительные изменения в скорости воспроизведения, так что он будет немного больше или чуть меньше (на некоторое количество миллисекунд) ) чем час?
Я пытаюсь синхронизировать анимацию со звуком, и я использую System.Diagnostics.Stopwatch
, чтобы кадры соответствовали звуку. Но если скорость воспроизведения звука WAV в Windows может незначительно изменяться со временем, то звук будет не синхронизирован с анимацией, управляемой секундомером.
Что приводит ко второму вопросу: кажется, что Stopwatch
- хотя и очень гранулированный и точный для коротких периодов времени - работает немного быстро. На моем ноутбуке Stopwatch
, запускаемый ровно в течение 24 часов (согласно системному времени компьютера и реальному секундомеру), показывает, что прошедшее время составляет 24 часа плюс около 5 секунд (не миллисекунд).
Это известная проблема с Stopwatch
? (Связанный вопрос был бы «я сумасшедший?», Но вы можете попробовать это сами.) Учитывая его использование в качестве инструмента диагностики, я могу видеть, где подобное расхождение проявляется только при измерении длительных периодов, для которых большинство люди будут использовать что-то, кроме Stopwatch
.
Если мне действительно повезет, то и Stopwatch
, и воспроизведение звука будут управляться одним и тем же базовым механизмом и, таким образом, будут синхронизироваться друг с другом в течение многих дней подряд. Есть ли шанс, что это правда?
Обновление : Я только что сделал математику, и если Stopwatch
дрейфует на 5 секунд в течение 24 часов, это означает, что он будет дрейфовать на 10 миллисекунд через 172 секунды. Таким образом, через 3 минуты анимация начнет заметно пропадать.
Я экспериментирую с периодическим (каждые 10 секунд или около того) перезапуском таймера из обратного вызова waveOutWrite, но это не работает, потому что весь следующий набор событий таймера компенсируется любой неточностью обратного вызова случилось быть. Отстой, чтобы быть мной.