
    ^jh                     :   d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZ erd dlmZmZ  e	d          Ze e j        ej                  eegef         Ze e j        ej                  eegef         Ze e j        ej                  egef         Ze e j        ej                  eegef         Z ed          Zd	Z ej!        d
z  dz   Z"e Z#e"Z$dedee         fdZ%dedee&         fdZ'dee(         dee)         fdZ* G d d          Z+ G d de          Z, G d d          Z- G d d          Z. G d d          Z/ G d de/          Z0 G d de/          Z1 G d d e/          Z2 G d! d"          Z3 G d# d$          Z4dS )%    N)AnyCallableDictOptionalTupleTYPE_CHECKINGTypeVarUnion)lib_pulseaudio)MediaException)debug_print)	AudioDataAudioFormatTdebug_medial          valuereturnc                      | t           k    rd S | S N)_UINT32_MAXr   s    _/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/media/drivers/pulse/interface.pyget_uint32_or_noner      s    tL    c                 &    | dk     rd S | dk    rdS dS )Nr   r   TF r   s    r   get_bool_or_noner   #   s#    qyyt	!tur   c                 4    | |                      d          S d S )Nascii)decoder   s    r   get_ascii_str_or_noner#   ,   s    ||G$$$4r   c                   `    e Zd Zddeeeeeef         f                  ddfdZd Z	d Z
d	dZdS )
ProplistNini_datar   c                     t          j                    | _        | j        st          dd          ||D ]\  }}|| |<   d S d S )Nr   zFailed creating proplist.)papa_proplist_new_plPulseAudioException)selfr&   kvs       r   __init__zProplist.__init__3   sd    %''x 	F%a)DEEE   1Q   r   c                 X   t          |t                    r=t          j        | j        |                    d          |t          |                    }nAt          j        | j        |                    d          |                    d                    }|dk    rt          dd          d S )Nutf-8r   zError setting proplist entry.)	
isinstancebytesr(   pa_proplist_setr*   encodelenpa_proplist_setsr+   )r,   r-   r.   rs       r   __setitem__zProplist.__setitem__;   s    a 	T"48QXXg->->3q66JJAA#DHahhw.?.?'ARARSSA66%a)HIII 6r   c                 V    t          j        |          dk    rt          dd          d S )Nr   zError unsetting proplist entry.)r(   pa_proplist_unsetr+   )r,   r-   s     r   __delitem__zProplist.__delitem__C   s1    ""a''%a)JKKK ('r   c                 F    t          j        | j                   d | _        d S r   )r(   pa_proplist_freer*   r,   s    r   deletezProplist.deleteG   s     
DH%%%r   r   r   N)__name__
__module____qualname__r   r   strr
   r3   r/   r9   r<   r@   r   r   r   r%   r%   2   s         $sE%*4E/E*F!G SW    J J JL L L     r   r%   c                   6     e Zd Zdededdf fdZd ZeZ xZS )r+   
error_codemessager   Nc                 f    t                                          |           || _        || _        d S r   )superr/   rG   rH   )r,   rG   rH   	__class__s      r   r/   zPulseAudioException.__init__M   s-    !!!$r   c                 >    | j         j         d| j         d| j         S )Nz: [z] )rK   rB   rG   rH   r?   s    r   __str__zPulseAudioException.__str__R   s'    .)OOdoOOOOOr   )	rB   rC   rD   intrE   r/   rM   __repr____classcell__rK   s   @r   r+   r+   L   s_        3        
P P P HHHHHr   r+   c                   "    e Zd ZddZd Zd ZdS )	_MainloopLockmainloopPulseAudioMainloopr   Nc                     || _         d S r   rT   r,   rT   s     r   r/   z_MainloopLock.__init__Y   s     r   c                 8    | j                                          d S r   )rT   lock_r?   s    r   	__enter__z_MainloopLock.__enter__\   s    r   c                 8    | j                                          d S r   )rT   unlock)r,   	_exc_type
_ecx_value_tbs       r   __exit__z_MainloopLock.__exit___   s    r   )rT   rU   r   N)rB   rC   rD   r/   r[   ra   r   r   r   rS   rS   X   sF        ! ! ! !      r   rS   c                   Z    e Zd ZddZddZddZddZddZddZdd	Z	ddZ
defdZdS )rU   r   Nc                     t          j                    | _        t          j        | j                  | _        t          |           | _        d S r   )r(   pa_threaded_mainloop_new_pa_threaded_mainlooppa_threaded_mainloop_get_api_pa_mainloop_vtabrS   lockr?   s    r   r/   zPulseAudioMainloop.__init__d   s<    %'%@%B%B"!#!@A[!\!\!$''			r   c                     t          j        | j                  }|dk     rt          dd          t	          d          sJ dS )zStart running the mainloop.r   z#Failed to start PulseAudio mainloopzPulseAudioMainloop: StartedN)r(   pa_threaded_mainloop_startre   r+   _debugr,   results     r   startzPulseAudioMainloop.starti   sJ    .t/IJJA::%a)NOOO34444444r   c                     | j         St          d          sJ t          j        | j                    t          j        | j                    d| _         d| _        dS dS )zClean up the mainloop.NzDelete PulseAudioMainloop)re   rk   r(   pa_threaded_mainloop_stoppa_threaded_mainloop_freerg   r?   s    r   r@   zPulseAudioMainloop.deletep   sf    %1566666()CDDD()CDDD)-D&%)D""" 21r   c                 J    | j         J t          j        | j                    dS )zSLock the threaded mainloop against events.  Required for all
        calls into PA.N)re   r(   pa_threaded_mainloop_lockr?   s    r   rZ   zPulseAudioMainloop.lock_y   s-     )555
