1 """Switch logic for loading/unloading pulseaudio loopback modules."""
3 from __future__
import annotations
8 from pulsectl
import Pulse, PulseError
9 import voluptuous
as vol
12 PLATFORM_SCHEMA
as SWITCH_PLATFORM_SCHEMA,
21 DOMAIN =
"pulseaudio_loopback"
23 _LOGGER = logging.getLogger(__name__)
25 CONF_SINK_NAME =
"sink_name"
26 CONF_SOURCE_NAME =
"source_name"
28 DEFAULT_NAME =
"paloopback"
31 IGNORED_SWITCH_WARN =
"Switch is already in the desired state. Ignoring."
33 PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend(
35 vol.Required(CONF_SINK_NAME): cv.string,
36 vol.Required(CONF_SOURCE_NAME): cv.string,
37 vol.Optional(CONF_HOST): cv.string,
38 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
39 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
47 add_entities: AddEntitiesCallback,
48 discovery_info: DiscoveryInfoType |
None =
None,
50 """Read in all of our configuration, and initialize the loopback switch."""
51 name = config.get(CONF_NAME)
52 sink_name = config.get(CONF_SINK_NAME)
53 source_name = config.get(CONF_SOURCE_NAME)
54 host = config.get(CONF_HOST)
55 port = config.get(CONF_PORT)
57 hass.data.setdefault(DOMAIN, {})
59 server_id = str.format(
"{0}:{1}", host, port)
62 connect_to_server = server_id
64 connect_to_server =
None
66 if server_id
in hass.data[DOMAIN]:
67 server = hass.data[DOMAIN][server_id]
69 server = Pulse(server=connect_to_server, connect=
False, threading_lock=
True)
70 hass.data[DOMAIN][server_id] = server
76 """Representation the presence or absence of a PA loopback module."""
78 def __init__(self, name, pa_server, sink_name, source_name):
79 """Initialize the Pulseaudio switch."""
90 for module
in self.
_pa_svr_pa_svr.module_list():
91 if module.name !=
"module-loopback":
94 if f
"sink={self._sink_name}" not in module.argument:
97 if f
"source={self._source_name}" not in module.argument:
109 """Return true when connected to server."""
110 return self.
_pa_svr_pa_svr.connected
114 """Return the name of the switch."""
115 return self.
_name_name
119 """Return true if device is on."""
123 """Turn the device on."""
125 self.
_pa_svr_pa_svr.module_load(
127 args=f
"sink={self._sink_name} source={self._source_name}",
130 _LOGGER.warning(IGNORED_SWITCH_WARN)
133 """Turn the device off."""
137 _LOGGER.warning(IGNORED_SWITCH_WARN)
140 """Refresh state in case an alternate process modified this data."""
def __init__(self, name, pa_server, sink_name, source_name)
None turn_off(self, **Any kwargs)
None turn_on(self, **Any kwargs)
def _get_module_idx(self)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)