
    \
j^c                     N   d dl Z d dlZddlmZ d dlmZ d dlmZ d dl	Z	 ed          Z
d Zd Zd	 Z G d
 de          Z G d d          Z G d d          Z G d de          Z G d dee	j        j                  Ze                    d            G d de          ZdS )    N   )lib_pulseaudio)MediaException)debug_printdebug_mediac                     | | dk    rd S | S )Nl     values    ^/DATA/AppData/hermes/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   TFr	   r
   s    r   get_bool_or_noner   6   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 fdZd ZeZ xZS )PulseAudioExceptionc                 t    t          t          |                               |           || _        || _        d S N)superr   __init__
error_codemessage)selfr   r   	__class__s      r   r   zPulseAudioException.__init__F   s4    !4((11':::$r   c                 X    d                     | j        j        | j        | j                  S )Nz{}: [{}] {})formatr   __name__r   r   r   s    r   __str__zPulseAudioException.__str__K   s#    ##DN$;T_dl[[[r   )r!   
__module____qualname__r   r#   __repr____classcell__r   s   @r   r   r   E   sE            
\ \ \ HHHHHr   r   c                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )PulseAudioMainLoopc                     t          j                    | _        t          j        | j                  | _        d| _        d S Nr   )papa_threaded_mainloop_new_pa_threaded_mainlooppa_threaded_mainloop_get_api_pa_mainloop_lock_countr"   s    r   r   zPulseAudioMainLoop.__init__R   s7    %'%@%B%B";D<VWWr   c                 .    |                                   d S r   )deleter"   s    r   __del__zPulseAudioMainLoop.__del__W       r   c                     | 5  t          j        | j                  }|dk     rt          dd          	 ddd           n# 1 swxY w Y   t	          d          sJ dS )zStart running the mainloop.r   z#Failed to start PulseAudio mainloopNzPulseAudioMainLoop: Started)r-   pa_threaded_mainloop_startr/   r   _debugr   results     r   startzPulseAudioMainLoop.startZ   s     	T 	T243MNNFzz)!-RSSS 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 34444444s   0A  AA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)r/   r9   r-   pa_threaded_mainloop_stoppa_threaded_mainloop_freer1   r"   s    r   r4   zPulseAudioMainLoop.deleteb   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                    | xj        dz  c_        dS )SLock the threaded mainloop against events.  Required for all
        calls into PA.Nr   )r/   r-   pa_threaded_mainloop_lockr2   r"   s    r   lockzPulseAudioMainLoop.lockk   sA     )555
$T%?@@@Ar   c                     | j         J | j        dk    sJ | xj        dz  c_        t          j        | j                    dS )Unlock the mainloop thread.Nr   r   )r/   r2   r-   pa_threaded_mainloop_unlockr"   s    r   unlockzPulseAudioMainLoop.unlockr   sS    )555!####A
&t'ABBBBBr   c                 L    | j         J t          j        | j         d           dS )0Signal the mainloop thread to break from a wait.Nr   )r/   r-   pa_threaded_mainloop_signalr"   s    r   signalzPulseAudioMainLoop.signalz   s-    )555
&t'A1EEEEEr   c                    | j         J | j        dk    sJ | j        }| j        dk    r|                                  | j        dk    t          j        | j                    | j        |k     r!|                                  | j        |k     dS dS )Wait for a signal.Nr   r   )r/   r2   rG   r-   pa_threaded_mainloop_waitrC   )r   original_lock_counts     r   waitzPulseAudioMainLoop.wait   s    )555!####".""KKMMM ""
$T%?@@@!444IIKKK !4444444r   c                 F    t          | |                                           S r   )PulseAudioContext_context_newr"   s    r   create_contextz!PulseAudioMainLoop.create_context   s     t'8'8':':;;;r   c                     | j         J |                                 }t          j        | j         |                    d                    }|S )z)Construct a new context in this mainloop.NASCII)r1   _get_app_namer-   pa_context_newencode)r   app_namecontexts      r   rS   zPulseAudioMainLoop._context_new   sO     ,,,%%''#D$5$,OOG$<$<& & r   c                 &    t           j        d         S )z@Get the application name as advertised to the pulseaudio server.r   )sysargvr"   s    r   rW   z PulseAudioMainLoop._get_app_name   s     x{r   c                 .    |                                   d S r   rC   r"   s    r   	__enter__zPulseAudioMainLoop.__enter__       		r   c                 .    |                                   d S r   rG   r   exc_type	exc_value	tracebacks       r   __exit__zPulseAudioMainLoop.__exit__   r6   r   N)r!   r$   r%   r   r5   r<   r4   rC   rG   rK   rP   rT   rS   rW   ra   ri   r	   r   r   r*   r*   Q   s          
  5 5 5% % %  C C CF F F

 
 
< < <    
      r   r*   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	PulseAudioLockablec                 @    |J t          j        |          | _        d S r   )weakrefrefmainloop)r   ro   s     r   r   zPulseAudioLockable.__init__   s#    ###H--r   c                 R    |                                                                   dS )rA   N)ro   rC   r"   s    r   rC   zPulseAudioLockable.lock   s$     	r   c                 R    |                                                                   dS )rE   N)ro   rG   r"   s    r   rG   zPulseAudioLockable.unlock   "         r   c                 R    |                                                                   dS )rI   N)ro   rK   r"   s    r   rK   zPulseAudioLockable.signal   rr   r   c                 R    |                                                                   dS )rM   N)ro   rP   r"   s    r   rP   zPulseAudioLockable.wait   s"    r   c                 .    |                                   d S r   r`   r"   s    r   ra   zPulseAudioLockable.__enter__   rb   r   c                 .    |                                   d S r   rd   re   s       r   ri   zPulseAudioLockable.__exit__   r6   r   N)