$T%?@@@@@r   c                 J    | j         J t          j        | j                    dS )zUnlock the mainloop thread.N)re   r(   pa_threaded_mainloop_unlockr?   s    r   r]   zPulseAudioMainloop.unlock   s+    )555
&t'ABBBBBr   c                 L    | j         J t          j        | j         d           dS )z0Signal the mainloop thread to break from a wait.Nr   )re   r(   pa_threaded_mainloop_signalr?   s    r   signalzPulseAudioMainloop.signal   s-    )555
&t'A1EEEEEr   c                 J    | j         J t          j        | j                    dS )zUnlock and then Wait for a signal from the locked mainloop.
        It's important to note that the PA mainloop lock is reentrant, yet this method only
        releases one lock.
        Before returning, the lock is reacquired.
        N)re   r(   pa_threaded_mainloop_waitr?   s    r   waitzPulseAudioMainloop.wait   s-     )555
$T%?@@@@@r   PulseAudioContextc                     | j         J |                                                     d          }| j        5  t	          | |          cddd           S # 1 swxY w Y   dS )zYConstruct and return a new context in this mainloop.
        Will grab the lock.
        Nr1   )rg   _get_app_namer5   rh   r|   )r,   app_names     r   create_contextz!PulseAudioMainloop.create_context   s     %111%%''..w77Y 	5 	5$T844	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s   AAAc                 &    t           j        d         S )z@Get the application name as advertised to the pulseaudio server.r   )sysargvr?   s    r   r~   z PulseAudioMainloop._get_app_name   s     x{r   rA   )r   r|   )rB   rC   rD   r/   rn   r@   rZ   r]   rx   r{   r   rE   r~   r   r   r   rU   rU   c   s        ( ( ( (
5 5 5 5* * * *A A A AC C C C
F F F F
A A A A5 5 5 5s      r   rU   c                       e Zd ZdefdZdS )PulseAudioMainloopChildrT   c                     |J || _         d S r   rW   rX   s     r   r/   z PulseAudioMainloopChild.__init__   s    ### r   N)rB   rC   rD   rU   r/   r   r   r   r   r      s0        !!3 ! ! ! ! ! !r   r   c                   Z    e Zd ZdZej        dej        dej        dej        dej	        dej
        dej        diZd	ed
eddf fdZd+dZedefd            Zedefd            Zedefd            Zedee         fd            Zedee         fd            Zedee         fd            Zedee         fd            Zd,dee         ddfdZd-dZdddeddfdZdddedej         fd Z!d!ee"d e#ge#f                  ddfd"Z$d.d$Z%d%e&de&fd&Z'd'e&de&fd(Z(d'e&de&fd)Z)d+d*Z* xZ+S )/r|   z5Basic object for a connection to a PulseAudio server.Unconnected
ConnectingAuthorizingzSetting NameReadyFailed
TerminatedrT   namer   Nc                     t                                          |           t          j        |j        |d           }|                     |           || _        d | _        |                     | j	                   d S r   )
rJ   r/   r(   pa_context_new_with_proplistrg   check_ptr_not_null_pa_contextstate_set_state_callback_state_callback)r,   rT   r   ctxrK   s       r   r/   zPulseAudioContext.__init__   su    """
 -h.H$PTUU$$$
  !566666r   c                    | j         | j        j        5  t          d          sJ | j        rNt          j        | j                    | j        .| j        s'| j        	                                 | j        | j        '| 
                    d           t          j        | j                    ddd           n# 1 swxY w Y   d| _         dS dS )z2Completely shut down pulseaudio client. Will lock.NzPulseAudioContext.deleter   )r   rT   rh   rk   is_readyr(   pa_context_disconnectr   is_terminatedr{   r   pa_context_unrefr?   s    r   r@   zPulseAudioContext.delete   s   '# 	6 	6899999= -,T-=>>>*09K0**,,, *09K0 ((+++#D$4555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6  $D ('s   BB55B9<B9c                 ,    | j         t          j        k    S r   )r   r(   PA_CONTEXT_READYr?   s    r   r   zPulseAudioContext.is_ready       zR000r   c                 ,    | j         t          j        k    S r   )r   r(   PA_CONTEXT_FAILEDr?   s    r   	is_failedzPulseAudioContext.is_failed   s    zR111r   c                 ,    | j         t          j        k    S r   )r   r(   PA_CONTEXT_TERMINATEDr?   s    r   r   zPulseAudioContext.is_terminated       zR555r   c                 `    | j         r&t          t          j        | j                            S d S r   )r   r#   r(   pa_context_get_serverr   r?   s    r   serverzPulseAudioContext.server   s.    = 	U()A$BR)S)STTTtr   c                 `    | j         &t          t          j        | j                             S d S r   )r   r   r(   pa_context_get_protocol_versionr?   s    r   protocol_versionz"PulseAudioContext.protocol_version   s,    '%b&HIY&Z&Z[[[tr   c                 `    | j         &t          t          j        | j                             S d S r   )r   r   r(   &pa_context_get_server_protocol_versionr?   s    r   server_protocol_versionz)PulseAudioContext.server_protocol_version   s-    '%b&OPTP`&a&abbbtr   c                 `    | j         &t          t          j        | j                             S d S r   )r   r   r(   pa_context_is_localr?   s    r   is_localzPulseAudioContext.is_local   s,    '#B$:4;K$L$LMMMtr   r   c           	      n   | j         J d| _        | j        j        5  |                     t          j        | j         |dd                     | j        s.| j        s'| j        	                                 | j        s| j        '| j        r| 
                                 ddd           dS # 1 swxY w Y   dS )a6  Connect the context to a PulseAudio server.

        Will grab the mainloop lock.

        :Parameters:
            `server` : bytes
                Server to connect to, or ``None`` for the default local
                server (which may be spawned as a daemon if no server is
                found).
        Nr   )r   r   rT   rh   checkr(   pa_context_connectr   r   r{   raise_error)r,   r   s     r   connectzPulseAudioContext.connect   s    +++
] 	# 	#JJ%d&64HH   n %T] %""$$$ n %T] % ~ #  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   B B**B.1B.audio_formatr   PulseAudioStreamc                 4    | j         sJ t          | |          S )z,
        Create a new audio stream.
        )r   r   )r,   r   s     r   create_streamzPulseAudioContext.create_stream  s!     }}l333r   streamvolumePulseAudioOperationc           
          |                      ||          }t          |           }t          |t          j        | j        |j        ||j        d                    S )z.
        Set the volume for a stream.
        N)_get_cvolume_from_linear$PulseAudioContextSuccessCallbackLumpr   r(    pa_context_set_sink_input_volumer   indexpa_callback)r,   r   r   cvolumeclumps        r   set_input_volumez"PulseAudioContext.set_input_volume  sb     //??4T::"/ ! 	
 	
 		
r   c                     t          j                    }t          j        |          }t          j        ||                                j        |           |S r   )r(   
pa_cvolumepa_sw_volume_from_linearpa_cvolume_setget_sample_specchannels)r,   r   r   r   s       r   r   z*PulseAudioContext._get_cvolume_from_linear%  sF    -//,V44
'6#9#9#;#;#DfMMMr   py_callbackc                     |d | _         nt          j        |          | _         t          j        | j        | j         d            d S r   )_pa_state_change_callbackr(   pa_context_notify_cb_tpa_context_set_state_callbackr   )r,   r   s     r   r   z%PulseAudioContext._set_state_callback+  sJ     -1D**-/-F{-S-SD*
()94;Y[_`````r   contextc                     t          j        | j                  | _        t	          d| j        | j                            sJ | j                                         d S )Nz$PulseAudioContext: state changed to )r(   pa_context_get_stater   r   rk   _state_namerT   rx   )r,   r   	_userdatas      r   r   z!PulseAudioContext._state_callback5  sX    ,T-=>>
[T=Mdj=Y[[\\\\\r   rm   c                 :    |dk     r|                                   |S Nr   r   rl   s     r   r   zPulseAudioContext.check:  s"    A::r   r   c                 2    ||                                   |S r   r   r,   r   s     r   check_not_nullz PulseAudioContext.check_not_null?  s    =r   c                 2    |s|                                   |S r   r   r   s     r   r   z$PulseAudioContext.check_ptr_not_nullD  s!     	r   c                     t          j        | j                  }t          |t	          t          j        |                              r   )r(   pa_context_errnor   r+   r#   pa_strerror)r,   errors     r   r   zPulseAudioContext.raise_errorI  s8    #D$455!%)>r~e?T?T)U)UVVVr   rA   r   )r   r   r   r   )r   r|   r   N),rB   rC   rD   __doc__r(   PA_CONTEXT_UNCONNECTEDPA_CONTEXT_CONNECTINGPA_CONTEXT_AUTHORIZINGPA_CONTEXT_SETTING_NAMEr   r   r   r   rU   r3   r/   r@   propertyboolr   r   r   r   rE   r   r   r   r   r   r   floatr   r   r   r   r   r   r   r   r   r   r   r   rP   rQ   s   @r   r|   r|      s<       ??,m+\,m-~&'+\;K7!3 75 7T 7 7 7 7 7 7$ $ $ $  1$ 1 1 1 X1 24 2 2 2 X2 6t 6 6 6 X6     X
 (3-    X
 #    X
 (4.    X
# #huo # # # # #04 4 4 4
'9 
5 
Mb 
 
 
 
$/A 5 UWUb    ah(;S'A3'FGHa 
a a a a   
A !    
A !    
 a    
W W W W W W W Wr   r|   c            
       H    e Zd ZdZej        dej        dej        dej        dej	        diZ
dedd	d
df fdZdd	d
ej        fdZd5dZed
efd            Zed
efd            Zed
efd            Zed
efd            Zed
efd            Zd
efdZd
efdZd
ej        fdZeefdeded
dfdZd6dee         d
eej         ef         fdZ!d5dZ"ej#        fded
efdZ$	 d6dee%         d
d fd!Z&d
eej'                 fd"Z(	 d6dee%         d
d fd#Z)	 d6dee%         d
d fd$Z*	 d6dee%         d
d fd%Z+	 d6dee%         d
d fd&Z,	 d6dee%         d
d fd'Z-d(e.eef         de%d
d fd)Z/	 d6d*edee%         d
d fd+Z0d,e1d
dfd-Z2d,e3d
dfd.Z4d5d/Z5d5d0Z6d5d1Z7d5d2Z8d5d3Z9d5d4Z: xZ;S )7r   zPulseAudio audio stream.r   Creatingr   r   r   r   r   r   r   Nc                    t                                          |j                   d | _        	 d | _        	 t          j        |          | _        t          j	        d          | _
        t          j        d          | _        t          j        | j                  | _        t          j        | j                  | _        t          j        |j        t'          |           d                    d          |                     |          d d           | _        |                    | j                   t          j        | j        | j        d            t          j        | j        | j        d            |                                  d S )Nr   Xr1   )rJ   r/   rT   r   r   weakrefrefr   r(   pa_stream_request_cb_t	_cb_writepa_stream_notify_cb_t_cb_underflowr   	_cb_state_moved_callback	_cb_movedpa_stream_new_with_proplistr   idr5   create_sample_spec
_pa_streamr   pa_stream_set_state_callbackpa_stream_set_moved_callback_refresh_state)r,   r   r   rK   s      r   r/   zPulseAudioStream.__init__W  s@   )***
!
&{7++21555a881$2FGG1$2FGG8$xxOO""7++##L11
 
 	t///
'NNN
'NNNr   c                 R   t           j        t           j        t           j        t           j        t           j        t           j        d}t          j        |j        f}||vrt          d|           t          j
                    }||         |_        |j        |_        |j        |_        |S )zK
        Create a PulseAudio sample spec from pyglet audio format.
        ))little   )bigr   )r      )r   r  )r      )r   r  z Unsupported sample size/format: )r(   PA_SAMPLE_U8PA_SAMPLE_S16LEPA_SAMPLE_S16BEPA_SAMPLE_S24LEPA_SAMPLE_S24BEr   	byteordersample_sizer   pa_sample_specformatsample_raterater   )r,   r   _FORMATSfmtsample_specs        r   r   z#PulseAudioStream.create_sample_spect  s    
 OO....
 
 }l67h !IC!I!IJJJ'))%c]'3+4r   c                    |                                  }|t          d          sJ d| _        dS | j        t          d          sJ dS t          d          sJ | j        srt          d          sJ |                    t          j        | j                             | j        s.| j        s'| j	        
                                 | j        s| j        '|                                  t          j        | j                   d| _        dS )z0If connected, disconnect, and delete the stream.Nz7No active context anymore. Cannot disconnect the streamzNo stream to delete.zDelete PulseAudioStreamzPulseAudioStream: disconnecting)r   rk   r   is_unconnectedr   r(   pa_stream_disconnectr   r   rT   r{   _disconnect_callbackspa_stream_unref)r,   r   s     r   r@   zPulseAudioStream.delete  s$   ,,..?STTTTT"DOF?"011111F/00000" 	%;<<<<<MM'88   ) %T^ %""$$$ ) %T^ % 	""$$$
4?+++r   c                 ,    | j         t          j        k    S r   )r   r(   PA_STREAM_UNCONNECTEDr?   s    r   r  zPulseAudioStream.is_unconnected  r   r   c                 ,    | j         t          j        k    S r   )r   r(   PA_STREAM_CREATINGr?   s    r   is_creatingzPulseAudioStream.is_creating  s    zR222r   c                 ,    | j         t          j        k    S r   )r   r(   PA_STREAM_READYr?   s    r   r   zPulseAudioStream.is_ready  s    zR///r   c                 ,    | j         t          j        k    S r   )r   r(   PA_STREAM_FAILEDr?   s    r   r   zPulseAudioStream.is_failed  r   r   c                 ,    | j         t          j        k    S r   )r   r(   PA_STREAM_TERMINATEDr?   s    r   r   zPulseAudioStream.is_terminated  s    zR444r   c                     | j         J t          j        | j                   }|t          k    r&|                                                                  |S r   )r   r(   pa_stream_writable_sizePA_INVALID_WRITABLE_SIZEr   r   r,   r8   s     r   get_writable_sizez"PulseAudioStream.get_writable_size  sM    ***&t77(((LLNN&&(((r   c                     | j         J t          j        | j                   }|                                                     |           t          |          S r   )r   r(   pa_stream_is_corkedr   r   r   r$  s     r   	is_corkedzPulseAudioStream.is_corked  sI    ***"4?33QAwwr   c                 R    | j         J t          j        | j                   d         S r   )r   r(   pa_stream_get_sample_specr?   s    r   r   z PulseAudioStream.get_sample_spec  s(    ***+DO<<Q??r   tlengthminreqc           
      v   |                                  }| j        J |J d }t          j                    }t          |_        t          |_        ||_        t          |_        ||_	        t          j
        t          j        z  t          j        z  }d }d }|                    t          j        | j        |||||                     | j        s.| j        s'| j                                         | j        s| j        '| j        s|                                 |                                  t+          d          sJ d S )Nz$PulseAudioStream: Playback connected)r   r   r(   pa_buffer_attrr   fragsize	maxlengthr+  prebufr,  PA_STREAM_START_CORKEDPA_STREAM_INTERPOLATE_TIMINGPA_STREAM_VARIABLE_RATEr   pa_stream_connect_playbackr   r   rT   r{   r   _refresh_sink_indexrk   )	r,   r+  r,  r   devicebuffer_attrflagsr   sync_streams	            r   connect_playbackz!PulseAudioStream.connect_playback  sP   ,,..***"""'))* +%(#*01+, )$/*0*5*/*0*57 7	
 	
 	
 - 	! 	!M    - 	! 	!} 	"!!!  """ <=======r   nbytesc           	         |                                  }|J t          j                    }t          j        |t          n|          }|                    t          j        | j        t          j	        |          t          j	        |                               |
                    |           t          d| d|j                   sJ ||j        fS )Nz%PulseAudioStream: begin_write nbytes=z
 nbytes_n=)r   ctypesc_void_pc_size_t_SIZE_T_MAXr   r(   pa_stream_begin_writer   byrefr   rk   r   )r,   r<  r   addr	nbytes_sts        r   begin_writezPulseAudioStream.begin_write  s    ,,.."""  O6>KKvNN	$T_fl46H6H&,W`JaJabb	
 	
 	
 	""4(((afaaPYP_aabbbbbY_$$r   c                     |                                                      t          j        | j                             d S r   )r   r   r(   pa_stream_cancel_writer   r?   s    r   cancel_writezPulseAudioStream.cancel_write  s1    R6tGGHHHHHr   lengthc           
      
   |                                  }|J | j        J | j        sJ t          d| d          sJ |                    t          j        | j        ||t          j        d          d|                     |S )NzPulseAudioStream: writing z bytesr   )r   r   r   rk   r   r(   pa_stream_writepa_free_cb_t)r,   datarJ  	seek_moder   s        r   writezPulseAudioStream.write  s    ,,.."""***}}A6AAABBBBBtfboa>P>PRSU^__	
 	
 	
 r   callbackr   c                     |                                  }|J | j        J t          ||          }t          |t	          j        | j        |j        d                     S r   )r   r   #PulseAudioStreamSuccessCallbackLumpr   r(   pa_stream_update_timing_infor   r,   rQ  r   r   s       r   update_timing_infoz#PulseAudioStream.update_timing_info  sg     ,,.."""***3GXFF"+DOU=NPTUU
 
 	
