ProyectoPSP/audio_player_logic.py

72 lines
2.7 KiB
Python

import pygame as pg
from tkinter import messagebox
import os
class MusicPlayer:
def __init__(self, root_app):
self.root_app = root_app
self.current_file = None
self.is_playing = False
try:
# Inicializar el mezclador de Pygame.
# Frecuencia, tamaño de bits, canales, y tamaño del buffer (menor buffer = menor latencia)
pg.mixer.init(frequency=44100, size=-16, channels=2, buffer=512)
except pg.error as e:
messagebox.showerror("Error de Audio", f"No se pudo inicializar Pygame Mixer. Asegúrate de tener hardware de audio: {e}")
def load_and_play(self, filepath):
"""Carga un archivo de música y comienza la reproducción."""
if not os.path.exists(filepath):
messagebox.showerror("Error de Archivo", "El archivo de música no se encuentra.")
return
try:
# Detener cualquier reproducción actual
pg.mixer.music.stop()
# Cargar el nuevo archivo
pg.mixer.music.load(filepath)
self.current_file = filepath
# Reproducir la música en bucle (-1)
pg.mixer.music.play(-1)
self.is_playing = True
self.root_app.after(0, self.root_app.update_audio_status, f"Reproduciendo: {os.path.basename(filepath)}")
return True
except pg.error as e:
messagebox.showerror("Error de Reproducción", f"No se pudo reproducir el archivo: {e}")
self.is_playing = False
return False
def pause_music(self):
"""Pausa la música si está reproduciéndose."""
if self.is_playing and pg.mixer.music.get_busy():
pg.mixer.music.pause()
self.is_playing = False
self.root_app.after(0, self.root_app.update_audio_status, "Música: Pausada")
return True
return False
def unpause_music(self):
"""Reanuda la música si está en pausa."""
if not self.is_playing and self.current_file:
pg.mixer.music.unpause()
self.is_playing = True
self.root_app.after(0, self.root_app.update_audio_status, f"Reproduciendo: {os.path.basename(self.current_file)}")
return True
return False
def stop_music(self):
"""Detiene completamente la música y libera el recurso."""
if pg.mixer.music.get_busy():
pg.mixer.music.stop()
self.is_playing = False
self.current_file = None
self.root_app.after(0, self.root_app.update_audio_status, "Música: Detenida")
return True
return False
# Fin de audio_player_logic.py