r!   r$   r%   r   rC   rG   rK   rP   ra   ri   r	   r   r   rk   rk      s}        . . .  
! ! !! ! !        r   rk   c                   x    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 fd	Zd
 Zd Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zd dZd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z# xZ$S )!rR   z5Basic object for a connection to a PulseAudio server.Unconnected
ConnectingAuthorizingzSetting NameReadyFailed
Terminatedc                     t          t          |                               |           || _        d | _        |                                  d S r   )r   rR   r   _pa_contextstate_connect_callbacks)r   ro   
pa_contextr   s      r   r   zPulseAudioContext.__init__   sI    &&//999%
!!!!!r   c                 v    | j         1| 5  |                                  d d d            d S # 1 swxY w Y   d S d S r   )r   r4   r"   s    r   r5   zPulseAudioContext.__del__   s    '                    ('   ,00c                 B   | j         t          d          sJ | j        rIt          j        | j                    | j        )| j        s"|                                  | j        | j        "|                                  t          j	        | j                    d| _         dS dS )z'Completely shut down pulseaudio client.NzPulseAudioContext.delete)
r   r9   is_readyr-   pa_context_disconnectr   is_terminatedrP   _disconnect_callbackspa_context_unrefr"   s    r   r4   zPulseAudioContext.delete   s    '455555}  ()9:::j,T5G,IIKKK j,T5G, &&((( 0111#D ('r   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-    = 	()A$BR)S)STTT4r   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[[[ ('r   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   s0    '%b&OPTP`&a&abbb ('r   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 ('r   Nc           	      R   | j         J d| _        | 5  |                     t          j        | j         |dd                     | j        s)| j        s"|                                  | j        s| j        "ddd           n# 1 swxY w Y   | j        r|                                  dS dS )a  Connect the context to a PulseAudio server.

        :Parameters:
            `server` : str
                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   checkr-   pa_context_connectr   r   rP   raise_error)r   r   s     r   connectzPulseAudioContext.connect  s    +++
 	 	JJ%d&64HH   n T] 		 n T] 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 > 		 	s   A A??BBc                 P   |                                  }|J | j        sJ |                     |          }d}t          j        | j        t          t          |                                         d          ||          }| 	                    |           t          || |          S )z,
        Create a new audio stream.
        NrV   )ro   r   create_sample_specr-   pa_stream_newr   stridrY   check_not_nullPulseAudioStream)r   audio_formatro   sample_specchannel_mapstreams         r   create_streamzPulseAudioContext.create_stream  s     ==??###}}--l;; !$"2"%bhh--"6"6w"?"?"-"-/ / 	F###$777r   c                    t          j                    }|j        dk    rt           j        |_        n|j        dk    r4t
          j        dk    rt           j        |_        n`t           j        |_        nN|j        dk    r4t
          j        dk    rt           j	        |_        n!t           j
        |_        nt          d          |j        |_        |j        |_        |S )zK
        Create a PulseAudio sample spec from pyglet audio format.
              little   zUnsupported sample size)r-   pa_sample_specsample_sizePA_SAMPLE_U8r    r]   	byteorderPA_SAMPLE_S16LEPA_SAMPLE_S16BEPA_SAMPLE_S24LEPA_SAMPLE_S24BEr   sample_rateratechannels)r   r   r   s      r   r   z$PulseAudioContext.create_sample_spec/  s     '))#q((!#K%++}((%'%7""%'%7""%++}((%'%7""%'%7"" !:;;;'3+4r   c           	          |                      ||          }|j        }t          | t          j                  }|                    t          j        | j        |||j        d                     |S )z.
        Set the volume for a stream.
        )succes_cb_tN)	_get_cvolume_from_linearindexPulseAudioOperationr-   pa_context_success_cb_texecute pa_context_set_sink_input_volumer   pa_callback)r   r   volumecvolumeidxops         r   set_input_volumez"PulseAudioContext.set_input_volumeF  su     //??l 23MNNN


3D4D474;46N48	: :	 	 	 	r   c                     t          j                    }t          j        |          }t          j        ||j        j        |           |S r   )r-   
pa_cvolumepa_sw_volume_from_linearpa_cvolume_setr   r   )r   r   r   r   s       r   r   z*PulseAudioContext._get_cvolume_from_linearV  sG    -//,V44
' -6 	" 	" 	" r   c                     t          j        | j                  | _        t          j        | j        | j        d            d S r   )r-   pa_context_notify_cb_t_state_callback_state_cb_funcpa_context_set_state_callbackr   r"   s    r   r   z$PulseAudioContext._connect_callbacks^  sI     78LMM
()9)-)<d	D 	D 	D 	D 	Dr   c                 n    d | _         t          j        | j        t          j        d          d            d S r,   )r   r-   r   r   r   r"   s    r   r   z'PulseAudioContext._disconnect_callbacksc  s?    "
()9)+)B1)E)E)-	/ 	/ 	/ 	/ 	/r   c                     t          j        | j                  | _        t	          d                    | j        | j                                     sJ |                                  d S )Nz&PulseAudioContext: state changed to {})r-   pa_context_get_stater   r   r9   r    _state_namerK   )r   r[   userdatas      r   r   z!PulseAudioContext._state_callbacki  sd    ,T-=>>
>EE ,. . / / 	/ 	/ /r   c                 :    |dk     r|                                   |S r,   r   r:   s     r   r   zPulseAudioContext.checko  s"    A::r   c                 2    ||                                   |S r   r   r   r   s     r   r   z PulseAudioContext.check_not_nullt  s    =r   c                 2    |s|                                   |S r   r   r   s     r   check_ptr_not_nullz$PulseAudioContext.check_ptr_not_nully  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_error~  s8    #D$455!%)>r~e?T?T)U)UVVVr   r   )%r!   r$   r%   __doc__r-   PA_CONTEXT_UNCONNECTEDPA_CONTEXT_CONNECTINGPA_CONTEXT_AUTHORIZINGPA_CONTEXT_SETTING_NAMEr   r   r   r   r   r5   r4   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r(   s   @r   rR   rR      s$       ??,m+\,m-~&'+\;K" " " " "  
$ $ $ 1 1 X1 2 2 X2 6 6 X6   X \ \ X\ c c Xc N N XN   ,8 8 8&  .     D D D
/ / /    
  
  
W W W W W W Wr   rR   c            
          e Zd ZdZej        dej        dej        dej        dej	        diZ
d Zd Zd	 Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zd Zdej        fdZd&dZd Zd&dZd&dZd&dZd&dZ d&dZ!d Z"d Z#d Z$d  Z%d! Z&d" Z'd# Z(d&d$Z)d% Z*dS )'r   zPulseAudio audio stream.rx   Creatingr{   r|   r}   c                    t                               | |           || _        t          j        |          | _        d | _        d| _        t          j	        | j                   | 
                                 |                                  d S NF)rk   r   
_pa_streamrm   rn   r[   r   	underflowr-   pa_stream_refr   _refresh_state)r   ro   r[   	pa_streams       r   r   zPulseAudioStream.__init__  s{    ##D(333#{7++

)))!!!r   c                 @    | j         |                                  d S d S r   )r   r4   r"   s    r   r5   zPulseAudioStream.__del__  s#    ?&KKMMMMM '&r   c                 @   |                                  }|t          d          sJ d | _        d S | j        t          d          sJ d S t          d          sJ | j        st          d          sJ | 5  |                    t          j        | j                             | j        s)| j        s"| 	                                 | j        s| j        "d d d            n# 1 swxY w Y   | 
                                 t          j        | j                   d | _        d S )Nz7No active context anymore. Cannot disconnect the streamzNo stream to delete.zDelete PulseAudioStreamzPulseAudioStream: disconnecting)r[   r9   r   is_unconnectedr   r-   pa_stream_disconnectr   r   rP   r   pa_stream_unref)r   r[   s     r   r4   zPulseAudioStream.delete  sx   ,,..?STTTTT"DOF?"011111F/00000" 	 ;<<<<<    +DO<<    -    IIKKK  -    	                              	""$$$
4?+++s   6ACC#&C#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                 F    | j         J t          j        | j                   S r   )r   r-   pa_stream_writable_sizer"   s    r   writable_sizezPulseAudioStream.writable_size  s#    ***)$/:::r   c                 F    | j         J t          j        | j                   S r   )r   r-   pa_stream_get_indexr"   s    r   r   zPulseAudioStream.index  s#    ***%do666r   c                 `    | j         J t          t          j        | j                             S r   )r   r   r-   pa_stream_is_corkedr"   s    r   	is_corkedzPulseAudioStream.is_corked  s+    *** 6t G GHHHr   c                 R    | j         J t          j        | j                   d         S r,   )r   r-   pa_stream_get_sample_specr"   s    r   r   zPulseAudioStream.audio_format  s(    ***+DO<<Q??r   c           
         |                                  }| j        J |J d }d }t          j        t          j        z  t          j        z  }d }d }|                    t          j        | j        |||||                     | j        s)| j	        s"| 
                                 | j        s| j	        "| j        s|                                 t          d          sJ d S )Nz$PulseAudioStream: Playback connected)r[   r   r-   PA_STREAM_START_CORKEDPA_STREAM_INTERPOLATE_TIMINGPA_STREAM_VARIABLE_RATEr   pa_stream_connect_playbackr   r   rP   r   r9   )r   r[   devicebuffer_attrflagsr   sync_streams          r   connect_playbackz!PulseAudioStream.connect_playback  s   ,,..***"""*01+, )$/*0*5*/*0*57 7	
 	
 	
 - 	 	IIKKK - 	 	} 	"!!!<=======r   Nc           
         |                                  }|J | j        J | j        sJ |t          |j        | j                  }t          d                    |                    sJ t          d                    | j                            sJ |                    t          j
        | j        |j        |t          j        d          d|                     t          d                    | j                            sJ d| _        |S )Nz"PulseAudioStream: writing {} bytesz5PulseAudioStream: writable size before write {} bytesr   z4PulseAudioStream: writable size after write {} bytesF)r[   r   r   minlengthr  r9   r    r   r-   pa_stream_writedatapa_free_cb_tr   )r   
