
    љi,                         S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
r
S SKr\R                  " \5      r " S S5      r " S S5      r " S S5      r " S	 S
5      rg)    N)AsyncGeneratorc                       \ rS rSrSS\S\4S jjrS\S\4S jrS\4S jrS\4S	 jr	S
\S\4S jr
S\S\4S jrS\S\4S jrSS\S\4S jjrSS\S\4S jjrS\4S jrS rS rSrg)AudioDevice   input_deviceoutput_devicec                 p   [         R                  " 5       U l        [        U[        5      (       a.  US:  a  U R                  5       nUS   nOPU R                  U5      nO>[        U[        5      (       a)  U R                  U5      nUc  U R                  5       nUS   nXl	        WU l
        [        U[        5      (       a.  US:  a  U R                  5       nUS   nOPU R                  U5      nO>[        U[        5      (       a)  U R                  U5      nUc  U R                  5       nUS   nX l        WU l        g )Nr   index)pyaudioPyAudio_p
isinstanceintget_default_input_device_infoget_device_infostrget_input_device_by_namer   input_device_infoget_default_output_device_infoget_output_device_by_namer   output_device_info)selfr   r   r   r   s        O/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/device/audio.py__init__AudioDevice.__init__   s$   //#lC((a$($F$F$H!09$($8$8$F!c** $ = =l K ($($F$F$H!,W5L(!2mS))q %)%H%H%J" 27 ;%)%9%9-%H"s++!%!?!?!N!)%)%H%H%J".w7M*"4    inforeturnc                     UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      S.nU$ )Nr
   namemaxInputChannelsmaxOutputChannelsdefaultSampleRate)r
   r    max_input_channelsmax_output_channelsdefault_sample_rate)get)r   r   
normalizeds      r   normalize_device_info!AudioDevice.normalize_device_info1   sP    XXg&HHV$"&((+=">#'88,?#@#'88,?#@

 r   c                     U R                   R                  5       nUR                  SS5      US'   U R                  U5      $ ! [         a;  nU R                  5       nU H  nUS   S:  d  M  Us  s S nA$    [	        S5      eS nAff = f)Nr
   r   r$   zInput devices not found)r   r   r'   r)   	Exceptionget_audio_devicesr   r   exdevicesds        r   r   )AudioDevice.get_default_input_device_info;   s    		77788:D HHWa0DM--d33 	7,,.G)*Q.H  566	7)   ?A 
BB,B/B5BBc                     U R                   R                  5       nUR                  SS5      US'   U R                  U5      $ ! [         a;  nU R                  5       nU H  nUS   S:  d  M  Us  s S nA$    [	        S5      eS nAff = f)Nr
   r   r%   zOutput devices not found)r   r   r'   r)   r,   r-   r.   s        r   r   *AudioDevice.get_default_output_device_infoG   s    		87799;D HHWa0DM--d33 	8,,.G*+a/H  677	8r3   r
   c                 b    U R                   R                  U5      nXS'   U R                  U5      $ Nr
   )r   get_device_info_by_indexr)   )r   r
   r   s      r   r   AudioDevice.get_device_infoS   s.    ww//6W))$//r   r    c                     U R                  5        H7  nUS   S:  d  M  UR                  5       US   R                  5       ;   d  M5  Us  $    g )Nr$   r   r    r-   lowerr   r    r1   s      r   r   $AudioDevice.get_input_device_by_nameX   sE    '')A%&*tzz|qy?P/P * r   c                     U R                  5        H7  nUS   S:  d  M  UR                  5       US   R                  5       ;   d  M5  Us  $    g )Nr%   r   r    r;   r=   s      r   r   %AudioDevice.get_output_device_by_name^   sE    '')A&'!+

