Enhance volume management in entity.py

Added initial volume parameter and volume control methods.
This commit is contained in:
Omar Amin authored and GitHub committed 2026-02-21 16:26:13 +02:00
1 parent ac69618d29
commit 0d34e67823
1 file changed
+41 -1
+41 -1
View File
@@ -58,6 +58,8 @@ class MediaPlayerEntity(ESPHomeEntity):
object_id: str,
music_player: MpvMediaPlayer,
announce_player: MpvMediaPlayer,
initial_volume: float = 1.0,
on_volume_changed: Optional[Callable[[float], None]] = None,
) -> None:
ESPHomeEntity.__init__(self, server)
@@ -65,11 +67,13 @@ class MediaPlayerEntity(ESPHomeEntity):
self.name = name
self.object_id = object_id
self.state = MediaPlayerState.IDLE
self.volume = 1.0
self.volume = max(0.0, min(1.0, initial_volume))
self.muted = False
self.previous_volume = 1.0
self.music_player = music_player
self.announce_player = announce_player
self._on_volume_changed = on_volume_changed
self.apply_volume_from_state(initial_volume)
self._log = logging.getLogger(f"{self.__class__.__name__}[{self.key}]")
def play(
@@ -197,6 +201,42 @@ class MediaPlayerEntity(ESPHomeEntity):
muted=self.muted,
)
def apply_volume_from_state(self, volume: float) -> None:
"""Synchronize the local volume with the stored state without persisting."""
clamped = max(0.0, min(1.0, float(volume)))
if self.muted:
self.previous_volume = clamped
return
self._apply_volume(clamped, persist=False)
def set_volume_callback(self, callback: Optional[Callable[[float], None]]) -> None:
"""Update the callback invoked when the volume changes."""
self._on_volume_changed = callback
def _apply_volume(
self,
volume: float,
*,
persist: bool,
remember: bool = True,
) -> None:
normalized = max(0.0, min(1.0, float(volume)))
volume_percent = int(round(normalized * 100))
self.music_player.set_volume(volume_percent)
self.announce_player.set_volume(volume_percent)
self.volume = normalized
if remember:
self.previous_volume = normalized
if self._on_volume_changed and persist:
self._on_volume_changed(normalized)
# -----------------------------------------------------------------------------