add sound info
This commit is contained in:
parent
4d67ddcc9b
commit
d9e87b2804
16
app_new.py
16
app_new.py
@ -1,10 +1,26 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from PySide6.QtCore import QSettings
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
|
|
||||||
|
import build_info
|
||||||
|
from audio.system_volume import set_volume
|
||||||
from ui.main_window_new import MainWindowNew
|
from ui.main_window_new import MainWindowNew
|
||||||
|
|
||||||
|
|
||||||
def run_app_new():
|
def run_app_new():
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
_apply_startup_volume()
|
||||||
window = MainWindowNew(app)
|
window = MainWindowNew(app)
|
||||||
window.show()
|
window.show()
|
||||||
sys.exit(app.exec())
|
sys.exit(app.exec())
|
||||||
|
|
||||||
|
|
||||||
|
def _apply_startup_volume():
|
||||||
|
settings = QSettings("car_ui", "ui")
|
||||||
|
raw = settings.value("sound/base_volume", build_info.DEFAULT_SOUND_VOLUME)
|
||||||
|
try:
|
||||||
|
value = int(raw)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
value = build_info.DEFAULT_SOUND_VOLUME
|
||||||
|
set_volume(value)
|
||||||
|
|||||||
1
audio/__init__.py
Normal file
1
audio/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""Audio helpers."""
|
||||||
24
audio/system_volume.py
Normal file
24
audio/system_volume.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
def set_volume(value: int):
|
||||||
|
value = max(0, min(100, value))
|
||||||
|
if shutil.which("wpctl"):
|
||||||
|
_run_cmd(["wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", f"{value}%"])
|
||||||
|
return
|
||||||
|
if shutil.which("amixer"):
|
||||||
|
_run_cmd(["amixer", "sset", "PCM", f"{value}%"])
|
||||||
|
|
||||||
|
|
||||||
|
def _run_cmd(args: list[str]):
|
||||||
|
try:
|
||||||
|
subprocess.run(
|
||||||
|
args,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=1,
|
||||||
|
check=False,
|
||||||
|
)
|
||||||
|
except (OSError, subprocess.SubprocessError):
|
||||||
|
pass
|
||||||
@ -9,6 +9,7 @@ VERSION = "0.1.0-dev"
|
|||||||
BUILD_DATE = "dev"
|
BUILD_DATE = "dev"
|
||||||
GIT_HASH = "dev"
|
GIT_HASH = "dev"
|
||||||
DEVICE_MODEL = "Raspberry Pi"
|
DEVICE_MODEL = "Raspberry Pi"
|
||||||
|
DEFAULT_SOUND_VOLUME = 100
|
||||||
|
|
||||||
|
|
||||||
def get_device_model() -> str:
|
def get_device_model() -> str:
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from PySide6.QtCore import Qt, QSettings
|
from PySide6.QtCore import Qt, QSettings, QTimer
|
||||||
from PySide6.QtGui import QFont
|
from PySide6.QtGui import QFont
|
||||||
from PySide6.QtWidgets import (
|
from PySide6.QtWidgets import (
|
||||||
QWidget,
|
QWidget,
|
||||||
@ -11,6 +11,8 @@ from PySide6.QtWidgets import (
|
|||||||
QScrollArea,
|
QScrollArea,
|
||||||
QScroller,
|
QScroller,
|
||||||
)
|
)
|
||||||
|
from audio.system_volume import set_volume
|
||||||
|
import build_info
|
||||||
|
|
||||||
|
|
||||||
class SoundScreen(QWidget):
|
class SoundScreen(QWidget):
|
||||||
@ -18,6 +20,10 @@ class SoundScreen(QWidget):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self._on_eq = on_eq
|
self._on_eq = on_eq
|
||||||
self._settings = QSettings("car_ui", "ui")
|
self._settings = QSettings("car_ui", "ui")
|
||||||
|
self._pending_volume: int | None = None
|
||||||
|
self._volume_apply_timer = QTimer(self)
|
||||||
|
self._volume_apply_timer.setSingleShot(True)
|
||||||
|
self._volume_apply_timer.timeout.connect(self._flush_volume)
|
||||||
|
|
||||||
root = QVBoxLayout(self)
|
root = QVBoxLayout(self)
|
||||||
root.setContentsMargins(0, 0, 0, 0)
|
root.setContentsMargins(0, 0, 0, 0)
|
||||||
@ -57,9 +63,21 @@ class SoundScreen(QWidget):
|
|||||||
def _read_bool(self, key: str, default: bool) -> bool:
|
def _read_bool(self, key: str, default: bool) -> bool:
|
||||||
return _read_bool_setting(self._settings, key, default)
|
return _read_bool_setting(self._settings, key, default)
|
||||||
|
|
||||||
|
def _queue_volume_apply(self, value: int):
|
||||||
|
self._pending_volume = value
|
||||||
|
self._volume_apply_timer.start(120)
|
||||||
|
|
||||||
|
def _flush_volume(self):
|
||||||
|
if self._pending_volume is None:
|
||||||
|
return
|
||||||
|
self._set_system_volume(self._pending_volume)
|
||||||
|
|
||||||
|
def _set_system_volume(self, value: int):
|
||||||
|
set_volume(value)
|
||||||
|
|
||||||
def _build_volume_card(self) -> QWidget:
|
def _build_volume_card(self) -> QWidget:
|
||||||
card, body = _card("Громкость")
|
card, body = _card("Громкость")
|
||||||
default_value = 60
|
default_value = build_info.DEFAULT_SOUND_VOLUME
|
||||||
value = self._read_int("sound/base_volume", default_value)
|
value = self._read_int("sound/base_volume", default_value)
|
||||||
row, slider, value_label = _slider_row(
|
row, slider, value_label = _slider_row(
|
||||||
"Базовая громкость",
|
"Базовая громкость",
|
||||||
@ -71,6 +89,7 @@ class SoundScreen(QWidget):
|
|||||||
slider.valueChanged.connect(
|
slider.valueChanged.connect(
|
||||||
lambda v: self._settings.setValue("sound/base_volume", v)
|
lambda v: self._settings.setValue("sound/base_volume", v)
|
||||||
)
|
)
|
||||||
|
slider.valueChanged.connect(self._queue_volume_apply)
|
||||||
body.addWidget(row)
|
body.addWidget(row)
|
||||||
return card
|
return card
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user