&	@Q0Q * r   Npromptc                 H   [        S5        U R                  5        H$  nUS   S:  d  M  [        US    SUS    35        M&     [        U=(       d    S5      nUR                  5       S:X  a  U R	                  5       $ U R                  [        UR                  5       5      5      $ )	Nz==== Input devices ====r$   r   r
   : r    z*Input device index (Skip to use default):  )printr-   inputstripr   r   r   r   rA   r1   idxs       r   get_input_device_with_prompt(AudioDevice.get_input_device_with_promptd   s    '('')A%&*7Bqyk23 * FJJK99;"5577''CIIK(899r   c                 H   [        S5        U R                  5        H$  nUS   S:  d  M  [        US    SUS    35        M&     [        U=(       d    S5      nUR                  5       S:X  a  U R	                  5       $ U R                  [        UR                  5       5      5      $ )	Nz==== Output devices ====r%   r   r
   rC   r    z+Output device index (Skip to use default): rD   )rE   r-   rF   rG   r   r   r   rH   s       r   get_output_device_with_prompt)AudioDevice.get_output_device_with_prompto   s    ()'')A&'!+7Bqyk23 * FKKL99;"6688''CIIK(899r   c                     / nU R                   R                  5       n[        U5       HB  nU R                   R                  U5      nX4S'   UR	                  U R                  U5      5        MD     U$ r7   )r   get_device_countranger8   appendr)   )r   r0   countir   s        r   r-   AudioDevice.get_audio_devicesz   s`    ((*uA7733A6DMNN455d;<  r   c                 H    U R                  5        H  n[        U5        M     g N)r-   rE   )r   r1   s     r   list_audio_devicesAudioDevice.list_audio_devices   s    '')A!H *r   c                 8    U R                   R                  5         g rW   )r   	terminater   s    r   r[   AudioDevice.terminate   s    r   )r   r   r   r   r   )r^   rW   )__name__
__module____qualname____firstlineno__r   r   dictr)   r   r   r   r   r   r   rJ   rM   listr-   rX   r[   __static_attributes__ r   r   r   r      s    5S 5c 5B$ 4 
7t 
7
8 
80S 0T 0
S T c d 	:3 	:$ 	:	:C 	:4 	:4 r   r   c            	           \ rS rSrSS\S\4S jjrS\R                  4S jrSS\S	\S
\S\R                  4S jjr	S\
4S jrS rSS\
S\4S jjrS rSrg)AudioPlayer   device_index
chunk_sizec                 l   [         R                  " 5       U l         [        R                  " U R                  SS9U l        U R
                  R                  5         S U l        [        R                  " 5       U l
        S U l        Xl        X l        S U l        SU l        [        R                   " 5       U l        g )NT)targetdaemonF)queueQueue	threadingThreadprocess_queuethreadstartto_waver   r   pplay_streamrj   rk   wave_params
is_playingEvent
stop_event)r   rj   rk   s      r   r   AudioPlayer.__init__   s~    [[]
&&d.@.@N"($#//+r   current_paramsc                 0   U R                   S L =(       d    US L =(       dw    U R                   R                  UR                  :g  =(       dM    U R                   R                  UR                  :g  =(       d#    U R                   R                  UR                  :g  $ rW   )ry   	nchannels	sampwidth	framerate)r   r~   s     r   is_wave_params_changed"AudioPlayer.is_wave_params_changed   s    4' F>T+A F))^-E-EEF))^-E-EEF ))^-E-EE	Fr   Nsample_ratechannelssample_widthry   c           	      H   U R                   (       a;  U R                   R                  5         U R                   R                  5         S U l         X@l        U R                  R                  U R                  R                  U5      UUSU R                  U R                  S9U l         g )NT)formatr   rateoutputoutput_device_indexframes_per_buffer)	rx   stop_streamclosery   rw   openget_format_from_widthrj   rk   )r   r   r   r   ry   s        r   initilize_streamAudioPlayer.initilize_stream   s    ((*""$#D&66;;66//= $ 1 1"oo ' 
r   contentc                     U R                   R                  5         SU l        U R                  (       a  U R                  U5      nOUnU(       Ga  [        R
                  " [        R                  " U5      S5       nUR                  5       nU R                  (       a  U R                  U5      (       a0  U R                  UR                  UR                  UR                  US9  UR                  U R                   5      nU(       a_  U R                   R#                  5       (       a  O?U R                  R%                  U5        UR                  U R                   5      nU(       a  M_  S S S 5        O SU l        g ! , (       d  f       N= f! [&         a!  n[(        R+                  SU 3SS9   S nAN?S nAff = f! SU l        f = f)NTrb)r   r   r   ry   zError at play: )exc_infoF)r|   clearrz   rv   waver   ioBytesIO	getparamsrx   r   r   r   r   r   
readframesrk   is_setwriter,   loggererror)r   r   wave_contentwfr~   datar/   s          r   playAudioPlayer.play   sV   	$OO!!#"DO||#||G4&YYrzz,7>"%'\\^N++t/J/J>/Z/Z--(6(@(@%3%=%=)7)A)A(6	 .  ==9D??1133!((..t4!}}T__=	 $ ?> , $DO+ ?>"  	@LL?2$/$L?	@ $DOsU   A9F ;C'E6$F ,F5 6
F F F5 F 
F2F-(F5 -F22F5 5	F>c                      U R                   R                  5       u  pUc  g SU l        U(       a  U R                  U5        OU R                  R                  U5        SU l        Md  )NTF)ro   r'   rz   r   rx   r   )r   r   has_wave_headers      r   rs   AudioPlayer.process_queue   sU    $(JJNN$4!D|"DO		$  &&t,#DO r   audio_bytesr   c                 <    U R                   R                  X45        g rW   )ro   put)r   r   r   s      r   addAudioPlayer.add   s    

56r   c                     U R                   R                  5       (       d;  U R                   R                  5         U R                   R                  5       (       d  M;  U R                  R	                  5         g rW   )ro   emptyr'   r|   setr\   s    r   stopAudioPlayer.stop   sH    **""$$JJNN **""$$r   )
rk   rj   rz   rw   rx   ro   r|   rt   rv   ry   )i   rW   )F)r_   r`   ra   rb   r   r   r   _wave_paramsr   r   bytesr   rs   boolr   r   re   rf   r   r   rh   rh      s{    ,S ,c ,FT5F5F F
C 
3 
c 
`d`q`q 
  $E  $D
$7u 7t 7r   rh   c            	       P    \ rS rSrSS\S\S\S\4S jjrS\\S4   4S	 jrS
 r	Sr
g)AudioRecorder   r   rj   r   rk   c                 B    Xl         X0l        X@l        X l        SU l        g NF)r   r   rk   rj   is_listening)r   r   rj   r   rk   s        r   r   AudioRecorder.__init__   s     & $(!r   r   Nc           	     z  #    [         R                  " 5       nUR                  U R                  U R                  [         R
                  SU R                  U R                  S9nSU l         U R                  (       aN  UR                  U R                  SS97v   [        R                  " S5      I S h  vN   U R                  (       a  MN  UR                  5         UR                  5         [        R                  S5        g  NM! UR                  5         UR                  5         [        R                  S5        f = f7f)NT)r   r   r   rF   r   input_device_indexFexception_on_overflowg-C6?zPyAudio stream closed.)r   r   r   r   r   paInt16rk   rj   r   readasynciosleepr   r   r   r   )r   rw   pyaudio_streams      r   start_streamAudioRecorder.start_stream   s     OO!!]]??"oo#00   
 !	2##$))$//QV)WWmmF+++ ### &&(  "KK01	 ,&&(  "KK01s1   A'D;*AD 1C?2D 	6D;?D 7D88D;c                     SU l         g r   )r   r\   s    r   r   AudioRecorder.stop_stream  s
    !r   )r   rk   rj   r   r   )>  r^      i   )r_   r`   ra   rb   r   r   r   r   r   r   re   rf   r   r   r   r      s?    "C "s "SV "hk "2N5$;$? 2*"r   r   c                   j    \ rS rSrSS\S\S\4S jjrSS\R                  S\S\4S	 jjr	S\4S
 jr
Srg)NoiseLevelDetectori	  r   r   rj   c                 b    X l         Xl        X0l        [        U R                  S-  5      U l        g )Ng?)r   r   rj   r   chunk)r   r   r   rj   s       r   r   NoiseLevelDetector.__init__
  s'     	(T)*
