/
/
/
1"""Constants for the Squeezelite player provider."""
2
3from __future__ import annotations
4
5from dataclasses import dataclass
6
7from aioslimproto.client import PlayerState as SlimPlayerState
8from aioslimproto.models import VisualisationType as SlimVisualisationType
9from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption
10from music_assistant_models.enums import ConfigEntryType, PlaybackState, RepeatMode
11
12CONF_CLI_TELNET_PORT = "cli_telnet_port"
13CONF_CLI_JSON_PORT = "cli_json_port"
14CONF_DISCOVERY = "discovery"
15CONF_PORT = "port"
16DEFAULT_SLIMPROTO_PORT = 3483
17CONF_DISPLAY = "display"
18CONF_VISUALIZATION = "visualization"
19
20DEFAULT_PLAYER_VOLUME = 20
21DEFAULT_VISUALIZATION = SlimVisualisationType.NONE
22
23# sync constants
24MIN_DEVIATION_ADJUST = 8 # 5 milliseconds
25MIN_REQ_PLAYPOINTS = 8 # we need at least 8 measurements
26DEVIATION_JUMP_IGNORE = 500 # ignore a sudden unrealistic jump
27MAX_SKIP_AHEAD_MS = 800 # 0.8 seconds
28
29STATE_MAP = {
30 SlimPlayerState.BUFFERING: PlaybackState.PLAYING,
31 SlimPlayerState.BUFFER_READY: PlaybackState.PLAYING,
32 SlimPlayerState.PAUSED: PlaybackState.PAUSED,
33 SlimPlayerState.PLAYING: PlaybackState.PLAYING,
34 SlimPlayerState.STOPPED: PlaybackState.IDLE,
35}
36
37REPEATMODE_MAP = {RepeatMode.OFF: 0, RepeatMode.ONE: 1, RepeatMode.ALL: 2}
38
39CONF_ENTRY_DISPLAY = ConfigEntry(
40 key=CONF_DISPLAY,
41 type=ConfigEntryType.BOOLEAN,
42 default_value=False,
43 required=False,
44 advanced=True,
45)
46CONF_ENTRY_VISUALIZATION = ConfigEntry(
47 key=CONF_VISUALIZATION,
48 type=ConfigEntryType.STRING,
49 default_value=DEFAULT_VISUALIZATION,
50 options=[
51 ConfigValueOption(x.value, title=x.name.replace("_", " ").title())
52 for x in SlimVisualisationType
53 ],
54 required=False,
55 advanced=True,
56 depends_on=CONF_DISPLAY,
57)
58
59
60@dataclass
61class SyncPlayPoint:
62 """Simple structure to describe a Sync Playpoint."""
63
64 timestamp: float
65 sync_master: str
66 diff: int
67