Когда вы устанавливаете скорость звуковой карты, например, 44100, вы не можете гарантировать, что фактическая скорость будет равна 44100. В моем случае измерения трафика между приложением и ALSA (в сэмплах / сек) дали мне значение 44066 ... 44084.
Это не должно быть связано с проблемами передискретизации: даже только 48000 аппаратуре необходимо «съесть» данные со скоростью 44100 в режиме «44100».
Проблема возникает, когда я пытаюсь навести курсор насигнал во время воспроизведения.Я вычисляю положение курсора, используя «идеальную» частоту дискретизации, считанную из WAV-файла (22050, ..., 44100, ..., 48000) и миллисекунды, проведенные после начала воспроизведения, используя следующую функцию C ++:
long long getCurrentTimeMs(void)
{
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
boost::posix_time::ptime epoch_start(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration dur = now - epoch_start;
return dur.total_milliseconds();
}
QTimer используется для генерации кадров для анимации курсора, но я не зависим от точности QTimer, потому что я запрашиваю время у getCurrentTimeMs () (предполагая, что это достаточно точно) для каждого кадра, поэтому я могу работать с переменной частотой кадров.
После 2-3 минут игры я вижу небольшую разницу между тем, что я слышу, и тем, что я вижу - позиция курсора больше, чем позиция воспроизведения, примерно на 1/20 секунды или около того.
Когдая измеряю трафик, который проходит через обратный вызов ALSA, я получаю среднее значение 44083,7 выборок / сек.Затем я использую это значение в функции рисования экрана в качестве фактической ставки.Теперь проблема исчезает.Программа кроссплатформенная, поэтому я протестирую эти измерения на Windows и другой звуковой карте позже.
Но есть ли лучший способ синхронизации звука и экрана?Есть ли какой-нибудь не очень ресурсоемкий способ запроса звуковой карты, например, о фактическом номере воспроизводимого семпла?