
    ^jb                     |   d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZ d dl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  ed          Zd Zd Z G d d          Z  G d dej!                  Z" G d dej!                  Z# G d d          Z$ G d d          Z% G d d          Z&dS )    N)defaultdict
namedtuple)POINTERbyrefc_charc_floatcastpointer)DWORDFLOAT)com)get_audio_device_manager)
DeviceFlow)MediaException)debug_print   )lib_xaudio2debug_mediac                     t          j                    }| j        |_        t	          | j        t          t                              |_        |S )zCreates a XAUDIO2_BUFFER to be used with a source voice.

    Audio data cannot be purged until the source voice has played it; doing so will cause glitches.
    )	libXAUDIO2_BUFFERlength
AudioBytesr	   r
   r   r   
pAudioData)
audio_databuffs     a/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/media/drivers/xaudio2/interface.pycreate_xa2_bufferr      s;    
 D 'DO:-wv??DOK    c                 8   | j         dk    s	| j        dvrt          d|            t          j                    }t          j        |_        | j         |_        | j        |_	        | j        |_
        |j
        |j        z  dz  |_        |j	        |j        z  |_        |S )N   )      zUnsupported audio format: r"   )channelssample_sizer   r   WAVEFORMATEXWAVE_FORMAT_PCM
wFormatTag	nChannelssample_ratenSamplesPerSecwBitsPerSamplenBlockAlignnAvgBytesPerSec)audio_formatwfxs     r   create_xa2_waveformatr1      s    q  L$<G$K$KH,HHIII



C(CN )CM%1C%1C(3=8A=CO,s>CJr   c                   2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
_VoiceResetterz'Manage a voice during its reset period.returnNc                 >    || _         || _        || _        || _        d S N)drivervoice	voice_keyremaining_data)selfr7   r8   r9   r:   s        r   __init__z_VoiceResetter.__init__/   s%    
",r   c                     | j         j        dk    r1| j        | j         j        _        | j                                          d S t          j                            | j	        d           d S Nr   )
r8   buffers_queuedflush_on_buffer_end	_callbackon_buffer_endflushpygletclockschedule_once_finishr;   s    r   runz_VoiceResetter.run5   s\    :$))151IDJ .JL&&t|Q77777r   c                     | j         j        dk    r@| j                                         t          j                            | j        d           d S d S r>   )r8   r?   r:   clearrD   rE   rF   rG   r;   _s     r   r@   z"_VoiceResetter.flush_on_buffer_end<   sO    :$))%%'''L&&t|Q77777 *)r   c                     d | j         j        _        | j         j        | j         _        | j                            | j         | j                   d S r6   )r8   rA   rB   samples_playedsamples_played_at_last_recycler7   _return_reset_voicer9   rL   s     r   rG   z_VoiceResetter._finishC   s@    -1
*48J4M
1''
DNCCCCCr   c                     t           j                            | j                   d | _        d | _        | j                                         d S r6   )rD   rE   
unschedulerG   r7   r8   r:   rK   rH   s    r   destroyz_VoiceResetter.destroyH   sC    ---
!!#####r   )r4   N)	__name__
__module____qualname____doc__r<   rI   r@   rG   rT    r   r   r3   r3   ,   sm        11- - - -8 8 88 8 8D D D
$ $ $ $ $r   r3   c                   @     e Zd Zej        gZ fdZd Zd Zd Z	 xZ
S )XA2EngineCallbackc                 V    t                                                       || _        d S r6   )superr<   _lock)r;   lock	__class__s     r   r<   zXA2EngineCallback.__init__R   s$    


r   c                 8    | j                                          d S r6   )r^   acquirerH   s    r   OnProcessingPassStartz'XA2EngineCallback.OnProcessingPassStartV       
r   c                 8    | j                                          d S r6   )r^   releaserH   s    r   OnProcessingPassEndz%XA2EngineCallback.OnProcessingPassEndY   rd   r   c                     | j                                         r| j                                          t          d|          )NzCritical Error:)r^   lockedrf   	Exception)r;   hresults     r   OnCriticalErrorz!XA2EngineCallback.OnCriticalError\   s?     : 	!J   )7333r   )rU   rV   rW   r   IXAudio2EngineCallback_interfaces_r<   rc   rg   rl   __classcell__r`   s   @r   r[   r[   O   sp        ./L        4 4 4 4 4 4 4r   r[   c                   >     e Zd ZdZej        gZ fdZd Zd Z	 xZ
S )XAudio2VoiceCallbackaQ  Callback class used to trigger when buffers or streams end.
           WARNING: Whenever a callback is running, XAudio2 cannot generate audio.
           Make sure these functions run as fast as possible and do not block/delay more than a few milliseconds.
           MS Recommendation:
           At a minimum, callback functions must not do the following:
                - Access the hard disk or other permanent storage
                - Make expensive or blocking API calls
                - Synchronize with other parts of client code
                - Require significant CPU usage
    c                 V    t                                                       d | _        d S r6   )r]   r<   rB   )r;   r`   s    r   r<   zXAudio2VoiceCallback.__init__r   s'    !r   c                 0    |                      |           d S r6   )rB   )r;   pBufferContexts     r   OnBufferEndz XAudio2VoiceCallback.OnBufferEndv   s    >*****r   c                 &    t          d|           )Nz&Error occurred during audio playback: )rj   )r;   ru   rk   s      r   OnVoiceErrorz!XAudio2VoiceCallback.OnVoiceErrory   s    JJJKKKr   )rU   rV   rW   rX   r   IXAudio2VoiceCallbackrn   r<   rv   rx   ro   rp   s   @r   rr   rr   e   st        	 	 -.L" " " " "+ + +L L L L L L Lr   rr   c                       e Zd ZdZej        Zej        ZdZ	dZ
d Zd ZdefdZddZed	             Zd
 Zd Zd Zd Zd Zed             Zej        d             Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"dS )XAudio2DriverTg       @c                 X   t          d          sJ d| _        d| _        d| _        t	          j                    | _        t          | j                  | _        g | _	        t          t                    | _        i | _        i | _        g | _        |                                  | j        rt%                      }|rrt          d          sJ |                    |            |                                t+          d          t,          j                            | j        d           dS dS dS )a.  Creates an XAudio2 master voice and sets up 3D audio if specified. This attaches to the default audio
        device and will create a virtual audio endpoint that changes with the system. It will not recover if a
        critical error is encountered such as no more audio devices are present.
        zConstructing XAudio2DriverNFzAudio device instance found.z5No default audio device found, can not create driver.g      ?)_debug	_listener_xaudio2_dead	threadingLockr_   r[   _engine_callback_emitting_voicesr   list_voice_pool_in_use_resetting_voices_players_create_xa2restart_on_errorr   push_handlersget_default_outputImportErrorrD   rE   schedule_interval_soft_check_state)r;   audio_devicess     r   r<   zXAudio2Driver.__init__   s4   
 233333
 N$$	 1$) < < "&t,,!#  		L466M L<=====++D111 3355=%&]^^^33D4EsKKKKK		L 		LL Lr   c                     | j         du r| j        r|                                  dS dS | j        sN|                                  | j        D ]}|                    d           | j                                         dS dS )zeHack/workaround, you cannot shutdown/create XA2 within a COM callback, set a schedule to check state.Ton_driver_resetN)r   r   _shutdown_xaudio2r   r   dispatch_eventrK   )r;   dtplayers      r   r   zXAudio2Driver._check_state   s    :} )&&((((() ) = &  """"m = =F))*;<<<<##%%%%%& &r   flowc                     |t           j        k    r>	 |t          d          sJ d| _        d S | j        rt          d          sJ d| _        d S d S d S )Nz8Error: Default audio device was removed or went missing.Tz8Warning: Default audio device added after going missing.F)r   OUTPUTr}   r   )r;   devicer   s      r   on_default_changedz XAudio2Driver.on_default_changed   st    :$$$t~XYYYYY!


: '!"\]]]]]!&DJJJ %$' 'r   Nc           	         t          j                    | _        	 t          j        t	          | j                  d| j                   n# t          $ r t          d          w xY wt          rqt          j	                    }d|_
        t           j        t           j        z  |_        t           j        |_        | j                            t	          |          d            | j                            | j                   t          j                    | _        t          j                    | _        | j                            t	          | j                  t           j        t           j        d|d | j                   | j                            t	          | j                             d | _        d | _        | j        r|                                  d S d S )Nr   z(XAudio2 driver could not be initialized.T)r   IXAudio2r   XAudio2Creater   	processorOSErrorr   r}   XAUDIO2_DEBUG_CONFIGURATIONLogThreadIDXAUDIO2_LOG_ERRORSXAUDIO2_LOG_WARNINGS	TraceMask	BreakMaskSetDebugConfigurationRegisterForCallbacksr   XAUDIO2_VOICE_DETAILS_mvoice_detailsIXAudio2MasteringVoice_master_voiceCreateMasteringVoiceXAUDIO2_DEFAULT_CHANNELSXAUDIO2_DEFAULT_SAMPLERATEcategoryGetVoiceDetails_x3d_handle_dsp_settingsallow_3d	enable_3d)r;   	device_iddebugs      r   r   zXAudio2Driver._create_xa2   s   	JeDM22At~FFFF 	J 	J 	JHIII	J  		D 355E $E!4s7OOEO!6EOM//edCCC**4+@AAA"8:: 799**51C+D+D+.+G+.+I+,it}	N 	N 	N 	**51E+F+FGGG!= 	NN	 	s   -A A"c                 4    | j                                         S r6   )r   keysrH   s    r   active_voiceszXAudio2Driver.active_voices   s    |  """r   c                    | j                                         D ]/}|D ]}|                                 |                                 0| j                                        D ]-\  }}|                                 |                                 .| j                                         | j        D ]}|                                 | j                                         dS )z"Destroy and clear all voice pools.N)r   valuesrT   rK   r   itemsr   r   )r;   list_r8   resetters       r   _destroy_voiceszXAudio2Driver._destroy_voices   s    %,,.. 	 	E    KKMMMM#5;;== 	 	OE8MMOOO$$&&&' 	 	EMMOOOOr   c                     |                                   |                     |j                   | j        D ]}|                    d           | j                                         dS )zAAttach XA2 with a specific device rather than the virtual device.r   N)r   r   idr   r   rK   )r;   r   r   s      r   
set_devicezXAudio2Driver.set_device  so       ### m 	5 	5F!!"34444r   c                     | j                                         D ]5}|                                 | j                            |j                   6|                                  dS )zAStops and destroys all active voices, then destroys XA2 instance.N)r   r   on_driver_destroyr   appendr   _delete_driver)r;   r   s     r   r   zXAudio2Driver._shutdown_xaudio2  sd    l))++ 	0 	0F$$&&&M  ////r   c                 h   | j         rt          d          sJ | j        r$t          j                            | j                   |                                  | j                             | j	                   | j         
                                 | j                                          d | _         d S d S )NzXAudio2Driver: Deleting)r   r}   r   rD   rE   rS   _calculate_3d_sourcesr   UnregisterForCallbacksr   
StopEngineReleaserH   s    r   r   zXAudio2Driver._delete_driver  s    = 	!344444} D''(BCCC   """M001FGGGM$$&&&M!!### DMMM	! 	!r   c                     t                      }| j                            t          |                     t	          j                    | _        t	          j        |j        t          j	        | j                   t          | j        j        z              }t	          j                    | _        d| j        _        | j        j        | j        _        || j        _        t$          j                            | j        d           dS )z`Initializes the prerequisites for 3D positional audio and initializes with default DSP settings.r   g?N)r   r   GetChannelMaskr   r   X3DAUDIO_HANDLEr   X3DAudioInitializevalueX3DAUDIO_SPEED_OF_SOUNDr   r   InputChannelsX3DAUDIO_DSP_SETTINGSr   SrcChannelCountDstChannelCountpMatrixCoefficientsrD   rE   r   r   )r;   channel_maskmatrixs      r   r   zXAudio2Driver.enable_3d)  s    ww))%*=*=>>>.00|133NPTP`aaa$.<<?? 688-.*-1-A-O*17.++D,FQQQQQr   c                 z    t                      }| j                            t          |                     |j        S r6   )r   r   	GetVolumer   r   r;   vols     r   volumezXAudio2Driver.volume9  s0    ii$$U3ZZ000yr   c                 <    | j                             |d           dS )z'Sets global volume of the master voice.r   N)r   	SetVolumer;   r   s     r   r   zXAudio2Driver.volume?  s#     	$$UA.....r   c                 z    | j         D ]}|                     |d           | j                            d           dS )ziWe calculate the 3d emitters and sources every 15 fps, committing everything after deferring all changes.r   N)r   _apply3dr   CommitChanges)r;   r   source_voices      r   r   z#XAudio2Driver._calculate_3d_sourcesD  sG     1 	+ 	+LMM,****##A&&&&&r   c                 x    | j         2|                     |d           | j                            d           dS dS )zJApply and immediately commit positional audio effects for the given voice.Nr!   )r   r   r   r   )r;   r   s     r   apply3dzXAudio2Driver.apply3dK  sC    'MM,***M''***** ('r   c                 4   t          j        | j        | j        j        |j        t           j        | j                   |j        	                    | j
        d| j        j        | j        j        |           |j                            | j        j        |           dS )a  Calculates and sets output matrix and frequency ratio on the voice based on the listener and the voice's
           emitter. Commit determines the operation set, whether the settings are applied immediately (0) or to
           be committed together at a later time.
        r   N)r   X3DAudioCalculater   r~   listener_emitterdefault_dsp_calculationr   _voiceSetOutputMatrixr   r   r   r   SetFrequencyRatioDopplerFactor)r;   r   commits      r   r   zXAudio2Driver._apply3dQ  s    
 	N#!'	
 	
 	
 	++D,>,-,0,@,N,0,>,R,2		4 	4 	4 	--d.@.NPVWWWWWr   c                 v    |                                   t          j                            | j                   d S r6   )r   rD   rE   rS   r   rH   s    r   deletezXAudio2Driver.deletee  s3     122222r   c                 z    t          j                    }| j                            t	          |                     |S )zTRetrieve some basic XAudio2 performance data such as memory usage and source counts.)r   XAUDIO2_PERFORMANCE_DATAr   GetPerformanceDatar   )r;   pfs     r   get_performancezXAudio2Driver.get_performancei  s1    )++((r333	r   c                 Z    | j         
J d            t          |           | _         | j         S )Nz!You can only create one listener.)r~   XAudio2ListenerrH   s    r   create_listenerzXAudio2Driver.create_listenero  s0    ~%%'J%%%(..~r   c                 "   |j         r| j                            |           | j                            |           t          d| d          sJ |j        |j        f}t          | |||          }|| j	        |<   |
                                 dS )ab  Reset a voice and eventually return it to the pool. The voice must be stopped.
        `remaining_data` should contain the data this voice's remaining
        buffers point to.
        It will be `.clear()`ed shortly after as soon as the flush initiated
        by the driver completes in order to not have theoretical dangling
        pointers.
        zXA2AudioDriver: Resetting z...N)
is_emitterr   remover   popr}   channel_countr%   r3   r   rI   )r;   r8   r:   r9   r   s        r   return_voicezXAudio2Driver.return_voicet  s      	0!((///=5===>>>>>(%*;<	!$y.II(0u%r   c                     | j                             |                                           | j        |                             |           t          d| d          sJ d S )NzXA2AudioDriver: z back in pool)r   r   rT   r   r   r}   )r;   r8   r9   s      r   rQ   z!XAudio2Driver._return_reset_voice  sg    ""5))11333#**5111====>>>>>>>r   c                    |j         |j        f}| j        |         sI|                     |          }| j        |                             |                     |                     n| j        |                                         }|j        dk    sJ |                    |j        |j	                   |j
        r| j                            |           || j        |<   |S )zGet a source voice from the pool. Source voice creation can be slow to create/destroy.
        So pooling is recommended. We pool based on audio channels.
        A source voice handles all of the audio playing and state for a single source.r   )r$   r%   r   _create_new_voicer   r   r?   acquiredrB   r*   r   r   r   )r;   r/   r   r9   r8   s        r   get_source_voicezXAudio2Driver.get_source_voice  s    
 "*L,DE		* 	6**<88E Y'..t/E/El/S/STTTT$Y/3355E#q((((v+\-EFFF 	0!((///$Ur   c           	         t          j                    }t          |          }t                      }| j                            t          |          t          |          d| j        |dd           t          |||j	        |j
                  S )zDHas the driver create a new source voice for the given audio format.r   N)r   IXAudio2SourceVoicer1   rr   r   CreateSourceVoicer   max_frequency_ratioXA2SourceVoicer$   r%   )r;   r/   r8   
wfx_formatcallbacks        r   r  zXAudio2Driver._create_new_voice  s    '))*<88
'))''e(-j(9(9()(,(@(0(,(,	. 	. 	. eX|/DlF^___r   r6   )#rU   rV   rW   r   r   XAUDIO2_DEFAULT_PROCESSORr   AudioCategory_GameEffectsr   r   r  r<   r   r   r   r   propertyr   r   r   r   r   r   r   setterr   r   r   r   r   r   r  rQ   r  r  rY   r   r   r{   r{   }   s       H -I ,H  )L )L )LV& & &	'z 	' 	' 	' 	'       D # # X#   	 	 	  ! ! !R R R    X
 ]/ / ]/' ' '+ + +X X X(3 3 3    
  $? ? ?
  0` ` ` ` `r   r{   c                   ,   e Zd Zd Zd Zd Zed             Zed             Zed             Z	e	j
        d             Z	ed             Zed	             Zej
        d
             Zed             Zej
        d             Zed             Zej
        d             Zed             Zej
        d             Z edddg          Zed             Zd Zed             Zej
        d             Zed             Zej
        d             Zd Zd Zd Zd ZdS )r  c                 x   t          j                    | _        || _        || _        || _        || _        d| _        |dk    rqt          j                    | _	        || j	        _
        d| j	        _        t          j                    }d|_        t          |          | j	        _        d | j	        _        d S d | _	        d S )Nr   r   g      ?)r   XAUDIO2_VOICE_STATE_voice_stater   rA   r  r%   rP   X3DAUDIO_EMITTERr   ChannelCountCurveDistanceScalerX3DAUDIO_CONEInnerVolumer
   pConepVolumeCurve)r;   r8   r  r  r%   cones         r   r<   zXA2SourceVoice.__init__  s    355!*& /0+ A022DM)6DM&03DM- $&&D  #D #*$--DM)-DM&&& DMMMr   c                 p    d| _         | j         | j                                         d| _        d| _        dS )zCompletely destroy the voice.N)r   r   DestroyVoicerA   rH   s    r   rT   zXA2SourceVoice.destroy  s7    ;"K$$&&&DKr   c                 R    || j         _        | j                            |           dS )z\A voice has been acquired. Set the callback as well as its new sample
        rate.
        N)rA   rB   r   SetSourceSampleRate)r;   on_buffer_end_cbr*   s      r   r  zXA2SourceVoice.acquired  s*     (8$''44444r   c                     | j                             t          | j                  t          j                   | j        j        S )z_Get the amount of buffers in the current voice. Adding flag for no samples played is 3x faster.)r   GetStater   r  r   XAUDIO2_VOICE_NOSAMPLESPLAYEDBuffersQueuedrH   s    r   r?   zXA2SourceVoice.buffers_queued  s6     	U4#455s7XYYY ..r   c                 t    | j                             t          | j                  d           | j        j        S )z.Get the amount of samples played by the voice.r   )r   r%  r   r  SamplesPlayedrH   s    r   rO   zXA2SourceVoice.samples_played  s3     	U4#455q999 ..r   c                 z    t                      }| j                            t          |                     |j        S r6   )r   r   r   r   r   r   s     r   r   zXA2SourceVoice.volume  s/    iieCjj)))yr   c                 <    | j                             |d           d S r>   )r   r   r   s     r   r   zXA2SourceVoice.volume  s     eQ'''''r   c                     | j         d uS r6   )r   rH   s    r   r   zXA2SourceVoice.is_emitter  s    }D((r   c                 x    | j         r2| j        j        j        | j        j        j        | j        j        j        fS dS )Nr   r   r   r   r   PositionxyzrH   s    r   positionzXA2SourceVoice.position   s6    ? 	=)+T]-C-Et}G]G___7r   c                     | j         r;|\  }}}|| j        j        _        || j        j        _        || j        j        _        d S d S r6   r/  )r;   r4  r1  r2  r3  s        r   r4  zXA2SourceVoice.position  sN    ? 	)GAq!'(DM"$'(DM"$'(DM"$$$		) 	)r   c                 ,    | j         r| j        j        S dS )zCurve distance scaler that is used to scale normalized distance curves to user-defined world units,
        and/or to exaggerate their effect.r   )r   r   r  rH   s    r   min_distancezXA2SourceVoice.min_distance  s     ? 	=441r   c                     | j         r6| j        j        |k    r(t          |t          j                  | j        _        d S d S d S r6   )r   r   r  minr   FLT_MAXr   s     r   r7  zXA2SourceVoice.min_distance  sK    ? 	L}0E9947s{4K4K111	L 	L99r   c                 z    t                      }| j                            t          |                     |j        S )z[The actual frequency ratio. If voice is 3d enabled, will be overwritten next apply3d cycle.)r   r   GetFrequencyRatior   r   r   s     r   	frequencyzXA2SourceVoice.frequency  s1     		%%eEll333{r   c                 V    | j         |k    rd S | j                            |d           d S r>   )r=  r   r   r   s     r   r=  zXA2SourceVoice.frequency%  s2    >U""F%%eQ/////r   c                 x    | j         r2| j        j        j        | j        j        j        | j        j        j        fS dS )z%The orientation of the sound emitter.r.  r   r   OrientFrontr1  r2  r3  rH   s    r   cone_orientationzXA2SourceVoice.cone_orientation,  s8     ? 	=,.0I0KT]MfMhhh7r   c                     | j         r;|\  }}}|| j        j        _        || j        j        _        || j        j        _        d S d S r6   r@  r;   r   r1  r2  r3  s        r   rB  zXA2SourceVoice.cone_orientation4  sN    ? 	,GAq!*+DM%'*+DM%'*+DM%'''		, 	,r   _ConeAnglesinsideoutsidec                     | j         r>|                     | j        j        j        j        | j        j        j        j                  S |                     dd          S );The inside and outside angles of the sound projection cone.r   )r   rE  r   r  contents
InnerAngle
OuterAnglerH   s    r   cone_angleszXA2SourceVoice.cone_angles>  sP     ? 	*##DM$7$@$KT]M`MiMtuuu##Aq)))r   c                 p    | j         r.|| j        j        j        _        || j        j        j        _        dS dS )rI  N)r   r   r  rJ  rK  rL  )r;   rF  rG  s      r   set_cone_angleszXA2SourceVoice.set_cone_anglesF  s<    ? 	>6<DM(36=DM(333	> 	>r   c                 @    | j         r| j        j        j        j        S dS )z5The volume scaler of the sound beyond the outer cone.r   r   r   r  rJ  OuterVolumerH   s    r   cone_outside_volumez"XA2SourceVoice.cone_outside_volumeL  $     ? 	=&/;;1r   c                 D    | j         r|| j        j        j        _        d S d S r6   rQ  r   s     r   rS  z"XA2SourceVoice.cone_outside_volumeT  ,    ? 	=7<DM(444	= 	=r   c                 @    | j         r| j        j        j        j        S dS )z5The volume scaler of the sound within the inner cone.r   r   r   r  rJ  r  rH   s    r   cone_inside_volumez!XA2SourceVoice.cone_inside_volumeY  rT  r   c                 D    | j         r|| j        j        j        _        d S d S r6   rX  r   s     r   rY  z!XA2SourceVoice.cone_inside_volumea  rV  r   c                 n    | j                             dd           | j                                          dS )zLStop and removes all buffers already queued. OnBufferEnd is called for each.r   N)r   StopFlushSourceBuffersrH   s    r   rC   zXA2SourceVoice.flushf  s4    A&&(((((r   c                 <    | j                             dd           d S r>   )r   StartrH   s    r   playzXA2SourceVoice.playk  s     !Qr   c                 <    | j                             dd           d S r>   )r   r\  rH   s    r   stopzXA2SourceVoice.stopn  s     Ar   c                 V    | j                             t          |          d            d S r6   )r   SubmitSourceBufferr   )r;   	x2_buffers     r   submit_bufferzXA2SourceVoice.submit_bufferq  s(    &&uY'7'7>>>>>r   N)rU   rV   rW   r<   rT   r  r  r?   rO   r   r  r   r4  r7  r=  rB  r   rE  rM  rO  rS  rY  rC   r`  rb  rf  rY   r   r   r  r    s       ! ! !@  5 5 5 / / X/
 / / X/
   X
 ]( ( ]( ) ) X)   X _) ) _)   X L L L
   X 0 0 0   X , , , *]Xy,ABBK* * X*> > >   X = =  =   X = = =) ) )
       ? ? ? ? ?r   r  c                       e Zd Zd Zd Zed             Zej        d             Zed             Zej        d             ZdS )r   c                 4   t          j        |          | _        t          j                    | _        d| j        j        _        d| j        j        _        d| j        j        _	        d| j        j
        _        d| j        j
        _        d| j        j
        _	        d S )Nr   r   )weakrefproxy
xa2_driverr   X3DAUDIO_LISTENERr   rA  r1  r2  r3  	OrientTop)r;   r7   s     r   r<   zXAudio2Listener.__init__v  sy    !-//-// '(!#&'!#&'!#$%!$%!$%!!!r   c                     d | _         d S r6   )r   rH   s    r   r   zXAudio2Listener.delete  s    r   c                 f    | j         j        j        | j         j        j        | j         j        j        fS r6   r   r0  r1  r2  r3  rH   s    r   r4  zXAudio2Listener.position  s'    }%')?)A4=CYC[[[r   c                 x    |\  }}}|| j         j        _        || j         j        _        || j         j        _        d S r6   rp  rD  s        r   r4  zXAudio2Listener.position  s:    1a#$ #$ #$   r   c                     | j         j        j        | j         j        j        | j         j        j        | j         j        j        | j         j        j        | j         j        j        fS r6   r   rA  r1  r2  r3  rm  rH   s    r   orientationzXAudio2Listener.orientation  sL    }(*DM,E,GIbId}&($-*A*CT]E\E^_ 	_r   c                     |\  }}}}}}|| j         j        _        || j         j        _        || j         j        _        || j         j        _        || j         j        _        || j         j        _        d S r6   rs  )r;   rt  front_xfront_yfront_ztop_xtop_ytop_zs           r   rt  zXAudio2Listener.orientation  sh    9D6'5%&-!#&-!#&-!#$)!$)!$)!!!r   N)	rU   rV   rW   r<   r   r  r4  r  rt  rY   r   r   r   r   u  s        & & &   \ \ X\ _% % _% _ _ X_ 	* 	* 	* 	* 	*r   r   )'r   ri  collectionsr   r   ctypesr   r   r   r   r	   r
   ctypes.wintypesr   r   rD   pyglet.libs.win32r   pyglet.media.devicesr   pyglet.media.devices.baser   pyglet.media.exceptionsr   pyglet.utilr    r   r   r}   r   r1   r3   	COMObjectr[   rr   r{   r  r   rY   r   r   <module>r     sA        / / / / / / / / A A A A A A A A A A A A A A A A ( ( ( ( ( ( ( (  ! ! ! ! ! ! 9 9 9 9 9 9 0 0 0 0 0 0 2 2 2 2 2 2 # # # # # #            	]	#	#     $  $  $  $  $  $  $  $F4 4 4 4 4 4 4 4,L L L L L3= L L L0t` t` t` t` t` t` t` t`n	~? ~? ~? ~? ~? ~? ~? ~?B,* ,* ,* ,* ,* ,* ,* ,* ,* ,*r   