proyecto-global-psp/logica/T2/musicReproductor.py

77 lines
2.7 KiB
Python

# Módulo: logica/T2/musicReproductor.py
import vlc
import os
class MusicReproductor:
"""
Clase para gestionar la reproducción de audio utilizando la librería python-vlc.
Se asegura de que el objeto 'player' de VLC sea liberado y recreado correctamente
para poder manejar múltiples eventos de alarma o cambiar de stream de radio sin fallos.
"""
def __init__(self, initial_volume=50):
# 1. Crear la instancia de VLC, que debe ser única por aplicación.
self.instance = vlc.Instance()
# 2. Creamos el player inicial.
self.player = self.instance.media_player_new()
self.volumen = initial_volume
self.ajustar_volumen(initial_volume)
print(f"🎵 [VLC] Reproductor inicializado. Volumen: {self.volumen}")
def ajustar_volumen(self, valor):
"""Ajusta el volumen del reproductor."""
self.volumen = int(valor)
if self.player:
self.player.audio_set_volume(self.volumen)
def cargar_y_reproducir(self, url):
"""
Carga el archivo o stream y lo reproduce.
**Corrección:** Recrea self.player si fue liberado (release) por el método detener().
"""
print(f"🔄 [VLC] Intentando cargar y reproducir: {url}")
# 1. Recrear el reproductor si fue liberado.
if not self.player:
self.player = self.instance.media_player_new()
self.ajustar_volumen(self.volumen) # Restaurar volumen
# 2. Detener la reproducción actual de forma segura antes de cargar una nueva media.
# Esto previene el AttributeError, ya que self.player ahora está garantizado que no es None.
if self.player:
self.player.stop()
# 3. Cargar y reproducir la nueva media.
media = self.instance.media_new(url)
self.player.set_media(media)
if self.player.play() == 0:
print("✅ [VLC] Reproducción iniciada.")
else:
print("❌ [VLC] Error al intentar iniciar la reproducción.")
def detener(self):
"""
Detiene la reproducción, libera los recursos del player y lo establece a None.
Esto es crucial para que el sistema de audio no se quede bloqueado por VLC.
"""
if self.player:
self.player.stop()
self.player.release()
self.player = None # <--- Obliga a recrear el player en la próxima llamada a cargar_y_reproducir
print("⏹️ [VLC] Reproductor detenido y recursos liberados.")
def pausar(self):
"""Pausa la reproducción."""
if self.player and self.player.is_playing():
self.player.pause()
def reproducir(self):
"""Reanuda la reproducción."""
if self.player:
self.player.play()