Важная информация

User Tag List

Страница 173 из 177 ПерваяПервая ... 169170171172173174175176177 ПоследняяПоследняя
Показано с 1,721 по 1,730 из 1765

Тема: Xpeccy

  1. #1721
    Activist
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    491
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    32
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Может мне кажется, но в этой новой версии лаг звукового тракта увеличился. Когда в реале звук и картинка синхронной может быть, здесь где-то треть секунды проходит прежде чем звук появится.

    В 7рке после Инсерта тоже пурген периодически случается. Просто этот Инсерт не использовал, поэтому даже не замечал (Xpeccy использую только для отладки, ибо дебагер топовый, ну а для тестирования - Unreal, ибо и звук и 50fps тайминги заметно лучше).
    На предыдущей версии тоже. Регулярносьть этого странного эффекта - 880 сэмплов. То есть ровно 50Гц, фреймрейт. Каждый раз после выхода из инсерта это смещение другое (в основном 0). Но может быть чуть заметнее, может быть более крепко. Ещё заметил, что после окончания воспроизведения, когда в микшеры и громкости записывается 0, этот хвост вылазит.
    Такое чувство, что в буфере воспроизведения наслаиваются и текущие, и предыдущие. И в основном это предыдущие, с небольшим вкраплением текущих. Какая-то дичь. Почему вообще такая дичь происходит? Я вообще не думаю что это связано с операционкой. Ибо на 7рке то же самое.

    ==добавлено==
    Короче как я увидел схема такая:
    4 фрейма буферизируются (это ~3520 сэмплов).
    Каждые N сэмплов каждого фрейма (который 880 сэмплов) попадают в текущий буфер, но в какой-то момент буфер переключается, и они уже попадают в следующий. На следующей итерации происходит то же самое, и поэтому звук разрывается между двумя буферами с дискретностью в 1 фрейм.
    1 фрейм - это как раз момент изменения значения портов. Получается, что при каких-то обстоятельствах вместе с впихиванием значения в регистры AY происходит и переключение буфера? Причём вначале фрейма буфер правильный. Или же наоборот - вначале фрейма буфер "не тот" и только с впихиванием регистров он переключается на правильный.
    И, кстати, эта сбивка буфера происходит ДО даунсемплинга, потому что границы несмотря на резкие перескоки - сглажена.

    И ещё проверил дигиталы. В них сбой каждые 2 фрейма (1760 сэмплов). Может дело в конкретном регистре, который в итоге служит причиной переключения буфера? Иначе оцифровки бы совсем иначе "рвались".

    В любом случае, эта регулярная сбивка выглядит как арпеджированное эхо в 4 фрейма.
    Еще одна мысль посетила, что возможно после инсерта таймер фреймов CPU оказывается рассинхронизированным с фреймами SDL (при том что звуковые и графические фреймы вообще не должны идти "независимо").

    Я почти уверен, что все эти сложности и сбои с буферами происходят из-за того, что рендеринг звука происходит не как во всех остальных эмуляторах (с частотой дискретизации звуковухи * FIR window), а на основе частоты работы CPU, и уже потом это downsample'ится до 44100. И сделано это как-то "не так", скорее всего из-за Qt.

    Неравномерность графики кстати адская. Хоть он показывает что там 50гц, но там jitter такой идёт, что и на 2 фрейма запросто может заморозиться и потом сразу 3 фрейма выдать меньше чем за кадр.
    Последний раз редактировалось Dexus; 04.11.2019 в 04:27.

  2. #1722
    Veteran Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    1,745
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    12 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  3. #1723
    Activist
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    491
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    32
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    > Первые пара буферов пропускается, чтобы не пересекаться с заполнением буфера. Воспроизведение идёт с того же самого кольцевого буфера, но чуть позади заполнения.

    Говорили же старшие - никогда не заполняй воспроизводимый буфер. Воспроизводи только "задний". Если нужен такой большой запас - делай 3 буфера. В unreal-е три буфера. Каждый, правда, в 200 байт (и этого всегда хватает, и лага практически нет).

    У тебя после "тишины" инсерта (или дебаггера) указатель воспроизведения оказывается не "перед" указателем заполнения. Иногда. И ненамного. Настолько ненамного, что они периодически пересекаются.
    Последний раз редактировалось Dexus; 04.11.2019 в 12:25.

  4. #1724
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    2,913
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    22
    Спасибо Благодарностей получено 
    29
    Поблагодарили
    21 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  5. #1725
    Veteran Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    1,745
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    12 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    зачем всё это при живом SDL_QueueAudio?
    Потому что сначала там присутствовало ещё и alsa.
    Да и SDL1 придётся бросать. Хотя, нафиг он мне сдался теперь...
    Все любят гипножабу

  6. #1726
    Guru
    Регистрация
    16.12.2008
    Адрес
    Kharkov, Ukraina
    Сообщений
    2,107
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это конечно, прикольно как там кольцевой буфер глючить (делов, то). Ну, мне уже не интересно, писал эмуляторы в начале 2000г. И как там чего у каждой платформы (железа) сделано, не объять. Все это выходит за рамки Z80 (zx).

    Давайте становиться первым в мире плагинным эмулятором. До этого были попытки у ZXMAK2, но там все уперлось в ZX.
    Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2 (в работе), Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...

  7. #1726
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #1727
    Veteran Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    1,745
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    12 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от OrionExt Посмотреть сообщение
    Давайте становиться первым в мире плагинным эмулятором. До этого были попытки у ZXMAK2, но там все уперлось в ZX
    На самом деле это не так и сложно сделать в рамках xpeccy. Он и так почти состоит из обособленных блоков. Но сейчас на что-то такое времени и сил нет. Может, позже соберусь и сделаю
    Все любят гипножабу

  9. #1728
    Veteran Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    1,745
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    12 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я завяз в комодуре - хотя бы до минимально рабочего состояния хочется довести. Понятно, что тут мне вряд ли ответят, но всё же:
    • как я понял, CIA тактируется на частоте CPU, примерно 1МГц с отклонениями. Значит, таймер в большинстве случаев отсчитывает такты CPU. Да? (не считаем счетчик внешнего сигнала и счетчик таймера B по переполнению таймера А)
    • Вделал загрузку самых простых тапок - raw tape image, пробую загрузить по LOAD - получаю дулю с покоцаными данными. Во время пилота irq генерирует только /flag, но как только начинаются данные, включается irq от таймера А - он там зачем? По дебагу вижу irq от мофонного сигнала с периодами ~380/520/680 тактов, и иногда в них вклинивается irq от таймера А.
    • И ещё вопрос - когда таймер стартует, в его счетчик всегда записывается значение инициализатора? Даже когда "стартует" уже запущенный таймер?
    Все любят гипножабу

  10. #1729
    Guru Аватар для NEO SPECTRUMAN
    Регистрация
    22.05.2011
    Адрес
    Дзержинск
    Сообщений
    3,455
    Спасибо Благодарностей отдано 
    67
    Спасибо Благодарностей получено 
    60
    Поблагодарили
    51 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Проще будет взять рабочий эмуль с дебагером и провести жменю тестов
    ну или сорец
    дето сами буржуины писали что циа это редкостное...
    ...в плане описания возможностей

  11. #1730
    Veteran Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    1,745
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    12 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насчет тестов. Сам написать не смогу, потому как в 6502 не силён. Если есть таковые в виде PRG (что-то типа снапшота) для разных компонентов коммодора - буду рад заиметь. Находил такие только в d64, но до эмуляции дисков мне ещё как до Луны ползком.

    == added

    Нашёл ещё один даташит на CIA. Перегрузка таймера работает не так, как я сначала думал:
    - при переполнении таймер всегда инициализируется
    - при записи в старший регистр таймера в остановленном состоянии он тоже инициализируется
    - бит "force load" в контрольном регистре значит "инициализировать таймер прямо сейчас" - сначала я думал, этот бит значит "перегружать таймер при переполнении или оставлять его FFFF).
    - при запуске таймера без бита "force load" он, соответственно, не инициализируется
    Последний раз редактировалось SAM style; 04.12.2019 в 10:51.
    Все любят гипножабу

  12. Этот пользователь поблагодарил SAM style за это полезное сообщение:

    NEO SPECTRUMAN (04.12.2019)

Страница 173 из 177 ПерваяПервая ... 169170171172173174175176177 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •