
    \
j<                         d dl Z d dl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 dd	lmZmZmZ  ed
          Z G d de          Z G d de	          Z G d de          ZdS )    N)AbstractAudioDriverAbstractAudioPlayer)
MediaEvent)MediaException)AbstractListener)debug_print   )lib_pulseaudio)PulseAudioContextPulseAudioMainLoopPulseAudioStreamdebug_mediac                   :    e Zd Zd Zd Zd Zd	dZd Zd Zd Z	dS )
PulseAudioDriverc                     t                      | _        | j                                         | j        | _        d | _        t          j                    | _        t          |           | _	        d S N)
r   mainloopstartlockcontextweakrefWeakSet_playersPulseAudioListener	_listenerselfs    _/DATA/AppData/hermes/venv/lib/python3.11/site-packages/pyglet/media/drivers/pulse/adaptation.py__init__zPulseAudioDriver.__init__4   sU    *,,M	))+D11    c                 .    |                                   d S r   )deleter   s    r   __del__zPulseAudioDriver.__del__=   s    r    c                 n    | j         J t          |||           }| j                            |           |S r   )r   PulseAudioPlayerr   add)r   sourceplayers      r   create_audio_playerz$PulseAudioDriver.create_audio_player@   s<    |'''!&&$77&!!!r    Nc                     | j         r
J d            | j                                        | _         | j                             |           dS )a   Connect to 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).
        zAlready connectedN)r   r   create_contextconnect)r   servers     r   r,   zPulseAudioDriver.connectF   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_infoU   s     "";"="=>>> $,"5666 $,"?@@@ $,"FGGG $,"7"AE"ITJJJJJr    c                     | j         F| j         5  | j         | j                                         d| _        ddd           n# 1 swxY w Y   | j         )| j                                          d| _         d| _        dS dS )z'Completely shut down pulseaudio client.N)r   r   r"   r   r   s    r   r"   zPulseAudioDriver.delete\   s    =$ ( (<+L'')))#'DL( ( ( ( ( ( ( ( ( ( ( ( ( ( (
 =$M  """ DMDIII %$s   (AA
Ac                     | j         S r   )r   r   s    r   get_listenerzPulseAudioDriver.get_listenerj   s
    ~r    r   )
__name__
__module____qualname__r   r#   r)   r,   r7   r"   r:    r    r   r   r   3   s        2 2 2    % % % %K K K      r    r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r   c                 8    t          j        |          | _        d S r   )r   proxydriverr   rB   s     r   r   zPulseAudioListener.__init__o   s    mF++r    c                 f    || _         | j        j        D ]}|                    |j                    d S r   )_volumerB   r   
set_volume)r   volumer(   s      r   _set_volumezPulseAudioListener._set_volumer   s@    k* 	. 	.Ffn----	. 	.r    c                     || _         d S r   )	_position)r   positions     r   _set_positionz PulseAudioListener._set_positionw   s    !r    c                     || _         d S r   )_forward_orientationr   orientations     r   _set_forward_orientationz+PulseAudioListener._set_forward_orientationz   s    $/!!!r    c                     || _         d S r   )_up_orientationrO   s     r   _set_up_orientationz&PulseAudioListener._set_up_orientation}   s    *r    N)r;   r<   r=   r   rH   rL   rQ   rT   r>   r    r   r   r   n   s_        , , ,. . .
" " "0 0 0+ + + + +r    r   c                        e Zd ZdZ fdZd ZddZd Zd Zd Z	dd	Z
d
 Zd Zd Zd Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )r%   g      ?c                 B   t          t          |                               ||           t          j        |          | _        g | _        g | _        d| _        d| _	        d| _
        d | _        d| _        d | _        d | _        |j        }|sJ |j        5  |j                            |          | _        | j                            |            | j                                         | j        j        sJ 	 d d d            n# 1 swxY w Y   t/          d          sJ d S )Nr   Fz#PulseAudioPlayer: __init__ finished)superr%   r   r   refrB   _events_timestamps_write_index_read_index_valid_clear_write_buffered_audio_data_playing_current_audio_data_time_sync_operationaudio_formatr   r   create_streamstreampush_handlersconnect_playbackis_ready_debug)r   r'   r(   rB   rb   	__class__s        r   r   zPulseAudioPlayer.__init__   s]   %%..vv>>>k&))!&!$(!#' $(!*|_ 	( 	( .66|DDDKK%%d+++K((***;'''''		( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( ;<<<<<<<s   A!DD
Dc                 R   |r|                                   n|                     |           | j        rq| j        ,| j        j        r | j                                         d | _        | j        9t          d          sJ | j                            | j	                  | _        d S d S d S )Nz,PulseAudioPlayer: trigger timing info update)
_handle_underflow_write_to_streamrY   ra   is_doner"   rh   rd   update_timing_info_process_events)r   nbytes	underflows      r   on_write_neededz PulseAudioPlayer.on_write_needed   s     	*""$$$$!!&))) < 	a(49R9Z4)00222,0)(0LMMMMM,0K,J,J4K_,`,`)))	a 	a 10r    Nc                    | j         | j        d| j        j        j        z  }||}nt	          ||          }t          d                    |                    sJ |                                 }| j                            ||          | _         | 	                                 | j         t          d          sJ n.t          d                    | j         j
                            sJ | j         S )Nr	   z3PulseAudioPlayer: Try to get {} bytes of audio dataz)PulseAudioPlayer: No audio data availablez,PulseAudioPlayer: Got {} bytes of audio data)r`   r'   rb   bytes_per_secondminrh   formatget_audio_time_diffget_audio_data_schedule_eventslength)r   rp   	min_bytescompensation_times       r   _get_audio_dataz PulseAudioPlayer._get_audio_data   s   #+0GDK4EEI~"Y//OVVW]^^_____ $ 8 8 : :'+{'A'A&J['\'\D$!!####+EFFFFFFHOO3:< < = = = = =''r    c                 .    |                                  d uS r   )r}   r   s    r   _has_audio_dataz PulseAudioPlayer._has_audio_data   s    ##%%T11r    c                     | j         @|| j         j        k    r	d | _         d S | j                             || j        j                   d S d S r   )r`   rz   consumer'   rb   )r   rp   s     r   _consume_audio_dataz$PulseAudioPlayer._consume_audio_data   sV    #/1888+/((((009QRRRRR	 0/r    c                     | j         p| j         j        D ]e}| j        |j        | j        j        j        z  z   }t          d                    |                    sJ | j	        
                    ||f           dd S d S )Nz,PulseAudioPlayer: Schedule event at index {})r`   eventsr[   	timestampr'   rb   rt   rh   rv   rY   append)r   eventevent_indexs      r   ry   z!PulseAudioPlayer._schedule_events   s    #/18 : :"/%/K,=3> >LSST_``aaaaa##[%$89999 0/: :r    c                 p   || j         j        }t          d|z            sJ t          j        }| j        r4t          d|          }t          j        }d| _        t          d          sJ |                                 r|dk    r| 	                                }t          ||j                  }| j                             |||          }t          j        }d| _        | j                            | j        |j        f           | xj        |z  c_        t          d                    |                    sJ |                     |           ||z  }|                                 r|dk    |                                 s6| j        r1| j                                         }|                                 d S d S d S )Nz7PulseAudioPlayer: Requested to write %d bytes to streami   FzPulseAudioPlayer: Clear bufferr   Tz3PulseAudioPlayer: Actually wrote {} bytes to stream)rd   writable_sizerh   r2   PA_SEEK_RELATIVEr]   maxPA_SEEK_RELATIVE_ON_READr   r}   ru   rz   writer\   rZ   r   r[   r   rv   r   r_   triggerr"   )r   rp   	seek_mode
audio_datawrite_lengthconsumptionops          r   rl   z!PulseAudioPlayer._write_to_stream   s   >[.FORXXYYYYY'	 	< v&&F3I %D:;;;;;""$$ 	"!--//Jvz'899L+++JiPPK+I%)D"##T%6
8L$MNNN, &&,f[&9&9; ; ; ; ;$$[111k!F ""$$ 	"!" ##%% 	 } [((**			 	 r    c                     t          d          sJ |                                 r|                                  d S |                     d           d S )NzPlayer: underflowon_eos)rh   r   rl   _add_event_at_write_indexr   s    r   rk   z"PulseAudioPlayer._handle_underflow   s]    )*****!! 	5!!#####**844444r    c                 $   t          d          sJ | j        st          d          sJ d S | j                                        }|st          d          sJ d S |j        }t          d                    |                    sJ | j        r| j        d         d         |k    rk| j                            d          \  }}t          d|          sJ |                    | j                   | j        r| j        d         d         |k    gd S d S d S d S )Nz PulseAudioPlayer: Process eventszPulseAudioPlayer: No eventsz2PulseAudioPlayer: No timing info to process eventsz-PulseAudioPlayer: Dispatch events at index {}r   z PulseAudioPlayer: Dispatch event)	rh   rY   rd   get_timing_info
read_indexrv   pop_sync_dispatch_to_playerr(   )r   timing_infor   _r   s        r   ro   z PulseAudioPlayer._process_events  sC   899999| 	788888F k1133 	NOOOOOF +
ELLZXXYYYYYl 	8t|Aq1Z??|''**HAu<eDDDDD**4;777 l 	8t|Aq1Z???? 	8 	8?? 	8 	8r    c                     t          d                    | j                            sJ | j                            | j        t          d|          f           d S )Nz'PulseAudioPlayer: Add event at index {}        )rh   rv   r[   rY   r   r   )r   
event_names     r   r   z*PulseAudioPlayer._add_event_at_write_index  sV    ?FFtGXYYZZZZZT.
2z0J0JKLLLLLr    c                    t          d          sJ | j                                         |                                 }|t          d          sJ d | _        d S |j        t          d          sJ d S | j        ?| j        5  | j                                         d d d            n# 1 swxY w Y   d | _        | j                                         d | _        d S )NzDelete PulseAudioPlayerz,PulseAudioDriver has been garbage collected.zOPulseAudioDriver already deleted. PulseAudioPlayer could not clean up properly.)rh   rd   pop_handlersrB   r   ra   r"   rC   s     r   r"   zPulseAudioPlayer.delete  s5   /00000  """>HIIIIIDKF?" F G G G G GF$0* 3 3)002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3(,D%s   B))B-0B-c                 x   t          d          sJ t          t          |                                            d| _        |                                 | _        g | _        g | _        | j	        5  d| _
        | j	                                                                         d d d            d S # 1 swxY w Y   d S )NzPulseAudioPlayer.clearTF)rh   rW   r%   clearr]   _get_read_indexr[   rZ   rY   rd   r\   prebufwait)r   ri   s    r   r   zPulseAudioPlayer.clear2  s    ./////%%++---  0022[ 	( 	(%*D"K  %%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   /3B//B36B3c                 J   t          d          sJ | j        5  | j        j        rN| j                                                                                                         t          d          sJ | j        j        r|                                  |                                 sN| j        	                                                                                                 t          d          sJ | j        j        rJ 	 d d d            n# 1 swxY w Y   d| _
        d S )NzPulseAudioPlayer.playz"PulseAudioPlayer: Resumed playbackz9PulseAudioPlayer: Triggered stream for immediate playbackT)rh   rd   	is_corkedresumer   r"   rq   rl   r   r   r_   r   s    r   playzPulseAudioPlayer.play>  sY   -.....[ 		- 		-{$ D""$$))++22444BCCCCC{$ (%%''''')) [##%%**,,33555YZZZZZ{,,,,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- s   C+DDDc                    t          d          sJ | j        5  | j        j        s=| j                                                                                                         d d d            n# 1 swxY w Y   d| _        d S )NzPulseAudioPlayer.stopF)rh   rd   r   pauser   r"   r_   r   s    r   stopzPulseAudioPlayer.stopN  s    -.....[ 	4 	4;( 4!!##((**11333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 s   A
A//A36A3c                 ,   | j         5  | j                                                                                                          d d d            n# 1 swxY w Y   | j                                         }|r|j        }nd}t          d|          sJ |S )Nr   z_get_read_index ->)rd   rn   r   r"   r   r   rh   )r   r   r   s      r   r   z PulseAudioPlayer._get_read_indexW  s    [ 	= 	=K**,,1133::<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= k1133 	$/JJJ*J77777   >AAAc                 t    | j                                         }|r|j        }nd}t          d|          sJ |S )Nr   z_get_write_index ->)rd   r   write_indexrh   )r   r   r   s      r   _get_write_indexz!PulseAudioPlayer._get_write_indexd  sI    k1133 	%1KKK+[99999r    c                     | j         5  | j                                                                                                          d d d            n# 1 swxY w Y   | j                                         }|S r   )rd   rn   r   r"   r   )r   r   s     r   _get_timing_infoz!PulseAudioPlayer._get_timing_infon  s    [ 	= 	=K**,,1133::<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= k1133r   c                    | j         st          d          sJ dS |                                 }|j        }|j        }|j        }d}d}	 | j        d         \  }}| j        d         \  }}||k    r| j        d= | j        d         \  }}||k    n# t          $ r Y nw xY w| j        j	        j
        }||z
  t          |          z  dz  }||j        dz  z  }||j        z  }|dz  }||z   }	t          d|	          sJ |	S )Nz)get_time <_read_index_valid = False> -> 0r   r   r	   i@B    zget_time ->)r\   rh   r   r   transport_usec	sink_usecrZ   
IndexErrorr'   rb   rt   float)
r   t_infor   r   r   r   r   rt   dttimes
             r   get_timezPulseAudioPlayer.get_timeu  sV   % 	EFFFFF1&&((&
.$			%)%5a%8"K%)%5a%8"K++$Q')-)9!)<&Y ++  	 	 	D	  ;3D;&%0@*A*AAGK 	f#a''
f
g2~mT*****s   	AB 
BBc                    || _         | j        rw|                                 }||j        j         z  }|j        5  |j                            | j        |                                           d d d            d S # 1 swxY w Y   d S d S r   )rE   rd   rB   r   r   set_input_volumer   )r   rG   rB   s      r   rF   zPulseAudioPlayer.set_volume  s    ; 	L[[]]Ff&..F L L//VDDIIKKKL L L L L L L L L L L L L L L L L L	L 	Ls   3A99A= A=c                     | j         j        j        }| j         5  | j                             t	          ||z                                                       d d d            d S # 1 swxY w Y   d S r   )rd   rb   rateupdate_sample_rateintr   )r   pitchsample_rates      r   	set_pitchzPulseAudioPlayer.set_pitch  s    k.3[ 	L 	LK**3u{/B+C+CDDIIKKK	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls   =A##A'*A'c                 2    |                      d            d S )N)rp   )rl   r   s    r   prefill_audiozPulseAudioPlayer.prefill_audio  s    T*****r    r   )r;   r<   r=   rE   r   rr   r}   r   r   ry   rl   rk   ro   r   r"   r   r   r   r   r   r   r   rF   r   r   __classcell__)ri   s   @r   r%   r%      s       G= = = = =8a a a( ( ( (&2 2 2S S S: : :& & & &P5 5 58 8 8(M M M  .
( 
( 
( 
( 
(           ! ! !FL L LL L L
+ + + + + + +r    r%   )r   pyglet.media.drivers.baser   r   pyglet.media.eventsr   pyglet.media.exceptionsr   pyglet.media.drivers.listenerr   pyglet.utilr    r
   r2   	interfacer   r   r   rh   r   r   r%   r>   r    r   <module>r      sH  H  N N N N N N N N * * * * * * 2 2 2 2 2 2 : : : : : : # # # # # # " " " " " " N N N N N N N N N N 
]	#	#8 8 8 8 8* 8 8 8v+ + + + +) + + +&f+ f+ f+ f+ f+* f+ f+ f+ f+ f+r    