diff --git a/audio_player.py b/audio_player.py index 118f603..0031ec2 100644 --- a/audio_player.py +++ b/audio_player.py @@ -1,68 +1,88 @@ import os import sys - -from PyQt5.QtCore import QUrl, QFileInfo -from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer +from pygame import mixer +from PyQt5.QtCore import QTimer class AudioPlayer(object): + """ + This is the audio player widget. The only public methods are the __init__ + method and set_audio_player, which loads the current file. Everything else + is managed internally. + """ + __time_step = 1000 def __init__(self, play, pause, stop, volume, audio_progress): - self.play = play - self.pause = pause - self.stop = stop - self.volume = volume - self.audio_progress = audio_progress - self.audio_file = None - self.player = QMediaPlayer() - self.player.setVolume(51) - self.player.durationChanged.connect(self.set_max_progress_bar) - self.player.positionChanged.connect(self.set_progress_bar) - self.play.clicked.connect(self.audio) - self.pause.clicked.connect(self.pause_audio) - self.stop.clicked.connect(self.stop_audio) - self.player.stateChanged.connect(self.reset_audio_widget) - self.volume.valueChanged.connect(self.set_volume) + mixer.init() + self.__paused = False + self.__play = play + self.__pause = pause + self.__stop = stop + self.__volume = volume + self.__audio_progress = audio_progress + self.__audio_file = None + self.__timer = QTimer() + self.__timer.timeout.connect(self.__update_bar) + self.__play.clicked.connect(self.__play_audio) + self.__pause.clicked.connect(self.__pause_audio) + self.__stop.clicked.connect(self.__stop_audio) + self.__volume.valueChanged.connect(self.__set_volume) - def set_volume(self): - self.player.setVolume(self.volume.value()) + def __set_volume(self): + mixer.music.set_volume(self.__volume.value() / self.__volume.maximum()) - def reset_audio_widget(self): - if self.player.state() == QMediaPlayer.StoppedState: - self.audio_progress.setValue(0) - self.volume.setValue(51) - self.pause.setEnabled(False) - self.stop.setEnabled(False) + def __reset_audio_widget(self): + self.__audio_progress.reset() + self.__volume.setValue(50) + self.__enable_buttons(False, False, False) + self.__paused = False + if mixer.music.get_busy(): + mixer.music.stop() + self.__timer.stop() - def set_max_progress_bar(self): - print(self.player.duration()) - self.audio_progress.setMaximum(self.player.duration()) + def __update_bar(self): + pos = mixer.music.get_pos() + if pos == -1: + self.__timer.stop() + self.__audio_progress.reset() + else: + self.__audio_progress.setValue(pos) - def set_progress_bar(self): - print(self.player.position()) - self.audio_progress.setValue(self.player.position()) - - def set_media_player(self): - self.player.setMedia(QMediaContent(self.audio_file)) + def __set_max_progress_bar(self): + self.__audio_progress.setMaximum( + mixer.Sound(self.__audio_file).get_length() * 1000 + ) def set_audio_player(self, fname): - self.reset_audio_widget() - self.play.setEnabled(False) - full_name = os.path.join('Data', 'Audio', fname + '.mp3') - if QFileInfo(full_name).exists(): - print('exists') - self.play.setEnabled(True) - self.audio_file = QUrl.fromLocalFile(full_name) - self.set_media_player() + self.__reset_audio_widget() + full_name = os.path.join('Data', 'Audio', fname + '.ogg') + if os.path.exists(full_name): + self.__play.setEnabled(True) + self.__audio_file = full_name + self.__set_max_progress_bar() + mixer.music.load(full_name) + mixer.music.set_volume(self.__volume.value()) + + def __play_audio(self): + if not self.__paused: + mixer.music.play() else: - print('not exists') + mixer.music.unpause() + self.__paused = False + self.__timer.start(self.__time_step) + self.__enable_buttons(False, True, True) - def audio(self): - self.player.play() - self.stop.setEnabled(True) - self.pause.setEnabled(True) + def __stop_audio(self): + mixer.music.stop() + self.__timer.stop() + self.__enable_buttons(True, False, False) - def stop_audio(self): - self.player.stop() + def __pause_audio(self): + mixer.music.pause() + self.__timer.stop() + self.__paused = True + self.__enable_buttons(True, False, False) - def pause_audio(self): - self.player.pause() + def __enable_buttons(self, play_en, pause_en, stop_en): + self.__play.setEnabled(play_en) + self.__pause.setEnabled(pause_en) + self.__stop.setEnabled(stop_en) diff --git a/main_window.ui b/main_window.ui index acf16ac..68e00b0 100644 --- a/main_window.ui +++ b/main_window.ui @@ -289,7 +289,7 @@ QPushButton:disabled { - 75 + 0 false @@ -416,13 +416,13 @@ QSlider::handle:horizontal { - 1 + 0 100 - 51 + 50 Qt::Horizontal