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:
@@ -55,6 +55,11 @@ extern uint8_t _cbl_port_refs; /* держатели bit7 помимо
|
||||
/* Запись в 16-битный порт управления 0x004E. */
|
||||
void _cbl_ctrl(uint8_t v);
|
||||
|
||||
/* Залить весь аппаратный буфер (256 слотов) байтом тишины сразу после
|
||||
* включения — иначе первые 23 мс играет то, что лежало в буфере раньше.
|
||||
* Подробный разбор — в шапке _cbl_prime.c. */
|
||||
void _cbl_prime(uint8_t silence);
|
||||
|
||||
/* ISR-насосы: вызвать fill(), при недоливе — тишина по режиму (один
|
||||
* регистрируется в _irq_cbl_hook при cbl_open — по выбору CBL_PUMP_*). */
|
||||
void _cbl_pump_otir(void);
|
||||
|
||||
Reference in New Issue
Block a user