Сообщение от
SAM style
Есть кольцевой буфер размером 16кб. Во время эмуляции считается сэмулированное время, и через определенные промежутки с текущей железяки снимается громкость, несколько таких значений подряд усредняются и этот усредненный сэмпл ложится в буфер. Это всё происходит в потоке эмуляции. Без ускорения эмуляция происходит кусками, цель каждого куска - заполнить буфер на столько семплов, сколько хочет SDL. Это делает звук более гладким, но разрывает графику. Иначе будет наоборот, но ещё хуже.
Далее есть SDL-овский callback на воспроизведение звука, он работает в своём собственном потоке. Первые пара буферов пропускается, чтобы не пересекаться с заполнением буфера. Воспроизведение идёт с того же самого кольцевого буфера, но чуть позади заполнения. В идеале заполнение и воспроизведение идут с одной скоростью, не догоняют и не обгоняют друг друга. Но если вдруг воспроизведение догнало заполнение на расстояние одного буфера, то оно откатывается назад - тут происходит проигрывание прошлого буфера.