audio_datar  	seek_moder[   s        r   writezPulseAudioStream.write  s   ,,.."""***}}>*D,>??F:AA&IIJJJJJMTTUYUghhiiiii"4?#-?#)#%?1#5#5#$#,. .	 	 	 LSSTXTfgghhhhhr   c                     |                                  }|J | j        J t          ||          }|                    t	          j        | j        |j        d                      |S r   )r[   r   r   r   r-   pa_stream_update_timing_infor   r   callbackr[   r   s       r   update_timing_infoz#PulseAudioStream.update_timing_info  sq    ,,.."""*** (33


/02046 6	 	 	
 	r   c                     |                                  }|J | j        J |                    t          j        | j                            }|j        S r   )r[   r   r   r-   pa_stream_get_timing_infocontents)r   r[   timing_infos      r   get_timing_infoz PulseAudioStream.get_timing_info  sY    ,,.."""***00,T_==  ##r   c                     |                                  }|J | j        J t          |          }|                    t	          j        | j        |j        d                      |S r   )r[   r   r   r   r-   pa_stream_triggerr   r%  s       r   triggerzPulseAudioStream.trigger"  so    ,,.."""*** ))


$T_%'^%)+ +	 	 	
 	r   c                     |                                  }|J | j        J t          |          }|                    t	          j        | j        |j        d                      |S r   )r[   r   r   r   r-   pa_stream_prebufr   r%  s       r   prebufzPulseAudioStream.prebuf.  so    ,,.."""*** ))


#DO$&N$(* *	 	 	
 	r   c                 .    |                      d|          S r   _corkr   r&  s     r   resumezPulseAudioStream.resume:  s    zz%***r   c                 .    |                      d|          S )NTr4  r6  s     r   pausezPulseAudioStream.pause=  s    zz$)))r   c                     |                                  }|J | j        J t          |          }|                    t	          j        | j        t          |          |j        d                      |S r   )r[   r   r   r   r-   pa_stream_update_sample_rateintr   )r   r   r&  r[   r   s        r   update_sample_ratez#PulseAudioStream.update_sample_rate@  sz    ,,.."""*** ))


