Close #3 Implement a loop functionality for audio samples
This commit is contained in:
@@ -19,8 +19,7 @@ from PyQt5.QtGui import QPixmap
|
|||||||
from PyQt5 import uic
|
from PyQt5 import uic
|
||||||
from PyQt5.QtCore import (QFileInfo,
|
from PyQt5.QtCore import (QFileInfo,
|
||||||
Qt,
|
Qt,
|
||||||
pyqtSlot,
|
pyqtSlot,)
|
||||||
QRect,)
|
|
||||||
|
|
||||||
from audio_player import AudioPlayer
|
from audio_player import AudioPlayer
|
||||||
from weatherdata import SpaceWeatherData, ForecastData
|
from weatherdata import SpaceWeatherData, ForecastData
|
||||||
@@ -494,6 +493,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
|
|||||||
self.pause,
|
self.pause,
|
||||||
self.stop,
|
self.stop,
|
||||||
self.volume,
|
self.volume,
|
||||||
|
self.loop,
|
||||||
self.audio_progress,
|
self.audio_progress,
|
||||||
self.active_color,
|
self.active_color,
|
||||||
self.inactive_color
|
self.inactive_color
|
||||||
|
|||||||
176
src/artemis.ui
176
src/artemis.ui
@@ -9177,8 +9177,8 @@ STORM</string>
|
|||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QGridLayout" name="gridLayout_11">
|
||||||
<item>
|
<item row="0" column="0">
|
||||||
<widget class="QWidget" name="audio_widget" native="true">
|
<widget class="QWidget" name="audio_widget" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
@@ -9199,7 +9199,101 @@ QPushButton {
|
|||||||
}</string>
|
}</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
<item row="3" column="0" colspan="3">
|
<item row="0" column="0">
|
||||||
|
<widget class="QPushButton" name="play">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QPushButton" name="pause">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QPushButton" name="stop">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="3">
|
||||||
|
<widget class="QPushButton" name="loop">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="4">
|
||||||
<widget class="QProgressBar" name="audio_progress">
|
<widget class="QProgressBar" name="audio_progress">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@@ -9227,79 +9321,7 @@ QPushButton {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="1" column="0" colspan="4">
|
||||||
<widget class="QPushButton" name="play">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>70</width>
|
|
||||||
<height>70</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QPushButton" name="pause">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>70</width>
|
|
||||||
<height>70</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2">
|
|
||||||
<widget class="QPushButton" name="stop">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>70</width>
|
|
||||||
<height>70</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0" colspan="3">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="volume_label">
|
<widget class="QLabel" name="volume_label">
|
||||||
@@ -9368,7 +9390,7 @@ QSlider::handle:horizontal {
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="spectrogram">
|
<widget class="QLabel" name="spectrogram">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
|||||||
@@ -19,17 +19,21 @@ class AudioPlayer(QObject):
|
|||||||
pause,
|
pause,
|
||||||
stop,
|
stop,
|
||||||
volume,
|
volume,
|
||||||
|
loop,
|
||||||
audio_progress,
|
audio_progress,
|
||||||
active_color,
|
active_color,
|
||||||
inactive_color):
|
inactive_color):
|
||||||
"""Initialize the player."""
|
"""Initialize the player."""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
self._active_color = active_color
|
||||||
|
self._inactive_color = inactive_color
|
||||||
self._paused = False
|
self._paused = False
|
||||||
self._first_call = True
|
self._first_call = True
|
||||||
self._play = play
|
self._play = play
|
||||||
self._pause = pause
|
self._pause = pause
|
||||||
self._stop = stop
|
self._stop = stop
|
||||||
self._volume = volume
|
self._volume = volume
|
||||||
|
self._loop = loop
|
||||||
self._audio_progress = audio_progress
|
self._audio_progress = audio_progress
|
||||||
self._audio_file = None
|
self._audio_file = None
|
||||||
self._timer = QTimer()
|
self._timer = QTimer()
|
||||||
@@ -38,22 +42,45 @@ class AudioPlayer(QObject):
|
|||||||
self._pause.clicked.connect(self._pause_audio)
|
self._pause.clicked.connect(self._pause_audio)
|
||||||
self._stop.clicked.connect(self._stop_audio)
|
self._stop.clicked.connect(self._stop_audio)
|
||||||
self._volume.valueChanged.connect(self._set_volume)
|
self._volume.valueChanged.connect(self._set_volume)
|
||||||
|
self._loop.clicked.connect(self._set_loop_icon)
|
||||||
self._play.setIconSize(self._play.size())
|
self._play.setIconSize(self._play.size())
|
||||||
self._pause.setIconSize(self._pause.size())
|
self._pause.setIconSize(self._pause.size())
|
||||||
self._stop.setIconSize(self._stop.size())
|
self._stop.setIconSize(self._stop.size())
|
||||||
|
self._loop.setIconSize(self._loop.size())
|
||||||
self.refresh_btns_colors(active_color, inactive_color)
|
self.refresh_btns_colors(active_color, inactive_color)
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def _set_loop_icon(self):
|
||||||
|
"""Set the icon for the loop audio button."""
|
||||||
|
if self._loop.isChecked():
|
||||||
|
loop_icon = qta.icon(
|
||||||
|
'fa5s.redo-alt',
|
||||||
|
color=self._active_color,
|
||||||
|
color_disabled=self._inactive_color,
|
||||||
|
animation=qta.Spin(self._loop)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
loop_icon = qta.icon(
|
||||||
|
'fa5s.redo-alt',
|
||||||
|
color=self._active_color,
|
||||||
|
color_disabled=self._inactive_color
|
||||||
|
)
|
||||||
|
self._loop.setIcon(loop_icon)
|
||||||
|
|
||||||
def refresh_btns_colors(self, active_color, inactive_color):
|
def refresh_btns_colors(self, active_color, inactive_color):
|
||||||
"""Repaint the buttons of the widgetd after the theme has changed."""
|
"""Repaint the buttons of the widgetd after the theme has changed."""
|
||||||
self._play.setIcon(qta.icon('fa5.play-circle',
|
self._active_color = active_color
|
||||||
|
self._inactive_color = inactive_color
|
||||||
|
self._play.setIcon(qta.icon('fa5s.play',
|
||||||
color=active_color,
|
color=active_color,
|
||||||
color_disabled=inactive_color))
|
color_disabled=inactive_color))
|
||||||
self._pause.setIcon(qta.icon('fa5.pause-circle',
|
self._pause.setIcon(qta.icon('fa5s.pause',
|
||||||
color=active_color,
|
color=active_color,
|
||||||
color_disabled=inactive_color))
|
color_disabled=inactive_color))
|
||||||
self._stop.setIcon(qta.icon('fa5.stop-circle',
|
self._stop.setIcon(qta.icon('fa5s.stop',
|
||||||
color=active_color,
|
color=active_color,
|
||||||
color_disabled=inactive_color))
|
color_disabled=inactive_color))
|
||||||
|
self._set_loop_icon()
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def _set_volume(self):
|
def _set_volume(self):
|
||||||
@@ -71,8 +98,7 @@ class AudioPlayer(QObject):
|
|||||||
self._timer.stop()
|
self._timer.stop()
|
||||||
mixer.quit()
|
mixer.quit()
|
||||||
self._audio_progress.reset()
|
self._audio_progress.reset()
|
||||||
self._enable_buttons(False, False, False)
|
self._enable_buttons(False, False, False, False)
|
||||||
self._paused = False
|
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def _update_bar(self):
|
def _update_bar(self):
|
||||||
@@ -81,7 +107,11 @@ class AudioPlayer(QObject):
|
|||||||
if pos == -1:
|
if pos == -1:
|
||||||
self._timer.stop()
|
self._timer.stop()
|
||||||
self._audio_progress.reset()
|
self._audio_progress.reset()
|
||||||
self._enable_buttons(True, False, False)
|
if self._loop.isChecked():
|
||||||
|
self._play_audio()
|
||||||
|
self._enable_buttons(False, True, True)
|
||||||
|
else:
|
||||||
|
self._enable_buttons(True, False, False)
|
||||||
else:
|
else:
|
||||||
self._audio_progress.setValue(pos)
|
self._audio_progress.setValue(pos)
|
||||||
|
|
||||||
@@ -102,6 +132,7 @@ class AudioPlayer(QObject):
|
|||||||
)
|
)
|
||||||
if os.path.exists(full_name):
|
if os.path.exists(full_name):
|
||||||
self._play.setEnabled(True)
|
self._play.setEnabled(True)
|
||||||
|
self._loop.setEnabled(True)
|
||||||
self._audio_file = full_name
|
self._audio_file = full_name
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
@@ -137,8 +168,9 @@ class AudioPlayer(QObject):
|
|||||||
self._paused = True
|
self._paused = True
|
||||||
self._enable_buttons(True, False, False)
|
self._enable_buttons(True, False, False)
|
||||||
|
|
||||||
def _enable_buttons(self, play_en, pause_en, stop_en):
|
def _enable_buttons(self, play_en, pause_en, stop_en, loop_en=True):
|
||||||
"""Set the three buttons status."""
|
"""Set the three buttons status."""
|
||||||
self._play.setEnabled(play_en)
|
self._play.setEnabled(play_en)
|
||||||
self._pause.setEnabled(pause_en)
|
self._pause.setEnabled(pause_en)
|
||||||
self._stop.setEnabled(stop_en)
|
self._stop.setEnabled(stop_en)
|
||||||
|
self._loop.setEnabled(loop_en)
|
||||||
|
|||||||
Reference in New Issue
Block a user