# -*- coding: utf-8 -*-
"""Ejemplo 21: Audio 3D (posicionamiento espacial)."""

import sys
import time
import math
import ctypes
from basskit.dlls.bass import bass
from basskit.constantes.bass import BASS_UNICODE, BASS_SAMPLE_MONO, BASS_SAMPLE_3D
from basskit.estructuras.bass import BASS_3DVECTOR


def main():
	print("=== Audio 3D (posicionamiento espacial) ===\n")
	if len(sys.argv) < 2:
		print("Uso: python 21_audio_3d.py <archivo_audio_mono>")
		print("  (El archivo debe ser mono para 3D)")
		return

	# Inicializar con soporte 3D
	bass.BASS_Init(-1, 44100, 4, 0, None)  # 4 = BASS_DEVICE_3D
	ruta = sys.argv[1].encode("utf-16-le") + b"\x00\x00"

	stream = bass.BASS_StreamCreateFile(0, ruta, 0, 0, BASS_UNICODE | BASS_SAMPLE_MONO | BASS_SAMPLE_3D)
	if stream == 0:
		print(f"Error: {bass.BASS_ErrorGetCode()}")
		print("Nota: El archivo debe ser mono para audio 3D.")
		bass.BASS_Free()
		return

	# Posicionar fuente a la derecha
	pos = BASS_3DVECTOR(5.0, 0.0, 0.0)
	vel = BASS_3DVECTOR(0.0, 0.0, 0.0)
	bass.BASS_ChannelSet3DPosition(stream, ctypes.byref(pos), None, ctypes.byref(vel))
	bass.BASS_Apply3D()

	bass.BASS_ChannelPlay(stream, 0)
	print(f"Reproduciendo: {sys.argv[1]}")
	print("La fuente de sonido girara alrededor del oyente.\n")

	# Girar la fuente alrededor del oyente
	for angulo in range(0, 360, 5):
		rad = math.radians(angulo)
		x = math.sin(rad) * 5.0
		z = math.cos(rad) * 5.0
		pos.x = x
		pos.z = z
		bass.BASS_ChannelSet3DPosition(stream, ctypes.byref(pos), None, None)
		bass.BASS_Apply3D()

		lado = ""
		if x > 1: lado = "DERECHA"
		elif x < -1: lado = "IZQUIERDA"
		elif z > 1: lado = "FRENTE"
		elif z < -1: lado = "ATRAS"
		else: lado = "CENTRO"

		print(f"\r  Angulo: {angulo:3d} grados  X={x:+.1f} Z={z:+.1f}  [{lado:10s}]", end="", flush=True)
		time.sleep(0.08)

	print("\n")
	bass.BASS_StreamFree(stream)
	bass.BASS_Free()
	print("Fin del ejemplo.")


if __name__ == "__main__":
	main()
