Звук PoP: приоритеты и перебиваемость вместо «всегда перебивать»
Пользователь услышал расхождение с SDLPoP: у нас решётка обрывалась приземлением Кида, в оригинале доигрывает до конца, а приземления не слышно. Оказалось, упущен целый механизм. play_sound (seg000:12C5) НЕ играет, а только номинирует кандидата на кадр — из нескольких выживает важнейший (меньше prio = важнее, при равенстве последний). play_next_sound (seg000:1304) раз в кадр решает, запускать ли: можно, только если ничего не играет ЛИБО текущий помечен перебиваемым и новый не менее важен. Иначе номинант выбрасывается — очереди в оригинале нет. Отсюда всё, что слышно: gate_closing_fast неперебиваем и доигрывает целиком; челюсти (prio 0x10) всегда важнее решётки (0x32), поэтому решётка звучит только в паузах между укусами. Таблицы из SDLPoP с учётом fix_sound_priorities (в его config.h он определён безусловно). Створка двери уровня — единственная запись, правимая на ходу, вынесена в отдельный байт. Добавлен пропущенный stop_sounds на завершении открытия двери (seg007:455). Проверено записью MAME: старт уровня 1 был 135+210 мс (решётка, обрезанная на 80 мс), стал один всплеск 455 мс с корреляцией огибающей +0,889 со звуком 6. Заведён BUG-SND-FIRSTRUN: искажение первого эффекта при первом запуске после загрузки системы — вероятно, лечится _cbl_prime, но проверить можно только на железе. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -893,3 +893,30 @@ Makefile правила нет.
|
||||
|
||||
**Приоритет низкий:** ситуация возникает только когда труп остаётся на
|
||||
проваливающемся полу, играбельности не мешает.
|
||||
|
||||
---
|
||||
|
||||
## BUG-SND-FIRSTRUN — при ПЕРВОМ запуске первый эффект слегка искажён
|
||||
|
||||
**Симптом** (пользователь, 2026-08-20): после загрузки системы, при первом
|
||||
запуске программы, самый первый звуковой эффект идёт с искажением; при
|
||||
повторном запуске программы искажения нет. Наблюдалось ещё на тестовых
|
||||
примерах CBL, до PoP.
|
||||
|
||||
**Причина, скорее всего, уже устранена.** Аппаратный буфер CBL (256
|
||||
слотов) железо не чистит, а запись в порт управления сразу пускает
|
||||
воспроизведение с нулевого слота — то есть первые 23,4 мс играет то, что
|
||||
лежало в буфере раньше. При первом запуске это остатки после загрузки
|
||||
системы, при втором — наша же тишина, поэтому и слышно только один раз.
|
||||
Разбор — `../docs/sound_plan.md` §10.2.
|
||||
|
||||
Лечение сделано в libc: `_cbl_prime` заливает буфер тишиной сразу после
|
||||
включения (`cbl_open`). **В MAME проверить нельзя**: эмулируемый буфер
|
||||
стартует нулями при двухдополнительном ЦАП, то есть там этот дефект нем
|
||||
изначально — записи до и после фикса совпали побитово по огибающей.
|
||||
|
||||
**Что нужно:** проверка на РЕАЛЬНОМ железе, первый запуск после холодной
|
||||
загрузки. Если искажение осталось — значит мусор приходит не из буфера
|
||||
CBL, и копать надо в системных буферах DSS.
|
||||
|
||||
**Приоритет низкий:** один раз за сеанс, на играбельность не влияет.
|
||||
|
||||
Reference in New Issue
Block a user