
    (HJj                     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      d/Users/ahmed/devFolder/claude-voice/.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''*fvos3x88;HW'!11145'!c#h&%%--/+.wx=D%%a( 6/d&7&7 $$&  $$&$oo'' 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    *+oo'']]&&	
 	 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    	!{{  "!!#DK DL DK DLs   A A A!returnc                 H    t        t        t        | j                              S )N)summapr   r   r1   s    r   buffered_sampleszAudioPlayer.buffered_samplesF   s    3sD--.//r   c                    t        j                  |t         j                        }t        |      sy |j                  dk(  r|j                  d      }n|j                  dk(  r|j                  d   dk(  r
|d d df   }n|j                  d   dk(  r|d   }nw|j                  d   dk  r2|j                  d   |j                  d   k  r|j                  d      }n3|j                  d      }n |j                  dkD  r|j                  d      }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#                  |       d d d        t%        | j                  | j&                  z        }| j(                  s%| j+                         |k\  r| j-                          y y y # 1 sw Y   ]xY w)N)dtyper   r)         )axis)npasarrayfloat32r   ndimreshapeshapemeanr   r   r   r   measure_windowr   	ema_alphar   r   appendintmin_buffer_secondsr   r;   r2   )r   samplesnow	inst_rateneededs        r   queue_audiozAudioPlayer.queue_audioI   s   **WBJJ77|<<1ooa(G\\Q}}Q1$!!Q$-q!Q&!!*q!Q&7==+;gmmA>N+N!,,A,.!,,A,.\\Aoob)G! 	  CL0 """d&9&9900C$:K:K4KLI $$, ^^i/t~~%):)::;  ()D$ #D$$W-  T&&)@)@@A|| 5 5 76 A !B| s   IIc                     | j                   s%| j                         dkD  r| j                          ny | j                  j	                         S )Nr   )r   r;   r2   r   waitr1   s    r   wait_for_drainzAudioPlayer.wait_for_drainr   s@     ||$$&*!!#$$&&r   c                     | j                   r=| j                          t        j                  d       | j	                          d| _         y y )Nd   F)r   rU   r   sleepr6   r1   s    r   r4   zAudioPlayer.stop}   s8    <<!HHSM 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.flush   sZ    ||##% 	 s   A//A8N)i]  i   )__name__
__module____qualname__rM   rI   rJ   r   r'   r2   r6   rL   r;   rR   rU   r4   rZ    r   r   r   r   	   sG    NI((*
!!0# 0' R	'!	r   r   )r   collectionsr   	threadingr   r   numpyrB   sounddevicer   r   r^   r   r   <module>rc      s       !  E Er   