/* * cbl_close — выключить CBL, снять хук насоса и отпустить IM2-таблицу. * Идемпотентно; вызывается и из atexit. * * БУФЕР ТИШИНЫ НЕ ОСВОБОЖДАЕТСЯ. Раньше здесь стоял free(_cbl_silence), и * он один тянул malloc/free в резидент КАЖДОМУ приложению — включая те, что * cbl_open_silence() не зовут вовсе. Буфер живёт до выхода из программы и * переиспользуется при повторном открытии (см. cbl_open_silence.c). * * Порт 0x004E не гасится напрямую — вместо этого _cbl_port_sync() * пересчитывает нужное значение: если gfx_wait_vsync() ещё держит * ссылку (_cbl_port_refs > 0), останется "немой" режим ради бита * синхронизации; иначе порт гасится полностью. */ #include "_cbl.h" #include "../irq/_irq.h" void cbl_close(void) { if (!_irq_cbl_hook) return; IRQ_DISABLE(); _irq_cbl_hook = 0; IRQ_ENABLE(); _cbl_port_sync(); _irq_table_unref(); }