From 0af6a85049f1c9f89fed02eaae98bc86b584ea26 Mon Sep 17 00:00:00 2001 From: Jamin Date: Thu, 16 Apr 2026 05:14:58 -0500 Subject: [PATCH] Fix VOIP blocking call in event loop (#168331) --- homeassistant/components/voip/voip.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/voip/voip.py b/homeassistant/components/voip/voip.py index 6f6cf989d3b2..cea29417f13f 100644 --- a/homeassistant/components/voip/voip.py +++ b/homeassistant/components/voip/voip.py @@ -150,11 +150,6 @@ class PreRecordMessageProtocol(RtpDatagramProtocol): if self.transport is None: return - if self._audio_bytes is None: - # 16Khz, 16-bit mono audio message - file_path = Path(__file__).parent / self.file_name - self._audio_bytes = file_path.read_bytes() - if self._audio_task is None: self._audio_task = self.hass.async_create_background_task( self._play_message(), @@ -162,6 +157,11 @@ class PreRecordMessageProtocol(RtpDatagramProtocol): ) async def _play_message(self) -> None: + if self._audio_bytes is None: + _LOGGER.debug("Loading audio from file %s", self.file_name) + self._audio_bytes = await self._load_audio() + _LOGGER.debug("Read %s bytes", len(self._audio_bytes)) + await self.hass.async_add_executor_job( partial( self.send_audio, @@ -175,3 +175,8 @@ class PreRecordMessageProtocol(RtpDatagramProtocol): # Allow message to play again self._audio_task = None + + async def _load_audio(self) -> bytes: + # 16Khz, 16-bit mono audio message + file_path = Path(__file__).parent / self.file_name + return await self.hass.async_add_executor_job(file_path.read_bytes)