/03K0@0@02046 6	 	 	 	r   c                     |                                  }|J | j        J t          |          }|                    t	          j        | j        |rdnd|j        d                      |S )Nr   r   )r[   r   r   r   r-   pa_stream_corkr   )r   r9  r&  r[   r   s        r   r5  zPulseAudioStream._corkM  s{    ,,.."""*** ))


do#(/aaa n"$ $	 	 	 	r   c                 z   t          j        | j                  | _        t          j        | j                  | _        t          j        | j                  | _        t          j	        | j
        | j        d            t          j        | j
        | j        d            t          j        | j
        | j        d            d S r   )r-   pa_stream_notify_cb_t_underflow_callback_cb_underflowpa_stream_request_cb_t_write_callback	_cb_writer   	_cb_state pa_stream_set_underflow_callbackr   pa_stream_set_write_callbackpa_stream_set_state_callbackr"   s    r   r   z#PulseAudioStream._connect_callbacksZ  s    5d6NOO243GHH1$2FGG
+DOT=OQUVVV
'NNN
'NNNNNr   c                 >   d | _         d | _        d | _        t          j        | j        t          j        d          d            t          j        | j        t          j        d          d            t          j	        | j        t          j        d          d            d S r,   )
rC  rF  rG  r-   rH  r   rA  rI  rD  rJ  r"   s    r   r   z&PulseAudioStream._disconnect_callbacksc  s    !
+DO,.,DQ,G,G,0	2 	2 	2 	'(*(A!(D(D(,	. 	. 	. 	'(*(@(C(C(,	. 	. 	. 	. 	.r   c                     t          d          sJ d| _        |                                  |                                  d S )NzPulseAudioStream: underflowT)r9   r   _write_neededrK   r   r   r   s      r   rB  z$PulseAudioStream._underflow_callbackr  sA    344444r   c                 z    t          d          sJ |                     |           |                                  d S )Nz!PulseAudioStream: write requested)r9   rM  rK   )r   r   nbytesr   s       r   rE  z PulseAudioStream._write_callbackx  s<    9:::::6"""r   c                     |                                   t          d                    | j        | j                                     sJ |                                  d S )Nz%PulseAudioStream: state changed to {})r   r9   r    r   r   rK   rN  s      r   r   z PulseAudioStream._state_callback}  sT    =DDTEUVZV`Eabbcccccr   c                 T    | j          t          j        | j                   | _        d S d S r   )r   r-   pa_stream_get_stater   r"   s    r   r   zPulseAudioStream._refresh_state  s*    ?&/@@DJJJ '&r   c                 p    || j         }t          j        j                            | d|| j                   d S )Non_write_needed)r  pygletappplatform_event_loop
post_eventr   )r   rP  s     r   rM  zPulseAudioStream._write_needed  sB    >'F
&11#VT^	= 	= 	= 	= 	=r   c                     dS )zA write is requested from PulseAudio.
        Called from the PulseAudio mainloop, so no locking required.

        :event:
        Nr	   )r   rP  r   s      r   rU  z PulseAudioStream.on_write_needed  s      r   r   )+r!   r$   r%   r   r-   r   r   r  r  r  r   r   r5   r4   r   r   r   r   r   r   r  r   r  r   r  PA_SEEK_RELATIVEr"  r'  r,  r/  r2  r7  r9  r=  r5  r   r   rB  rE  r   r   rM  rU  r	   r   r   r   r     s       ""+](*%w&*L	:K	 	 	    4 6 6 X6 3 3 X3 0 0 X0 1 1 X1 5 5 X5 ; ; X; 7 7 X7 I I XI @ @ X@> > >6 (,r7J    *
 
 
 
$ $ $
 
 
 

 
 
 
+ + + +* * * *     O O O. . .    
  
A A A= = = =    r   r   rU  c                        e Zd ZdZej        dej        dej        diZddej	        fdZ
d Zd Zd	 Zd
 Zed             Zed             Zed             Z fdZd Zd Z xZS )r   z!Asynchronous PulseAudio operationRunningDone	CancelledNc                    |                                 }|J t                              | |           t          j        |          | _        || _         || j                  | _        || 	                    |           d S d | _
        d S r   )ro   rk   r   rm   rn   r[   	_callback_success_callbackr   r   _pa_operation)r   r[   r&  pa_operationr   ro   s         r   r   zPulseAudioOperation.__init__  s    ##%%#####D(333{7++!&;t'=>>#LL&&&&&!%Dr   c                 v    | j         1| 5  |                                  d d d            d S # 1 swxY w Y   d S d S r   )rc  r4   r"   s    r   r5   zPulseAudioOperation.__del__  s    )                    *)r   c                     | j         St          d                    t          |                               sJ t	          j        | j                    d | _         d S d S )NzPulseAudioOperation.delete({}))rc  r9   r    r   r-   pa_operation_unrefr"   s    r   r4   zPulseAudioOperation.delete  s^    ):AA"T((KKLLLLL!$"4555!%D *)r   c                     |                                  }|J |                    |           t          d                    t	          |                               sJ || _        |                                  | S )NzPulseAudioOperation.execute({}))r[   r   r9   r    r   rc  
_get_state)r   rd  r[   s      r   r   zPulseAudioOperation.execute  su    ,,.."""""<0007>>r$xxHHIIIII)r   c                 J    | j         J t          j        | j                    | S r   )rc  r-   pa_operation_cancelr"   s    r   cancelzPulseAudioOperation.cancel  s*    !---
t1222r   c                 F    |                                  t          j        k    S r   )ri  r-   PA_OPERATION_RUNNINGr"   s    r   
is_runningzPulseAudioOperation.is_running  s      B$;;;r   c                 F    |                                  t          j        k    S r   )ri  r-   PA_OPERATION_DONEr"   s    r   is_donezPulseAudioOperation.is_done  s      B$888r   c                 F    |                                  t          j        k    S r   )ri  r-   PA_OPERATION_CANCELLEDr"   s    r   is_cancelledz PulseAudioOperation.is_cancelled  s      B$===r   c                 r    | j         r.t          t          |                                            | j         .| S )z1Wait until operation is either done or cancelled.)ro  r   r   rP   )r   r   s    r   rP   zPulseAudioOperation.wait  s;    o 	4%t,,11333 o 	4r   c                 F    | j         J t          j        | j                   S r   )rc  r-   pa_operation_get_stater"   s    r   ri  zPulseAudioOperation._get_state  s%    !---();<<<r   c                 r    | j         r|                                   d | _        |                                  d S r   )ra  r   rK   )r   r   successr   s       r   rb  z%PulseAudioOperation._success_callback  s5    > 	NNr   )r!   r$   r%   r   r-   rn  rq  rt  r   pa_stream_success_cb_tr   r5   r4   r   rl  r   ro  rr  ru  rP   ri  rb  r'   r(   s   @r   r   r     s)       ++*I',k;K *.D6& & & &  
& & &    
 < < X< 9 9 X9 > > X>    = = =      r   r   )r]   rm    r   r-   pyglet.media.exceptionsr   pyglet.utilr   rV  r9   r   r   r   r   r*   rk   rR   eventEventDispatcherr   register_event_typer   r	   r   r   <module>r     s  H 


  " " " " " " 2 2 2 2 2 2 # # # # # # 	]	#	#      	 	 	 	 	. 	 	 	O O O O O O O Od       :@W @W @W @W @W* @W @W @WFO O O O O)6<+G O O Ob  $ $%6 7 7 7G G G G G, G G G G Gr   