# -*- coding: utf-8 -*-
"""Ejemplo 09: Grabacion de audio a archivo WAV."""

import struct
import time
from basskit.alto_nivel import inicializar, liberar
from basskit.alto_nivel.grabador import Grabador


def guardar_wav(ruta: str, datos_pcm: bytes, frecuencia=44100, canales=2, bits=16):
	"""Guarda datos PCM como archivo WAV."""
	tamano = len(datos_pcm)
	bytes_muestra = bits // 8
	bloque = canales * bytes_muestra
	tasa = frecuencia * bloque

	with open(ruta, "wb") as f:
		f.write(b"RIFF")
		f.write(struct.pack("<I", 36 + tamano))
		f.write(b"WAVE")
		f.write(b"fmt ")
		f.write(struct.pack("<IHHIIHH", 16, 1, canales, frecuencia, tasa, bloque, bits))
		f.write(b"data")
		f.write(struct.pack("<I", tamano))
		f.write(datos_pcm)


def main():
	print("=== Grabacion de Audio ===\n")
	inicializar()

	grabador = Grabador()

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

	# Grabar 5 segundos
	print("\nGrabando 5 segundos desde dispositivo por defecto...")
	grabador.inicializar()
	grabador.iniciar_grabacion(frecuencia=44100, canales=2)

	for i in range(5, 0, -1):
		print(f"  {i}...")
		time.sleep(1)

	datos = grabador.detener_grabacion()
	print(f"\nGrabados {len(datos)} bytes de audio PCM")

	# Guardar como WAV
	archivo_wav = "grabacion_ejemplo.wav"
	guardar_wav(archivo_wav, datos)
	print(f"Guardado en: {archivo_wav}")

	grabador.liberar()
	liberar()
	print("\nFin del ejemplo.")


if __name__ == "__main__":
	main()
