# -*- coding: utf-8 -*-
"""Ejemplo 08: Mezclador multicanal con BASSmix."""

import sys
import time
import ctypes
from basskit.dlls.bass import bass
from basskit.dlls.bassmix import bassmix
from basskit.constantes.bass import BASS_STREAM_DECODE, BASS_UNICODE, BASS_ATTRIB_VOL
from basskit.constantes.bassmix import BASS_MIXER_NONSTOP, BASS_MIXER_BUFFER


def main():
	print("=== Mezclador Multicanal (BASSmix) ===\n")

	if len(sys.argv) < 3:
		print("Uso: python 08_mezclador.py <archivo1> <archivo2>")
		print("  Mezcla dos archivos de audio simultaneamente.")
		return

	bass.BASS_Init(-1, 44100, 0, 0, None)

	# Crear streams de decodificacion
	streams = []
	for ruta in sys.argv[1:3]:
		ruta_b = ruta.encode("utf-16-le") + b"\x00\x00"
		s = bass.BASS_StreamCreateFile(0, ruta_b, 0, 0, BASS_STREAM_DECODE | BASS_UNICODE)
		if s == 0:
			print(f"Error abriendo '{ruta}': {bass.BASS_ErrorGetCode()}")
			bass.BASS_Free()
			return
		streams.append(s)
		print(f"Cargado: {ruta}")

	# Crear mezclador
	mixer = bassmix.BASS_Mixer_StreamCreate(44100, 2, BASS_MIXER_NONSTOP)
	if mixer == 0:
		print(f"Error creando mixer: {bass.BASS_ErrorGetCode()}")
		bass.BASS_Free()
		return

	# Agregar fuentes
	for s in streams:
		bassmix.BASS_Mixer_StreamAddChannel(mixer, s, BASS_MIXER_BUFFER)

	bass.BASS_ChannelPlay(mixer, 0)
	print(f"\nMezclando {len(streams)} fuentes...\n")

	# Demostrar control de volumen individual
	print("[1/3] Ambas fuentes al 100% - 4 seg")
	time.sleep(4)

	print("[2/3] Fuente 1 al 30%, Fuente 2 al 100% - 4 seg")
	bass.BASS_ChannelSetAttribute(streams[0], BASS_ATTRIB_VOL, 0.3)
	time.sleep(4)

	print("[3/3] Fuente 1 al 100%, Fuente 2 al 30% - 4 seg")
	bass.BASS_ChannelSetAttribute(streams[0], BASS_ATTRIB_VOL, 1.0)
	bass.BASS_ChannelSetAttribute(streams[1], BASS_ATTRIB_VOL, 0.3)
	time.sleep(4)

	# Limpiar
	bass.BASS_StreamFree(mixer)
	bass.BASS_Free()
	print("\nFin del ejemplo.")


if __name__ == "__main__":
	main()
