@@ -149,7 +149,7 @@ def __init__(
149149 self ._play_task : Optional [asyncio .Task ] = None
150150 self ._running = False
151151 self ._delay_estimator = delay_estimator
152-
152+
153153 # Internal mixer for add_track/remove_track API
154154 self ._mixer : Optional [AudioMixer ] = None
155155 self ._track_streams : dict [str , AudioStream ] = {} # track.sid -> AudioStream
@@ -223,21 +223,14 @@ def add_track(self, track: Track) -> None:
223223 """
224224 if track .sid in self ._track_streams :
225225 raise ValueError (f"Track { track .sid } already added to player" )
226-
226+
227227 # Create mixer on first track addition
228228 if self ._mixer is None :
229- self ._mixer = AudioMixer (
230- sample_rate = self ._sample_rate ,
231- num_channels = self ._num_channels
232- )
233-
229+ self ._mixer = AudioMixer (sample_rate = self ._sample_rate , num_channels = self ._num_channels )
230+
234231 # Create audio stream for this track
235- stream = AudioStream (
236- track ,
237- sample_rate = self ._sample_rate ,
238- num_channels = self ._num_channels
239- )
240-
232+ stream = AudioStream (track , sample_rate = self ._sample_rate , num_channels = self ._num_channels )
233+
241234 self ._track_streams [track .sid ] = stream
242235 self ._mixer .add_stream (stream )
243236
@@ -252,13 +245,13 @@ async def remove_track(self, track: Track) -> None:
252245 stream = self ._track_streams .pop (track .sid , None )
253246 if stream is None :
254247 return
255-
248+
256249 if self ._mixer is not None :
257250 try :
258251 self ._mixer .remove_stream (stream )
259252 except Exception :
260253 pass
261-
254+
262255 try :
263256 await stream .aclose ()
264257 except Exception :
@@ -276,13 +269,10 @@ async def start(self) -> None:
276269 """
277270 if self ._play_task is not None and not self ._play_task .done ():
278271 raise RuntimeError ("Playback already started" )
279-
272+
280273 if self ._mixer is None :
281- self ._mixer = AudioMixer (
282- sample_rate = self ._sample_rate ,
283- num_channels = self ._num_channels
284- )
285-
274+ self ._mixer = AudioMixer (sample_rate = self ._sample_rate , num_channels = self ._num_channels )
275+
286276 async def _playback_loop ():
287277 """Internal playback loop that consumes frames from the mixer."""
288278 self ._running = True
@@ -300,40 +290,40 @@ async def _playback_loop():
300290 self ._stream .close ()
301291 except Exception :
302292 pass
303-
293+
304294 self ._play_task = asyncio .create_task (_playback_loop ())
305295
306296 async def aclose (self ) -> None :
307297 """Stop playback and close the output stream.
308-
298+
309299 This also cleans up all added tracks and the internal mixer.
310300 """
311301 self ._running = False
312-
302+
313303 # Cancel playback task if running
314304 if self ._play_task is not None and not self ._play_task .done ():
315305 self ._play_task .cancel ()
316306 try :
317307 await self ._play_task
318308 except asyncio .CancelledError :
319309 pass
320-
310+
321311 # Clean up all track streams
322312 for stream in list (self ._track_streams .values ()):
323313 try :
324314 await stream .aclose ()
325315 except Exception :
326316 pass
327317 self ._track_streams .clear ()
328-
318+
329319 # Close mixer
330320 if self ._mixer is not None :
331321 try :
332322 await self ._mixer .aclose ()
333323 except Exception :
334324 pass
335325 self ._mixer = None
336-
326+
337327 # Close output stream
338328 try :
339329 self ._stream .stop ()
0 commit comments