CBL: заливка буфера тишиной при открытии + щелчок на выходе из PoP
Две разные болячки, обе разобраны записью звука MAME в WAV. libc: буфер CBL железо не чистит, а запись в порт управления сразу пускает воспроизведение с нулевого слота — первые 256 сэмплов (23,4 мс) уходит то, что лежало раньше. Своими данными звук идёт лишь с третьей половины: прерывание приходит на 128-м слоте и ставит указатель на противоположную половину. _cbl_prime заливает буфер тишиной сразу после включения (раньше нельзя — запись проходит только при поднятом bit7). В MAME это немо (эмулируемый буфер стартует нулями при двухдополнительном ЦАП), на железе это ровно тот мусор, что ловился на тестовых примерах CBL. PoP: на выходе по ESC звучало ровно 11 мс шума на полной громкости — один пропущенный блок (128 сэмплов). Причина: pop_shutdown освобождал атласы и графику через ESTEX при открытом звуке, насос не успевал долить. Звук гасим первым действием. Проверено записью — всплеска больше нет. Заодно записан разбор стартового всплеска (sound_plan.md §10): это не мусор, а gate_closing_fast из левой комнаты, обрываемый soft_land. Обрыв одноголосьем — поведение оригинала (play_digi_sound начинается с stop_digi, seg009.c:2402). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -962,11 +962,18 @@ int pop_level_switch(void) __banked
|
||||
void pop_shutdown(void) __banked
|
||||
{
|
||||
gfx_set_idle_hook(0); /* снять хук ДО закрытия raw-канала */
|
||||
/* ЗВУК ГАСИМ ПЕРВЫМ, до closegraph и освобождения страниц. Дальше идут
|
||||
* ESTEX-вызовы (mem_free_block на каждый атлас), а они уходят надолго —
|
||||
* насос не успевает долить очередной блок, и железо доигрывает по кругу
|
||||
* несвежую половину буфера. Замер записи MAME: на выходе по ESC ровно
|
||||
* 11 мс шума на полной громкости, то есть ОДИН пропущенный блок (128
|
||||
* сэмплов = 11,7 мс). Та же причина, по которой звук глушится на время
|
||||
* загрузки уровня (pop_sfx.h). */
|
||||
pop_sfx_close();
|
||||
pop_ctrl_close();
|
||||
closegraph();
|
||||
pop_bg_free();
|
||||
pop_kid_free();
|
||||
pop_sfx_close();
|
||||
pop_shadow_free();
|
||||
pop_guard_free();
|
||||
pop_kid_data_free();
|
||||
|
||||
Reference in New Issue
Block a user