/*
 * cbl_close — выключить CBL, снять хук насоса, освободить буфер
 * тишины (если был аллоцирован под CBL_UNDERRUN_SILENCE) и отпустить
 * IM2-таблицу.  Идемпотентно; вызывается и из atexit.
 *
 * Порт 0x004E не гасится напрямую — вместо этого _cbl_port_sync()
 * пересчитывает нужное значение: если gfx_wait_vsync() ещё держит
 * ссылку (_cbl_port_refs > 0), останется "немой" режим ради бита
 * синхронизации; иначе порт гасится полностью.
 */

#include <stdlib.h>
#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();
    free(_cbl_silence);
    _cbl_silence = 0;
    _irq_table_unref();
}