r   c                     |                                  }|J | j        J t          j        | j                  }|r|j        ndS )z
        Retrieves the stream's timing_info struct,
        or None if it does not exist.
        Note that ctypes creates a copy of the struct, meaning it will
        be safe to use with an unlocked mainloop.
        N)r   r   r(   pa_stream_get_timing_infocontents)r,   r   timing_infos      r   get_timing_infoz PulseAudioStream.get_timing_info"  sP     ,,.."""***24?CC'2<{##<r   c                     |                                  }|J | j        J t          ||          }t          |t	          j        | j        |j        d                     S r   )r   r   rS  r   r(   pa_stream_triggerr   rU  s       r   triggerzPulseAudioStream.trigger/  sf     ,,.."""***3GXFF" %2CTJJ
 
 	
r   c                     |                                  }|J | j        J t          ||          }t          |t	          j        | j        |j        d                     S r   )r   r   rS  r   r(   pa_stream_prebufr   rU  s       r   r1  zPulseAudioStream.prebuf=  sf     ,,.."""***3GXFF"1BDII
 
 	
r   c                     |                                  }|J | j        J t          ||          }t          |t	          j        | j        |j        d                     S r   )r   r   rS  r   r(   pa_stream_flushr   rU  s       r   flushzPulseAudioStream.flushK  sf     ,,.."""***3GXFF"t0A4HH
 
 	
r   c                 .    |                      d|          S )NF_corkr,   rQ  s     r   resumezPulseAudioStream.resumeY  s     zz%***r   c                 .    |                      d|          S )NTre  rg  s     r   pausezPulseAudioStream.pause_  s     zz$)))r   rj  c           	          |                                  }|J | j        J t          ||          }t          |t	          j        | j        ||j        d                     S r   )r   r   rS  r   r(   pa_stream_corkr   )r,   rj  rQ  r   r   s        r   rf  zPulseAudioStream._corke  sh    
 ,,.."""***3GXFF"doue6GNN
 
 	
r   r  c           	          |                                  }|J | j        J t          ||          }t          |t	          j        | j        ||j        d                     S r   )r   r   rS  r   r(   pa_stream_update_sample_rater   )r,   r  rQ  r   r   s        r   update_sample_ratez#PulseAudioStream.update_sample_ratet  sm    
 ,,.."""***3GXFF"+e.? 
 
 	
