
    ^j 7                     6   d dl mZ d dlZd dlZd dlmZmZmZ d dlZd dl	m
Z
mZmZ d dlmZ d dlm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mZ d dlmZ  ed          Z G d de
          Z G d de          Z  G d d          Z! G d de          Z"dS )    )dequeN)DequeOptionalTYPE_CHECKING)AbstractAudioDriverAbstractAudioPlayer
MediaEvent)AbstractListener)PlayerWorkerThread)debug_print   )lib_pulseaudio)PulseAudioMainloop)	AudioDataAudioFormatSource)Playerdebug_mediac                   R    e Zd ZddZdd	Zdd
ee         ddfdZd ZddZ	ddZ
dS )PulseAudioDriverreturnNc                    t                      | _        | j                                         d | _        t	                      | _        | j                                         t          j                    | _        t          |           | _
        d S N)r   mainloopstartcontextr   workerweakrefWeakSet_playersPulseAudioListener	_listenerselfs    `/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/media/drivers/pulse/adaptation.py__init__zPulseAudioDriver.__init__   sm    *,,(**))+D11    sourcer   playerr   PulseAudioPlayerc                 n    | j         J t          |||           }| j                            |           |S r   )r   r*   r    add)r$   r(   r)   s      r%   create_audio_playerz$PulseAudioDriver.create_audio_player"   s<    |'''!&&$77&!!!r'   serverc                     | j         r
J d            | j                                        | _         | j                             |           dS )a  Connect to pulseaudio server.

        :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).
        zAlready connectedN)r   r   create_contextconnect)r$   r.   s     r%   r1   zPulseAudioDriver.connect(   sL     <44!444}3355V$$$$$r'   c                     t          dt          j                               t          d| j        j                   t          d| j        j                   t          d| j        j                   t          d| j        j        rdpd           d S )NzClient version: zServer:         zProtocol:       zServer protocol:zLocal context:  YesNo)printpapa_get_library_versionr   r.   protocol_versionserver_protocol_versionis_localr#   s    r%   dump_debug_infoz PulseAudioDriver.dump_debug_info7   s     "";"="=>>> $,"5666 $,"?@@@ $,"FGGG $,"7"AE"ITJJJJJr'   c                     | j         dS | j                                         | j         j        5  | j         | j                                         d| _        ddd           n# 1 swxY w Y   | j                                          d| _         dS )z'Completely shut down pulseaudio client.N)r   r   stoplockr   deleter#   s    r%   r?   zPulseAudioDriver.delete>   s    = F] 	$ 	$|'##%%%#	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
 	s   (A##A'*A'r!   c                     | j         S r   )r"   r#   s    r%   get_listenerzPulseAudioDriver.get_listenerM   s
    ~r'   r   N)r(   r   r)   r   r   r*   r   )r   r!   )__name__
__module____qualname__r&   r-   r   bytesr1   r;   r?   rA    r'   r%   r   r      s        2 2 2 2   % %huo % % % % %K K K        r'   r   c                   8    e Zd ZddZdeddfdZd Zd	 Zd
 ZdS )r!   driverr   r   Nc                 8    t          j        |          | _        d S r   )r   proxyrI   )r$   rI   s     r%   r&   zPulseAudioListener.__init__R   s    mF++r'   volumec                 f    || _         | j        j        D ]}|                    |j                    d S r   )_volumerI   r    
set_volume)r$   rL   r)   s      r%   _set_volumezPulseAudioListener._set_volumeU   s@    k* 	. 	.Ffn----	. 	.r'   c                     || _         d S r   )	_position)r$   positions     r%   _set_positionz PulseAudioListener._set_positionZ   s    !r'   c                     || _         d S r   )_forward_orientationr$   orientations     r%   _set_forward_orientationz+PulseAudioListener._set_forward_orientation]   s    $/!!!r'   c                     || _         d S r   )_up_orientationrW   s     r%   _set_up_orientationz&PulseAudioListener._set_up_orientation`   s    *r'   )rI   r   r   N)	rC   rD   rE   r&   floatrP   rT   rY   r\   rG   r'   r%   r!   r!   Q   sw        , , , ,.% .D . . . .
" " "0 0 0+ + + + +r'   r!   c                   X    e Zd ZdededdfdZddZddedefd	ZddZdededefdZdS )_AudioDataBuffer
ideal_sizecomfortable_limitr   Nc                 r    d| _         d| _        || _        || _        t	                      | _        d| _        d S Nr   )	availablevirtual_write_index_ideal_size_comfortable_limitr   _data_first_read_offset)r$   r`   ra   s      r%   r&   z_AudioDataBuffer.__init__e   s:    #$ %"3).
"#r'   c                 b    d| _         d| _        | j                                         d| _        d S rc   )rd   re   rh   clearri   r#   s    r%   rk   z_AudioDataBuffer.clearm   s3    #$ 
"#r'   r   virtual_requiredc                 D    | j         |z
  }|| j        k     r
| j        |z
  S dS rc   )rd   rg   rf   )r$   rl   virtual_availables      r%   get_ideal_refill_sizez&_AudioDataBuffer.get_ideal_refill_sizes   s2     N-==t666#&777qr'   dr   c                     | j                             |           | xj        |j        z  c_        | xj        |j        z  c_        d S r   )rh   appendrd   lengthre   )r$   rp   s     r%   add_dataz_AudioDataBuffer.add_datay   sF    
!!("  AH,    r'   target_pointer	num_bytesc                    d}|}|dk    r| j         r| j         d         }|j        | j        z
  }||k    }t          ||          }t	          j        ||z   |j        | j        z   |           ||z  }||z  }|r!| j                                          d| _        n| xj        |z  c_        |dk    r| j         | xj        |z  c_        |S rc   )	rh   rs   ri   minctypesmemmovepointerpopleftrd   )	r$   ru   rv   bytes_writtenbytes_remainingcur_audio_datacur_lenpacket_used	cur_writes	            r%   rz   z_AudioDataBuffer.memmove~   s    #!!dj!!Z]N$+d.EEG!_4KOW55IN>M9)1D4KK$& & & Y&My(O 5
""$$$*+''''94'' !!dj!  	-'r'   rB   )r   )rp   r   r   N)	rC   rD   rE   intr&   rk   ro   rt   rz   rG   r'   r%   r_   r_   d   s        $3 $3 $4 $ $ $ $$ $ $ $ c #    - - - -
c c c      r'   r_   c                        e Zd Zd fd	Zd
eddfdZddZddZd
edefdZde	e
j                 fdZddZddZddZd fdZddZddZdefdZdefdZdeddfdZd Zd Z xZS )r*   r(   r   r)   r   rI   r   r   Nc                 
   t                                          ||           || _        d| _        |j        }|sJ d | _        d| _        d| _        d| _        |	                    | j
        dz            }|	                    | j        dz            }t          ||          | _        t          j                    | _        d| _        |j        j        5  |j                            |          | _        | j                            | j                   | j                            | j                   | j                            ||           | j        j        sJ 	 d d d            n# 1 swxY w Y   t;          d          sJ d S )Ng      ?r   F   z#PulseAudioPlayer: __init__ finished)superr&   rI   rN   audio_format_latest_timing_info_last_clear_read_index_pyglet_source_exhausted_pending_bytes
align_ceil_buffered_data_ideal_size _buffered_data_comfortable_limitr_   _audio_data_buffer	threadingLock_audio_data_lock_has_underrunr   r>   r   create_streamstreamset_write_callback_write_callbackset_underflow_callback_underflow_callbackconnect_playbackis_ready_debug)r$   r(   r)   rI   r   r`   
comf_limit	__class__s          r%   r&   zPulseAudioPlayer.__init__   s   (((*|#' &'#(-% ",,T-Kq-PQQ
!,,T-RVW-WXX
"2:z"J"J !* 0 0"_! 	( 	( .66|DDDKK**4+?@@@K..t/GHHHK((Z@@@;'''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( ;<<<<<<<s   BE''E+.E+nbytesc                 r   t          d| d          sJ | j        j                            |          |k    sJ | j        5  | j        j        dk    r(|                     |          }||z
  x}dk    r|| _        n|| _        d d d            n# 1 swxY w Y   | j	        j
                                         d S )Nz#PulseAudioPlayer: Write requested, Br   )r   r(   r   alignr   r   rd   _write_to_streamr   r   r   signal)r$   _streamr   	_userdatawrittenunfulfilleds         r%   r   z PulseAudioPlayer._write_callback   s   EFEEEFFFFF{'--f55????" 	- 	-&0144//77#)G#33Kq88*5D'&,#	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	##%%%%%s   A BBBc                 ,   t          d          sJ | j        5  | j        r7| j        j        dk    r't          d                              | j                   d| _        d d d            n# 1 swxY w Y   | j	        j
                                         d S )NzPulseAudioPlayer: underflowr   on_eosT)r   r   r   r   rd   r	   sync_dispatch_to_playerr)   r   r   r   r   )r$   r   r   s      r%   r   z$PulseAudioPlayer._underflow_callback   s    344444" 	& 	&, J1H1RVW1W1W8$$<<T[III!%D	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	##%%%%%s   AA++A/2A/c                 v   | j         rd S | j                            | j                  }|dk    rd S | j                                         | j        j                            |          }t          d| d          sJ | 
                    ||                                           }| j                                         |9d| _         | j        r)t          d                              | j                   d S d S | j                            |           |                     | j        j        |j                   d S )Nr   zPulseAudioPlayer: Getting zB of audio dataTr   )r   r   ro   r   r   releaser(   r   r   r   _get_and_compensate_audio_data_get_read_indexacquirer   r	   r   r)   rt   append_eventsre   events)r$   refill_sizenew_datas      r%   _maybe_fill_audio_data_bufferz.PulseAudioPlayer._maybe_fill_audio_data_buffer   sG    ( 	F-CCDDWXX!F%%'''k.44[AAO;OOOPPPPP66{DDXDXDZDZ[[%%''',0D)! J8$$<<T[IIIIIJ J #,,X666t6JHO\\\\\r'   c                 :   | j                             |          \  }}| j                            |j        |          }|dk    r| j                                          n&| j                             ||t          j                   t          d| d|           sJ |S )Nr   zPulseAudioPlayer: Wrote /)
r   begin_writer   rz   valuecancel_writewriter6   PA_SEEK_RELATIVEr   )r$   r   data_ptrbytes_acceptedr}   s        r%   r   z!PulseAudioPlayer._write_to_stream   s    #';#:#:6#B#B ./77WWAK$$&&&&Khr7JKKKIIIIIJJJJJr'   c                     | j                                                                                                          | j                                         S r   )r   update_timing_infowaitr?   get_timing_infor#   s    r%   _update_and_get_timing_infoz,PulseAudioPlayer._update_and_get_timing_info  sB    &&((--//66888{**,,,r'   c                    | j         5  | j        dk    s| j        j        dk    r	 d d d            d S |                     | j                  }| xj        |z  c_        | j        s	 d d d            d S d| _        d d d            n# 1 swxY w Y   | j                                                                        	                                 d S )Nr   F)
r   r   r   rd   r   r   r   triggerr   r?   )r$   r   s     r%   _maybe_write_pendingz%PulseAudioPlayer._maybe_write_pending	  sJ   " 		' 		'"a''4+B+LPQ+Q+Q		' 		' 		' 		' 		' 		' 		' 		' ++D,?@@G7*% 		' 		' 		' 		' 		' 		' 		' 		' "'D		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 	""$$++-----s   B2B1BBBc                    | j         j        j        5  |                                  |                                 | _        d d d            n# 1 swxY w Y   |                     |                                            | j        5  | 	                                 d d d            n# 1 swxY w Y   | j         j        j        5  |                                  d d d            d S # 1 swxY w Y   d S r   )
rI   r   r>   r   r   r   dispatch_media_eventsr   r   r   r#   s    r%   workzPulseAudioPlayer.work  s   [!& 	J 	J%%''''+'G'G'I'ID$	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	""4#7#7#9#9:::" 	1 	1..000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1[!& 	( 	(%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s5   .AAAB&&B*-B*C$$C(+C(c                 8   t          d          sJ | j        j                            |            | j        j        t          d          sJ d S | j        j        j        5  | j                                         d | _        d d d            d S # 1 swxY w Y   d S )NzPulseAudioPlayer.deletez:PulseAudioPlayer.delete: PulseAudioDriver already deleted.)r   rI   r   remover   r>   r   r?   r#   s    r%   r?   zPulseAudioPlayer.delete%  s    /00000!!$''';'VWWWWWWW %* # #""$$$"# # # # # # # # # # # # # # # # # #s   !!BBBc                 R   t          d          sJ t                                                       d| _        | j                                         d| _        | j        j        j        5  | 	                                }|j
        rJ |j        | _        | j                                                                                                         | j                                                                                                         d d d            d S # 1 swxY w Y   d S )NzPulseAudioPlayer.clearF)r   r   rk   r   r   r   r   r   r>   r   read_index_corrupt
read_indexr   flushr   r?   prebuf)r$   tir   s     r%   rk   zPulseAudioPlayer.clear2  sD   .///// ).%%%'''"[!& 	1 	11133B,,,,*,-D'K$$&&--///K  %%''..000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   +B$DD #D c                    t          d          sJ | j        j        j        5  | j                                        r=| j                                                                                                         | j                                        rJ 	 d d d            n# 1 swxY w Y   | j        j	        
                    |            d S )NzPulseAudioPlayer.play)r   r   r   r>   	is_corkedresumer   r?   rI   r   r,   r#   s    r%   playzPulseAudioPlayer.playF  s    -.....[!& 	/ 	/{$$&& 5""$$))++22444{,,......	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/
 	t$$$$$s   A2B""B&)B&c                 4   t          d          sJ | j        j                            |            | j        j        j        5  | j                                                                        	                                 d d d            d S # 1 swxY w Y   d S )NzPulseAudioPlayer.stop)
r   rI   r   r   r   r   r>   pauser   r?   r#   s    r%   r=   zPulseAudioPlayer.stopP  s    -.....!!$'''[!& 	0 	0K$$&&--///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   >BBBc                 *    |                                  S r   )r   r#   s    r%   get_play_cursorz PulseAudioPlayer.get_play_cursorW  s    ##%%%r'   c                 b    | j         x}dS |j        | j        z
  }t          d|           sJ |S )Nr   z_get_read_index -> )r   r   r   r   )r$   t_inforead_idxs      r%   r   z PulseAudioPlayer._get_read_indexZ  sI    ..F71$t'BB
 6H6677777r'   rL   c                 .   || _         | j        r| j        }||j        j         z  }|j        j        j        5  |j                            | j        |                                          	                                 d d d            d S # 1 swxY w Y   d S d S r   )
rN   r   rI   r"   r   r   r>   set_input_volumer   r?   )r$   rL   rI   s      r%   rO   zPulseAudioPlayer.set_volumef  s    ; 	U[Ff&..F(- U U//VDDIIKKRRTTTU U U U U U U U U U U U U U U U U U	U 	Us   ABBBc                 2   | j         j        j        5  | j                                         j        }| j                             t          ||z                                                                                       d d d            d S # 1 swxY w Y   d S r   )	r   r   r>   get_sample_specrateupdate_sample_rater   r   r?   )r$   pitchsample_rates      r%   	set_pitchzPulseAudioPlayer.set_pitcho  s    [!& 	U 	U+5577<KK**3u{/B+C+CDDIIKKRRTTT	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	Us   A-BBBc                 .    |                                   d S r   )r   r#   s    r%   prefill_audiozPulseAudioPlayer.prefill_audiot  s    		r'   )r(   r   r)   r   rI   r   r   NrB   )rC   rD   rE   r&   r   r   r   r   r   r   r6   pa_timing_infor   r   r   r?   rk   r   r=   r   r   r]   rO   r   r   __classcell__)r   s   @r%   r*   r*      s       *= *= *= *= *= *=X&s &$ & & & && & & &] ] ] ]:s s    -Xb6G-H - - - -. . . ."	( 	( 	( 	(# # # #1 1 1 1 1 1(% % % %0 0 0 0& & & & &
 
 
 
 
U U4 U U U UU U U
      r'   r*   )#collectionsr   ry   r   typingr   r   r   r   pyglet.media.drivers.baser   r   r	   pyglet.media.drivers.listenerr
   !pyglet.media.player_worker_threadr   pyglet.utilr    r   r6   	interfacer   pyglet.media.codecsr   r   r   pyglet.media.playerr   r   r   r!   r_   r*   rG   r'   r%   <module>r      s              1 1 1 1 1 1 1 1 1 1  Z Z Z Z Z Z Z Z Z Z : : : : : : @ @ @ @ @ @ # # # # # # " " " " " " ) ) ) ) ) ) +BBBBBBBBBB****** 
]	#	#7 7 7 7 7* 7 7 7t+ + + + +) + + +&/ / / / / / / /d_ _ _ _ _* _ _ _ _ _r'   