r   r   refr   c                     [         R                  " [         R                  " U5      5      nUS:X  a  Sn[        S[         R                  " X2-  5      -  5      $ )Nr   r      )npmaxabsfloatlog10)r   r   r   	amplitudes       r   get_volume_db NoiseLevelDetector.get_volume_db  s?    FF266$<(	>IR"((9?3344r   c           	         [         R                  " 5       n UR                  [         R                  U R                  U R
                  SU R                  S:  a  U R                  OS U R                  S9n[        R                  " SS9n[        R                  S5          UR                  U R                  SS9n[        R                   " U[        R"                  S
9nU R%                  U5      n['        SUS S3SS9  UR)                  U5        [+        U5      UR,                  :X  aX  [        R.                  " U5      n['        SUS S35        UUR1                  5         UR3                  5         UR5                  5         $ M  ! [         a!  n[        R                  S	5         S nAGM	  S nAff = f! WR1                  5         UR3                  5         UR5                  5         f = f)NTr   )r   r   r   rF   r   r   <   )maxlenzMeasuring noise levels...Fr   zAudio buffer has overflowed)dtypez	Current: z.2fdB)endzNoise level: )r   r   r   r   r   r   rj   r   collectionsdequer   r   r   r,   warningr   
frombufferint16r   rE   rR   lenr   medianr   r   r[   )	r   rw   stream
audio_datar   eaudio_array	volume_db	median_dbs	            r   get_noise_level"NoiseLevelDetector.get_noise_level  s   OO 	VVYY8<8I8IQ8N4#4#4TX"&**  F %**"5JKK34!;;tzz;OD
 !mmDA ..{;		)C3>!!),z?j&7&77 "		* 5IM)C;<$  LLNKKM)  ! NN#@A  LLNKKMs=   BF- E? 8BF- =F- ?
F*	F%F- %F**F- -2G)r   r   rj   r   N)r   r   r^   )i   )r_   r`   ra   rb   r   r   r   ndarrayr   r   r   re   rf   r   r   r   r   	  sF    +S +C +3 +5"** 53 55 5" "r   r   )r   r   r   loggingnumpyr   ro   rq   typingr   r   r   	getLoggerr_   r   r   rh   r   r   rf   r   r   <module>r      sb      	     !  			8	$y yxZ Zz" "B/ /r   