r   fc                 x    t          j        |          | _        t          j        | j        | j        d            d S r   )r(   r   r   pa_stream_set_write_callbackr   r,   rp  s     r   set_write_callbackz#PulseAudioStream.set_write_callback  s3    2155
'NNNNNr   c                 x    t          j        |          | _        t          j        | j        | j        d            d S r   )r(   r   r    pa_stream_set_underflow_callbackr   rs  s     r   set_underflow_callbackz'PulseAudioStream.set_underflow_callback  s6    5a88
+DOT=OQUVVVVVr   c                     | j         }t          j        || j        d            t          j        || j        d            t          j        || j        d            t          j        || j	        d            d S r   )
r   r(   rv  r   rr  r   r   r   r   r   r,   ss     r   _connect_callbacksz#PulseAudioStream._connect_callbacks  sl    O
+At/A4HHH
'4>4@@@
'4>4@@@
'4>4@@@@@r   c                 T   | j         }t          j        |t          j        d          d            t          j        |t          j        d          d            t          j        |t          j        d          d            t          j        |t          j        d          d            d S r   )r   r(   rv  r   rr  r   r   r   ry  s     r   r  z&PulseAudioStream._disconnect_callbacks  s    O
+Ar/G/J/JDQQQ
'2+DQ+G+GNNN
'2+CA+F+FMMM
'2+CA+F+FMMMMMr   c                     |                                   t          d| j        | j                            sJ | j                                         d S )Nz#PulseAudioStream: state changed to )r   rk   r   r   rT   rx   r,   _streamr   s      r   r   z PulseAudioStream._state_callback  sU    ZD<LTZ<XZZ[[[[[r   c                 `    |                                   t          d| j                   sJ d S )Nz%PulseAudioStream: moved to new index )r6  rk   r   r~  s      r   r   z PulseAudioStream._moved_callback  s9      """JdjJJKKKKKKKr   c                     t          j        | j                  | _        | j        t          k    r(|                                                                  d S d S r   )r(   pa_stream_get_indexr   r   PA_INVALID_INDEXr   r   r?   s    r   r6  z$PulseAudioStream._refresh_sink_index  sL    +DO<<
:)))LLNN&&((((( *)r   c                 B    t          j        | j                  | _        d S r   )r(   pa_stream_get_stater   r   r?   s    r   r   zPulseAudioStream._refresh_state  s    +DO<<


r   rA   r   )<rB   rC   rD   r   r(   r  r  r  r  r   r   r|   r/   r
  r   r@   r   r   r  r  r   r   r   rN   r%  r(  r   r   r;  r   r   r>  r?  rF  rI  PA_SEEK_RELATIVErP   PulseAudioContextSuccessCallbackrV  pa_timing_infor[  r^  r1  rc  rh  rj  r
   rf  ro  PulseAudioStreamRequestCallbackrt  PulseAudioStreamNotifyCallbackrw  r{  r  r   r   r6  r   rP   rQ   s   @r   r   r   N  sX       ""+](*%w&*L	:K 1  SW      :} AR    ,   4 6 6 6 6 X6 3T 3 3 3 X3 0$ 0 0 0 X0 14 1 1 1 X1 5t 5 5 5 X53    4    @!2 @ @ @ @ /: (> (> (>3 (>Y] (> (> (> (>T% %(3- %5RUAU;V % % % % I I I I 241D 
 
# 
 
 
 
 
 @D
 
;<
 

 
 
 
="*;!< = = = = @D
 
;<
 

 
 
 
  @D
 
;<
 

 
 
 
  @D
 
;<
 

 
 
 
  @D+ +;<+ 
+ + + + @D* *;<* 
* * * *
S$Y
 3
 
	
 
 
 
$ @D
 

 ;<
 
	
 
 
 
"O$C O O O O OW(F W4 W W W WA A A AN N N N   
L L L L) ) ) )
= = = = = = = =r   r   c                        e Zd ZdZej        dej        dej        diZdej	        ddf fdZ
dd	Zdd
Zd Zd Zedefd            Zedefd            Zedefd            Z xZS )r   zAn asynchronous PulseAudio operation.
    Can be waited for, where it will run until completion or cancellation.
    Remember to `delete()` it with the mainloop lock held, otherwise
    it will be leaked.
    RunningDone	Cancelledpa_operationr   Nc                     |j         }|j        J |J |                    |           t                                          |j                   || _        || _        d S r   )r   rT   r   rJ   r/   callback_lump_pa_operation)r,   r  r  r   rK   s       r   r/   zPulseAudioOperation.__init__  sk    '+++'''""<000)****)r   c                 F    | j         J t          j        | j                   S r   )r  r(   pa_operation_get_stater?   s    r   
_get_statezPulseAudioOperation._get_state  s%    !---();<<<r   c                 t    | j         0t          j        | j                    d| _         d| _        d| _        dS dS )zUnref and delete the operation.N)r  r(   pa_operation_unrefr  r   r?   s    r   r@   zPulseAudioOperation.delete  sB    )!$"4555!%D!%DDLLL	 *)r   c                 J    | j         J t          j        | j                    | S )zCancel the operation.)r  r(   pa_operation_cancelr?   s    r   cancelzPulseAudioOperation.cancel  s*    !---
t1222r   c                 T    | j         r | j                                         | j          | S )z5Wait until the operation is either done or cancelled.)
is_runningrT   r{   r?   s    r   r{   zPulseAudioOperation.wait  s1    o 	!M    o 	!r   c                 F    |                                  t          j        k    S r   )r  r(   PA_OPERATION_RUNNINGr?   s    r   r  zPulseAudioOperation.is_running  s      B$;;;r   c                 F    |                                  t          j        k    S r   )r  r(   PA_OPERATION_DONEr?   s    r   is_donezPulseAudioOperation.is_done  s      B$888r   c                 F    |                                  t          j        k    S r   )r  r(   PA_OPERATION_CANCELLEDr?   s    r   is_cancelledz PulseAudioOperation.is_cancelled  s      B$===r   rA   )rB   rC   rD   r   r(   r  r  r  r   r  r/   r  r@   r  r{   r   r   r  r  r  rP   rQ   s   @r   r   r     s3         *I',k;K
*BO 
* 
* 
* 
* 
* 
* 
*= = = =            <D < < < X< 9 9 9 9 X9 >d > > > X> > > > >r   r   c                   8    e Zd Z	 ddedee         ddfdZd ZdS )r   Nr   rQ  r   c                 ^    t          j        | j                  | _        || _        || _        d S r   )r(   pa_context_success_cb_t_success_callbackr   r   r   r,   r   rQ  s      r   r/   z-PulseAudioContextSuccessCallbackLump.__init__  s-    
 5d6LMM#r   c                 ~    | j         |                      |||           | j        j                                         d S r   r   r   rT   rx   )r,   r   successuserdatas       r   r  z6PulseAudioContextSuccessCallbackLump._success_callback  s@    'Wgx888$$&&&&&r   r   rB   rC   rD   r|   r   r  r/   r  r   r   r   r   r     e         @D " ;< 
	   ' ' ' ' 'r   r   c                   8    e Zd Z	 ddedee         ddfdZd ZdS )rS  Nr   rQ  r   c                 ^    t          j        | j                  | _        || _        || _        d S r   )r(   pa_stream_success_cb_tr  r   r   r   r  s      r   r/   z,PulseAudioStreamSuccessCallbackLump.__init__  s-    
 4T5KLL#r   c                 ~    | j         |                      |||           | j        j                                         d S r   r  )r,   r   r  r  s       r   r  z5PulseAudioStreamSuccessCallbackLump._success_callback  s@    'VWh777$$&&&&&r   r   r  r   r   r   rS  rS    r  r   rS  )5r>  r   typingr   r   r   r   r   r   r	   r
   r   pyglet.media.drivers.pulser   r(   pyglet.media.exceptionsr   pyglet.utilr   pyglet.media.codecsr   r   r   POINTER	pa_streamrN   PulseAudioStreamSuccessCallbackr  r  
pa_contextr  rk   r   maxsizerA  r  r#  r   r   r   r3   rE   r#   r%   r+   rS   rU   r   r|   r   r   r   rS  r   r   r   <module>r     s    



 V V V V V V V V V V V V V V V V V V V V  ; ; ; ; ; ; 2 2 2 2 2 2 # # # # # # ;::::::::GCLL"*NFN2<,H,H#s+SUX+X"Y "*NFN2<,H,H#s+SUX+X"Y !)>6>",+G+G*Ms*R!S #+^V^BM-J-JCQT,UWZ,Z#[   
]	#	# k!ma & c hsm    C HTN    % Xc]           4	 	 	 	 	. 	 	 	       ; ; ; ; ; ; ; ;|! ! ! ! ! ! ! !dW dW dW dW dW/ dW dW dWN\= \= \= \= \=. \= \= \=~
9> 9> 9> 9> 9>1 9> 9> 9>x' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'r   