77 lines
2.7 KiB
Python
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() |