# Guia de Grabacion de Audio

## Resumen

basskit soporta grabacion desde microfono y audio del sistema (loopback)
con exportacion directa a MP3, FLAC, OGG u OPUS via BASSenc.

## API de Alto Nivel: Grabador

```python
from basskit.alto_nivel import inicializar, liberar
from basskit.alto_nivel.grabador import Grabador

inicializar()
grabador = Grabador()

# Listar dispositivos
for dev in grabador.listar_dispositivos():
    print(f"[{dev['indice']}] {dev['nombre']}")

# Grabar (PCM en memoria)
grabador.inicializar()
grabador.iniciar_grabacion(frecuencia=44100, canales=2)
time.sleep(5)
datos_pcm = grabador.detener_grabacion()

grabador.liberar()
liberar()
```

## Grabar a MP3 Directamente

```python
from basskit.dlls.bass import bass
from basskit.dlls.addons import bassenc_mp3
from basskit.dlls.bassenc import bassenc
from basskit.constantes.bass import BASS_SAMPLE_FLOAT, BASS_RECORD_PAUSE

bass.BASS_Init(0, 44100, 0, 0, None)
bass.BASS_RecordInit(-1)  # Dispositivo por defecto

# Crear canal de grabacion
rec = bass.BASS_RecordStart(44100, 2, BASS_SAMPLE_FLOAT | BASS_RECORD_PAUSE, None, None)

# Iniciar encoder MP3
encoder = bassenc_mp3.BASS_Encode_MP3_StartFile(
    rec, b"--preset standard", 0, b"grabacion.mp3"
)

# Iniciar grabacion
bass.BASS_ChannelPlay(rec, 0)

# Bucle de grabacion (leer datos para alimentar encoder)
import ctypes, time, signal

grabando = True
signal.signal(signal.SIGINT, lambda s,f: globals().update(grabando=False))

buf = (ctypes.c_byte * 4096)()
while grabando:
    bass.BASS_ChannelGetData(rec, ctypes.byref(buf), len(buf))
    time.sleep(0.1)

# Detener y guardar
bassenc.BASS_Encode_Stop(encoder)
bass.BASS_ChannelStop(rec)
bass.BASS_StreamFree(rec)
bass.BASS_RecordFree()
bass.BASS_Free()
```

## Grabar Audio del Sistema (Loopback)

Windows 10+ soporta grabacion loopback para capturar
el audio que sale por los altavoces.

```python
from basskit.constantes.bass import BASS_DEVICE_LOOPBACK
from basskit.estructuras.bass import BASS_DEVICEINFO

# Buscar dispositivo loopback
info = BASS_DEVICEINFO()
i = 0
loopback_idx = -1
while bass.BASS_RecordGetDeviceInfo(i, ctypes.byref(info)):
    if info.flags & BASS_DEVICE_LOOPBACK:
        loopback_idx = i
        break
    i += 1

# Usar loopback para grabar
bass.BASS_RecordInit(loopback_idx)
rec = bass.BASS_RecordStart(44100, 2, BASS_SAMPLE_FLOAT, None, None)
```

## Formatos de Exportacion

| Formato | Funcion | Opciones |
|---------|---------|----------|
| MP3 | BASS_Encode_MP3_StartFile | `--preset standard`, `-b 320` |
| FLAC | BASS_Encode_FLAC_StartFile | `-5` (compresion 0-8) |
| OGG | BASS_Encode_OGG_StartFile | `-q 6` (calidad 0-10) |
| Opus | BASS_Encode_OPUS_StartFile | `--bitrate 128` |
| WAV | BASS_Encode_StartPCMFile | (sin opciones) |
