# -*- coding: utf-8 -*-
"""Ejemplo 22: Vinculacion de canales (Link) y crossfade."""

import sys
import time
from basskit.dlls.bass import bass
from basskit.constantes.bass import BASS_UNICODE, BASS_ATTRIB_VOL


def main():
	print("=== Vinculacion de canales y Crossfade ===\n")
	if len(sys.argv) < 3:
		print("Uso: python 22_link_crossfade.py <archivo1> <archivo2>")
		return

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

	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_UNICODE)
		if s == 0:
			print(f"Error abriendo '{ruta}': {bass.BASS_ErrorGetCode()}")
			bass.BASS_Free()
			return
		streams.append(s)
		print(f"Cargado: {ruta}")

	s1, s2 = streams

	# === Demo 1: Link (play/stop sincronizado) ===
	print("\n--- Demo 1: Canales vinculados ---")
	bass.BASS_ChannelSetLink(s1, s2)
	print("Canales vinculados. Play en s1 inicia ambos.")
	bass.BASS_ChannelPlay(s1, 0)
	time.sleep(3)
	bass.BASS_ChannelStop(s1)  # Detiene ambos
	print("Stop en s1 detuvo ambos.")
	bass.BASS_ChannelRemoveLink(s1, s2)
	print("Canales desvinculados.")

	time.sleep(1)

	# === Demo 2: Crossfade manual ===
	print("\n--- Demo 2: Crossfade (5 seg) ---")
	bass.BASS_ChannelSetAttribute(s1, BASS_ATTRIB_VOL, 1.0)
	bass.BASS_ChannelSetAttribute(s2, BASS_ATTRIB_VOL, 0.0)
	bass.BASS_ChannelSetPosition(s1, 0, 0)
	bass.BASS_ChannelSetPosition(s2, 0, 0)
	bass.BASS_ChannelPlay(s1, 0)
	bass.BASS_ChannelPlay(s2, 0)

	print("Pista 1 al 100%, Pista 2 al 0%")

	# Crossfade: s1 baja, s2 sube, en 5 segundos
	bass.BASS_ChannelSlideAttribute(s1, BASS_ATTRIB_VOL, 0.0, 5000)
	bass.BASS_ChannelSlideAttribute(s2, BASS_ATTRIB_VOL, 1.0, 5000)

	for i in range(50):
		time.sleep(0.1)
		if not bass.BASS_ChannelIsSliding(s1, BASS_ATTRIB_VOL):
			break

	print("Crossfade completado: Pista 2 al 100%")
	time.sleep(3)

	for s in streams:
		bass.BASS_StreamFree(s)
	bass.BASS_Free()
	print("\nFin del ejemplo.")


if __name__ == "__main__":
	main()
