feat: Implement host system volume control and update player service to use it
Some checks failed
Backend CI / lint (push) Failing after 10s
Backend CI / test (push) Has been cancelled

This commit is contained in:
JSC
2025-09-27 03:33:11 +02:00
parent 0806d541f2
commit 4b8496d025
6 changed files with 375 additions and 58 deletions

View File

@@ -16,6 +16,7 @@ from app.models.sound_played import SoundPlayed
from app.repositories.playlist import PlaylistRepository
from app.repositories.sound import SoundRepository
from app.services.socket import socket_manager
from app.services.volume import volume_service
from app.utils.audio import get_sound_file_path
logger = get_logger(__name__)
@@ -46,8 +47,11 @@ class PlayerState:
"""Initialize player state."""
self.status: PlayerStatus = PlayerStatus.STOPPED
self.mode: PlayerMode = PlayerMode.CONTINUOUS
self.volume: int = 80
self.previous_volume: int = 80
# Initialize volume from host system or default to 80
host_volume = volume_service.get_volume()
self.volume: int = host_volume if host_volume is not None else 80
self.previous_volume: int = self.volume
self.current_sound_id: int | None = None
self.current_sound_index: int | None = None
self.current_sound_position: int = 0
@@ -153,8 +157,8 @@ class PlayerService:
)
self._position_thread.start()
# Set initial volume
self._player.audio_set_volume(self.state.volume)
# Set VLC to 100% volume - host volume is controlled separately
self._player.audio_set_volume(100)
logger.info("Player service started")
@@ -378,7 +382,7 @@ class PlayerService:
logger.debug("Seeked to position: %sms", position_ms)
async def set_volume(self, volume: int) -> None:
"""Set playback volume (0-100)."""
"""Set playback volume (0-100) by controlling host system volume."""
volume = max(0, min(100, volume)) # Clamp to valid range
# Store previous volume when muting (going from >0 to 0)
@@ -386,18 +390,30 @@ class PlayerService:
self.state.previous_volume = self.state.volume
self.state.volume = volume
self._player.audio_set_volume(volume)
# Control host system volume instead of VLC volume
if volume == 0:
# Mute the host system
volume_service.set_mute(muted=True)
else:
# Unmute and set host volume
if volume_service.is_muted():
volume_service.set_mute(muted=False)
volume_service.set_volume(volume)
# Keep VLC at 100% volume
self._player.audio_set_volume(100)
await self._broadcast_state()
logger.debug("Volume set to: %s", volume)
logger.debug("Host volume set to: %s", volume)
async def mute(self) -> None:
"""Mute the player (stores current volume as previous_volume)."""
"""Mute the host system (stores current volume as previous_volume)."""
if self.state.volume > 0:
await self.set_volume(0)
async def unmute(self) -> None:
"""Unmute the player (restores previous_volume)."""
"""Unmute the host system (restores previous_volume)."""
if self.state.volume == 0 and self.state.previous_volume > 0:
await self.set_volume(self.state.previous_volume)