Ë
    îÿæi_  ã                   óL   — d dl Z d dlmZ d dlmZmZ d dlZd dlZ	 G d„ d«      Z
y)é    N)Údeque)ÚEventÚLockc                   óV   — e Zd ZdZdZdZdd„Zd„ Zd„ Zd„ Z	de
fd„Zd	„ Zd
„ Zd„ Zd„ Zy)ÚAudioPlayerg      ø?g      Ð?c                 óä   — || _         || _        t        «       | _        t	        «       | _        d | _        d| _        t        «       | _	        d| _
        t        j                  «       | _        || _        y )NFr   )Úsample_rateÚbuffer_sizer   Úaudio_bufferr   Úbuffer_lockÚstreamÚplayingr   Údrain_eventÚwindow_sample_countÚtimeÚperf_counterÚwindow_startÚarrival_rate)Úselfr	   r
   s      úo/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_audio/tts/audio_player.pyÚ__init__zAudioPlayer.__init__   s_   € Ø&ˆÔØ&ˆÔä!›GˆÔÜ›6ˆÔØ.2ˆŒØˆŒÜ ›7ˆÔà#$ˆÔ Ü ×-Ñ-Ó/ˆÔØ'ˆÕó    c                 ó*  — |j                  d«       d}| j                  5  ||k  r”| j                  rˆ| j                  d   }t        ||z
  t	        |«      «      }|d | ||||z   …df<   ||z  }|t	        |«      k(  r| j                  j                  «        n||d  | j                  d<   ||k  r| j                  rŒˆ| j                  s:||k  r5| j                  j                  «        d| _        t        j                  «       ‚d d d «       y # 1 sw Y   y xY w)Nr   F)Úfillr   r   ÚminÚlenÚpopleftr   Úsetr   ÚsdÚCallbackStop)r   ÚoutdataÚframesr   ÚstatusÚfilledÚbufÚto_copys           r   ÚcallbackzAudioPlayer.callback   sÿ   € Ø‰QŒØˆà×ÓØ˜6’/ d×&7Ò&7Ø×'Ñ'¨Ñ*Ü˜f v™o¬s°3«xÓ8Ø8;¸H¸W¸˜ ¨'Ñ!1Ð1°1Ð4Ñ5Ø˜'Ñ!àœc #›hÒ&Ø×%Ñ%×-Ñ-Õ/à+.¨w¨x¨=D×%Ñ% aÑ(ð ˜6’/ d×&7Ó&7ð ×$Ò$¨°&ªØ× Ñ ×$Ñ$Ô&Ø$”Ü—o‘oÓ'Ð'÷ ×Ñús    BD	Â:AD	Ä	Dc                 ó  — t        d«       t        j                  | j                  d| j                  | j
                  ¬«      | _        | j                  j                  «        d| _        | j                  j                  «        y )Nz
Starting audio stream...é   )Ú
samplerateÚchannelsr'   Ú	blocksizeT)Úprintr   ÚOutputStreamr	   r'   r
   r   Ústartr   r   Úclear©r   s    r   Ústart_streamzAudioPlayer.start_stream1   sb   € ÜÐ*Ô+Ü—o‘oØ×'Ñ'ØØ—]‘]Ø×&Ñ&ô	
ˆŒð 	‰×ÑÔØˆŒØ×Ñ×ÑÕ r   c                 óÈ   — 	 | j                   r4| j                   j                  «        | j                   j                  «        d | _         d| _        y # d | _         d| _        w xY w)NF)r   ÚstopÚcloser   r1   s    r   Ústop_streamzAudioPlayer.stop_stream=   sN   € ð	!Ø{Š{Ø—‘× Ñ Ô"Ø—‘×!Ñ!Ô#àˆDŒKØ ˆDLøð ˆDŒKØ ˆDLús   ‚A A ÁA!Úreturnc                 óH   — t        t        t        | j                  «      «      S ©N)ÚsumÚmapr   r   r1   s    r   Úbuffered_sampleszAudioPlayer.buffered_samplesF   s   € Ü”3”s˜D×-Ñ-Ó.Ó/Ð/r   c                 óÎ  — t        |«      sy t        j                  «       }| xj                  t        |«      z  c_        || j                  z
  | j
                  k\  ri| j                  || j                  z
  z  }| j                  €|n+| j                  |z  d| j                  z
  | j                  z  z   | _        d| _        || _        | j                  5  | j                  j                  t        j                  |«      «       d d d «       t        | j                  | j                  z  «      }| j                  s%| j!                  «       |k\  r| j#                  «        y y y # 1 sw Y   Œ]xY w)Nr)   r   )r   r   r   r   r   Úmeasure_windowr   Ú	ema_alphar   r   ÚappendÚnpÚasarrayÚintÚmin_buffer_secondsr   r<   r2   )r   ÚsamplesÚnowÚ	inst_rateÚneededs        r   Úqueue_audiozAudioPlayer.queue_audioI   s6  € Ü7Œ|Øä×ÑÓ!ˆð 	× Ò ¤C¨£LÑ0Õ Ø×"Ñ"Ñ" d×&9Ñ&9Ò9Ø×0Ñ0°C¸$×:KÑ:KÑ4KÑLˆIð ×$Ñ$Ð,ñ à—^‘^ iÑ/Øt—~‘~Ñ%¨×):Ñ):Ñ:ñ;ð Ôð ()ˆDÔ$Ø #ˆDÔà×ÓØ×Ñ×$Ñ$¤R§Z¡Z°Ó%8Ô9÷ ô T×&Ñ&¨×)@Ñ)@Ñ@ÓAˆØ|Š| × 5Ñ 5Ó 7¸6Ò AØ×ÑÕð !Bˆ|÷ Ðús   Ã/EÅE$c                 ó6   — | j                   j                  «       S r9   )r   Úwaitr1   s    r   Úwait_for_drainzAudioPlayer.wait_for_draind   s   € Ø×Ñ×$Ñ$Ó&Ð&r   c                 ó–   — | j                   r=| j                  «        t        j                  d«       | j	                  «        d| _         y y )Néd   F)r   rL   r   Úsleepr6   r1   s    r   r4   zAudioPlayer.stopg   s8   € Ø<Š<Ø×ÑÔ!ÜH‰HSŒMà×ÑÔØ ˆDLð r   c                 óö   — | j                   sy| j                  5  | j                  j                  «        ddd«       | j	                  «        d| _         | j
                  j                  «        y# 1 sw Y   Œ;xY w)z1Discard everything and stop playback immediately.NF)r   r   r   r0   r6   r   r   r1   s    r   ÚflushzAudioPlayer.flusho   sZ   € à|Š|Øà×ÓØ×Ñ×#Ñ#Ô%÷ à×ÑÔØˆŒØ×Ñ×ÑÕ÷	 Ðús   šA/Á/A8N)iÀ]  i   )Ú__name__Ú
__module__Ú__qualname__rD   r>   r?   r   r'   r2   r6   rC   r<   rI   rL   r4   rQ   © r   r   r   r   	   sF   „ ØÐØ€NØ€Ió(ò(ò*
!ò!ð0 #ó 0ò ò6'ò!ó	r   r   )r   Úcollectionsr   Ú	threadingr   r   ÚnumpyrA   Úsounddevicer   r   rU   r   r   Ú<module>rZ      s    ðÛ Ý ß !ã Û ÷oò or   