feat: Implement host system volume control and update player service to use it
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user