diff --git a/supervisor/audio.py b/supervisor/audio.py index d7817662f..0ffd7b9f2 100644 --- a/supervisor/audio.py +++ b/supervisor/audio.py @@ -3,12 +3,12 @@ import asyncio from contextlib import suppress import logging from pathlib import Path -from typing import Awaitable, Optional import shutil +from typing import Awaitable, List, Optional import jinja2 -from .const import ATTR_VERSION, FILE_HASSIO_AUDIO +from .const import ATTR_VERSION, FILE_HASSIO_AUDIO, STATE_STARTED from .coresys import CoreSys, CoreSysAttributes from .docker.audio import DockerAudio from .docker.stats import DockerStats @@ -157,6 +157,8 @@ class Audio(JsonConfig, CoreSysAttributes): _LOGGER.error("Can't start Audio plugin") raise AudioError() from None + await self._restart_audio_addons() + async def start(self) -> None: """Run CoreDNS.""" # Start Instance @@ -167,6 +169,8 @@ class Audio(JsonConfig, CoreSysAttributes): _LOGGER.error("Can't start Audio plugin") raise AudioError() from None + await self._restart_audio_addons() + def logs(self) -> Awaitable[bytes]: """Get CoreDNS docker logs. @@ -217,3 +221,22 @@ class Audio(JsonConfig, CoreSysAttributes): default_source=input_profile, default_sink=output_profile, ) + + async def _restart_audio_addons(self): + """Restart all Add-ons they can be connect to unix socket.""" + tasks: List[Awaitable[None]] = [] + + # Find all Add-ons running with audio + for addon in self.sys_addons.installed: + if not addon.with_audio: + continue + if await addon.state() != STATE_STARTED: + continue + tasks.append(addon.restart()) + + if not tasks: + return + + # restart + _LOGGER.info("Restart all Add-ons attach to pulse server: %d", len(tasks)) + await asyncio.wait(tasks)