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


Ответить с цитированием

Размещение рекламы на форуме способствует его дальнейшему развитию 
