+
    ~j                        ^ RI Ht ^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	 ^RI
HtHt ^RIHtHtHt ]P"                  ! ]4      t] ! R R	4      4       t ! R
 R4      tR# )    )annotationsN)	dataclass)Any)rtc)aiolog_exceptions)AudioReceiverAudioSegmentEndVideoGeneratorc                  J    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R]R&   RtR	# )
AvatarOptionsintvideo_widthvideo_heightfloat	video_fpsaudio_sample_rateaudio_channels N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       x/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/voice/avatar/_runner.pyr   r      s     r   r   c                      ] tR t^tRtR^dRR/R R llt]R R l4       tR	 R
 ltR R lt	R R lt
]! ]R7      R R l4       t]! ]R7      R R l4       tR R ltR R ltR R ltRtR# )AvatarRunnerzGWorker that generates synchronized avatar video based on received audio_queue_size_ms_lazy_publishTc               4    V ^8  d   QhRRRRRRRRR	R
RRRR/# )   roomzrtc.Room
audio_recvr	   	video_genr   optionsr   r    r   r!   boolreturnNoner   )formats   "r   __annotate__AvatarRunner.__annotate__   sP     +: +:+: "	+:
 "+: +: +: +: 
+:r   c               	   Wn         W0n        W@n        WPn        W n        R V n        RV n        \        4       V n        \        P                  ! 4       V n        RV n        RV n        W`n        \        P                   ! VP"                  VP$                  V P                  R7      V n        \        P(                  ! VP*                  VP,                  R7      V n        \        P0                  ! V P&                  V P.                  VP2                  V P                  R7      V n        RV n        RV n        \        P:                  R,          ! 4       V n        R# )        FN)sample_ratenum_channelsqueue_size_ms)widthheight)audio_sourcevideo_sourcer   video_queue_size_ms)_room
_video_gen_optionsr    _audio_recv_playback_position_audio_playingset_tasksasyncioLock_lock_audio_publication_video_publicationr!   r   AudioSourcer   r   _audio_sourceVideoSourcer   r   _video_sourceAVSynchronizerr   _av_sync_read_audio_task_forward_video_ataskFuture_room_connected_fut)selfr$   r%   r&   r'   r    r!   s   &&$$$$$r   __init__AvatarRunner.__init__   s    
#,%"%#.1e\\^
DHDH* !__11 //--

 !__73F3FwOcOcd**++++'' $ 3 3	
 <@?C!#*>>$#7#9 r   c                   V ^8  d   QhRR/# )r#   r)   zrtc.AVSynchronizerr   )r+   s   "r   r,   r-   J   s      + r   c                	    V P                   # N)rJ   rO   s   &r   av_syncAvatarRunner.av_syncI   s    }}r   c                   V ^8  d   QhRR/# r#   r)   r*   r   )r+   s   "r   r,   r-   M   s     O OT Or   c                b  "   V P                   P                  4       G Rj  xL
  V P                   P                  RV P                  4       V P                  P                  RV P
                  4       V P                  P                  4       '       d   V P                  P                  R4       V P                  '       g   V P                  4       G Rj  xL
  \        P                  ! V P                  4       4      V n        \        P                  ! V P                  4       4      V n        R#  EL
 L[5i)zStart the workerNclear_bufferconnection_state_changed)r;   starton_on_clear_bufferr8   _on_connection_state_changedisconnectedrN   
set_resultr!   _publish_trackr@   create_task_read_audio_read_audio_atask_forward_videorL   rU   s   &r   r]   AvatarRunner.startM   s      $$&&&ND,A,AB

0$2S2ST::!!##$$//5!!!%%''' ")!4!4T5E5E5G!H$+$7$78K8K8M$N! 	' (s/   D/D*A/D/,D/>D/D-AD/-D/c                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-   _   s     
 
 
r   c                	   "   V P                   '       d   V P                  '       g   \        R 4      h\        P                  ! V P                   V P                  4      G Rj  xL
  R#  L5i)zAvatarRunner not startedN)rf   rL   RuntimeErrorr@   gatherrU   s   &r   wait_for_completeAvatarRunner.wait_for_complete_   sP     %%%T-F-F-F9::nn""%%
 	
 	
s   $A)9A) A'!A)c                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-   h   s      d r   c                	V  "   V P                   ;_uu_4       GR j  xL
  V P                  G R j  xL
  \        P                  P	                  RV P
                  4      p\        P                  ! \        P                  P                  R7      pV P                  P                  P                  W4      G R j  xL
 V n        V P                  P                  4       G R j  xL
  \        P                  P                  RV P                   4      p\        P                  ! \        P                  P"                  R7      pV P                  P                  P                  W44      G R j  xL
 V n        R R R 4      GR j  xL
  R #  ELc ELR L L L% L  + GR j  xL 
 '       g   i     R # ; i5i)Navatar_audio)sourceavatar_video)rB   rN   r   LocalAudioTrackcreate_audio_trackrF   TrackPublishOptionsTrackSourceSOURCE_MICROPHONEr8   local_participantpublish_trackrC   wait_for_subscriptionLocalVideoTrackcreate_video_trackrH   SOURCE_CAMERArD   )rO   audio_trackaudio_optionsvideo_trackvideo_optionss   &    r   rc   AvatarRunner._publish_trackh   s    ::::****--@@QUQcQcdK333??;\;\]M,0JJ,H,H,V,V- 'D# ))??AAA--@@QUQcQcdK333??;X;XYM,0JJ,H,H,V,V- 'D# ::*' B' :::s   F)E>F)FFBF5F6&FFBF"F#	F,F)7F
8F)FFFF
F)F&	F
F&	F&	 	F)loggerc                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-   z   s     4 44 4r   c                	   "   V P                     R j  xL
  pV P                  '       g(   \        V\        P                  4      '       d   RV n        V P
                  P                  V4      G R j  xL
  Kh   Lc LDfR # 5i)NT)r;   r=   
isinstancer   
AudioFramer9   
push_audio)rO   frames   & r   re   AvatarRunner._read_audioy   se     ++ 	4 	4%&&&:eS^^+L+L&*#//,,U333	4 4 ,s8   A>A;A7A;AA>0A91A>7A;9A>;A>c                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-      s      :  :d  :r   c                z  "   V P                     Rj  xL
  p\        V\        4      '       d   V P                  '       d   V P                  P                  V P                  RR7      pRV n        RV n        \        P                  ! V4      '       dW   \        P                  ! V4      pV P                  P                  V4       VP                  V P                  P                  4       K  V P                  '       g   V P                  4       G Rj  xL
  V P                   P#                  V4      G Rj  xL
  \        V\$        P&                  4      '       g   EKK  V P                  R8X  d   VP(                  R8  d   V P                  P+                  4       p\        P                  ! V4      '       dW   \        P                  ! V4      pV P                  P                  V4       VP                  V P                  P                  4       V ;P                  VP(                  ,          un        EK   EL EL" ELED#R# 5i)z5Forward video to the room through the AV synchronizerNFplayback_positioninterruptedr/   )r9   r   r
   r=   r;   notify_playback_finishedr<   r@   iscoroutinerd   r?   addadd_done_callbackdiscardrD   rc   rJ   pushr   r   durationnotify_playback_started)rO   r   notify_tasktasks   &   r   rg   AvatarRunner._forward_video   s      ?? 	: 	:%%11&&&"&"2"2"K"K*.*A*A$) #L #K +0D'.1D+**;77&22;?-..t{{/B/BC***))+++--$$U+++%00**c1enns6J"&"2"2"J"J"LK**;77&22;?-..t{{/B/BC''5>>9'';	:$ ,+) +sk   H;H7H.H7)H;AH;A)H;<H;H1"H;2H43!H;AH;2A<H;.H71H;4H;7H;c                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-      s     $ $$ $r   c                  a  \        \        R7      R V 3R ll4       p\        P                  ! V! S P                  4      4      pS P
                  P                  V4       VP                  S P
                  P                  4       RS n        R# )z@Handle clearing the buffer and notify about interrupted playbackr   c                    V ^8  d   QhRRRR/# )r#   audio_playingr(   r)   r*   r   )r+   s   "r   r,   3AvatarRunner._on_clear_buffer.<locals>.__annotate__   s     	& 	&d 	&t 	&r   c                X  <"   SP                   P                  4       p\        P                  ! V4      '       d   VG R j  xL
  V '       dY   SP                  P                  SP                  RR7      pRSn        \        P                  ! V4      '       d   VG R j  xL
  R # R # R #  Lf L5i)NTr   r/   )r9   r[   r@   r   r;   r   r<   )r   
clear_taskr   rO   s   &  r   _handle_clear_buffer;AvatarRunner._on_clear_buffer.<locals>._handle_clear_buffer   s     557J"":..   "..GG&*&=&= $ H  +.'&&{33%%% 4  ! &s/   <B*B& B*A	B*B*B(B*(B*FN)	r   r   r@   rd   r=   r?   r   r   r   )rO   r   r   s   f  r   r_   AvatarRunner._on_clear_buffer   sj     
v	&	& 
'	& ""#78K8K#LMt{{223#r   c                    V ^8  d   QhRRRR/# )r#   _zrtc.ConnectionStater)   r*   r   )r+   s   "r   r,   r-      s     6 6.A 6d 6r   c                	    V P                   P                  4       '       d@   V P                  P                  4       '       g   V P                  P	                  R 4       R # R # R # rT   )r8   ra   rN   donerb   )rO   r   s   &&r   r`   )AvatarRunner._on_connection_state_changed   sF    ::!!##D,D,D,I,I,K,K$$//5 -L#r   c                   V ^8  d   QhRR/# rY   r   )r+   s   "r   r,   r-      s     * *d *r   c                	  "   V P                   P                  R V P                  4       V P                  P	                  4       G Rj  xL
  V P
                  '       d)   \        P                  ! V P
                  4      G Rj  xL
  V P                  '       d)   \        P                  ! V P                  4      G Rj  xL
  \        P                  ! V P                  !  G Rj  xL
  V P                  P	                  4       G Rj  xL
  V P                  P	                  4       G Rj  xL
  V P                  P	                  4       G Rj  xL
  R#  EL L L Ls LS L3 L5i)r\   N)r8   offr`   r;   acloserL   r   cancel_and_waitrf   r?   rJ   rF   rH   rU   s   &r   r   AvatarRunner.aclose   s     

143T3TU%%'''$$$%%d&?&?@@@!!!%%d&<&<===!!4;;///mm""$$$  '')))  ''))) 	(@=/$))s   AEEE#E EE#E:E;%E E!!EE!E$E%!EEEEEEEEE)r=   rC   r;   rF   rJ   rL   r!   rB   r:   r<   r    rf   rK   r8   rN   r?   r9   rD   rH   N)r   r   r   r   __doc__rP   propertyrV   r]   rm   rc   r   r   re   rg   r_   r`   r   r   r   r   r   r   r      s    Q+: "+: #+:Z  O$
" 6"4 #4 6" : # :D$.6* *r   r   )
__future__r   r@   loggingdataclassesr   typingr   livekitr   utilsr   r   _typesr	   r
   r   	getLoggerr   r   r   r   r   r   r   <module>r      sU    "   !   ( B B			8	$   q* q*r   