Fix stop on stream end in AirPlay provider
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Nov 2025 00:07:54 +0000 (01:07 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Nov 2025 00:07:54 +0000 (01:07 +0100)
music_assistant/helpers/process.py
music_assistant/providers/airplay/stream_session.py

index 394fe4adddbce2fd1bd1abd1dc82791efe048f18..bbbb49cd78c836ab1ed35265f2261b53138484ec 100644 (file)
@@ -170,6 +170,7 @@ class AsyncProcess:
             try:
                 if self.proc.stdin.can_write_eof():
                     self.proc.stdin.write_eof()
+                await self.proc.stdin.drain()
             except (
                 AttributeError,
                 AssertionError,
index 7660487724f72135d05978d3ec9dc71da3ebb386..5ebb9c2fb39d55f5b70d67a2f76f13b084fdce70 100644 (file)
@@ -136,10 +136,11 @@ class AirPlayStreamSession:
         assert airplay_player.stream.session == self
         async with self._lock:
             self.sync_clients.remove(airplay_player)
-        await airplay_player.stream.stop()
         if ffmpeg := self._player_ffmpeg.pop(airplay_player.player_id, None):
+            await ffmpeg.write_eof()
             await ffmpeg.close()
             del ffmpeg
+        await airplay_player.stream.stop()
         airplay_player.stream = None
         # If this was the last client, stop the session
         if not self.sync_clients:
@@ -372,6 +373,8 @@ class AirPlayStreamSession:
         if ffmpeg := self._player_ffmpeg.pop(airplay_player.player_id, None):
             await ffmpeg.write_eof()
             await ffmpeg.close()
+        if airplay_player.stream:
+            await airplay_player.stream.stop()
 
     async def _send_metadata(self, progress: int | None, metadata: PlayerMedia | None) -> None:
         """Send metadata to all players."""