|
@@ -43,6 +43,9 @@ class PlayerPanel(QWidget):
|
|
|
self.settings = QSettings("TapeRecorder", "Player")
|
|
self.settings = QSettings("TapeRecorder", "Player")
|
|
|
self._init_ui()
|
|
self._init_ui()
|
|
|
|
|
|
|
|
|
|
+ # Init volume
|
|
|
|
|
+ self.player.output_volume = self.settings.value("volume", 100, type=int) / 100.0
|
|
|
|
|
+
|
|
|
# Connect player callbacks
|
|
# Connect player callbacks
|
|
|
# Note: These are called from the audio thread.
|
|
# Note: These are called from the audio thread.
|
|
|
# For thread safety, we use a QTimer to poll state instead of direct signals.
|
|
# For thread safety, we use a QTimer to poll state instead of direct signals.
|
|
@@ -121,6 +124,20 @@ class PlayerPanel(QWidget):
|
|
|
btn_layout.addWidget(self.stop_btn)
|
|
btn_layout.addWidget(self.stop_btn)
|
|
|
btn_layout.addWidget(self.norm_cb)
|
|
btn_layout.addWidget(self.norm_cb)
|
|
|
btn_layout.addWidget(QLabel(" | "))
|
|
btn_layout.addWidget(QLabel(" | "))
|
|
|
|
|
+
|
|
|
|
|
+ self.vol_slider = QSlider(Qt.Orientation.Horizontal)
|
|
|
|
|
+ self.vol_slider.setRange(0, 200)
|
|
|
|
|
+ self.vol_slider.setValue(self.settings.value("volume", 100, type=int))
|
|
|
|
|
+ self.vol_slider.setFixedWidth(100)
|
|
|
|
|
+ self.vol_slider.valueChanged.connect(self._on_vol_changed)
|
|
|
|
|
+
|
|
|
|
|
+ self.vol_lbl = QLabel(f"Vol: {self.vol_slider.value()}%")
|
|
|
|
|
+ self.vol_lbl.setFixedWidth(70)
|
|
|
|
|
+
|
|
|
|
|
+ btn_layout.addWidget(self.vol_lbl)
|
|
|
|
|
+ btn_layout.addWidget(self.vol_slider)
|
|
|
|
|
+ btn_layout.addWidget(QLabel(" | "))
|
|
|
|
|
+
|
|
|
btn_layout.addWidget(self.speed_lbl)
|
|
btn_layout.addWidget(self.speed_lbl)
|
|
|
btn_layout.addWidget(self.speed_slider)
|
|
btn_layout.addWidget(self.speed_slider)
|
|
|
btn_layout.addStretch()
|
|
btn_layout.addStretch()
|
|
@@ -298,6 +315,11 @@ class PlayerPanel(QWidget):
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
self.file_lbl.setText(f"Error loading file: {e}")
|
|
self.file_lbl.setText(f"Error loading file: {e}")
|
|
|
|
|
|
|
|
|
|
+ def _on_vol_changed(self, value):
|
|
|
|
|
+ self.vol_lbl.setText(f"Vol: {value}%")
|
|
|
|
|
+ self.settings.setValue("volume", value)
|
|
|
|
|
+ self.player.output_volume = value / 100.0
|
|
|
|
|
+
|
|
|
def play_next_track(self):
|
|
def play_next_track(self):
|
|
|
if self.playlist and self.current_track_index < len(self.playlist) - 1:
|
|
if self.playlist and self.current_track_index < len(self.playlist) - 1:
|
|
|
self.current_track_index += 1
|
|
self.current_track_index += 1
|