
    |~g:3                        d dl  d dlmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlZd dlZd dlmZ d dlmZ 	  ed	      Z ed
      Zer&d dl mZmZmZ d dlmZ  G d de      Z G d de      Zej@                  Z e!ge _"        e!e _#        ejH                  Z$e!e$_#        e!ge$_"         G d de      Z% G d de      Z& G d de      Z' G d de(      Z) G d de(      Z* G d de+      Z, G d de+      Z- e.de!e/      Z0 e.de!e1e/      Z2e2Z3 e.de! e4e-      e1e/      Z5 e.de!e6e6e!      Z7ejp                  Z8e!e8_#        e!e9e9e3e/ge8_"        ejt                  Z:e!e:_#        e!e6e9e3e/ge:_"        ejv                  Z;e!e;_#        e!e6e5e/ge;_"        ejx                  Z<e!e<_#        e!e5e/ge<_"        ejz                  Z= e4e>      e=_#        e!e9ge=_"        ej~                  Z?e!e?_#        e!e1e3e/ge?_"        ej                  Z@e1e@_#        e!ge@_"        ej                  ZAdeA_#        e!geA_"        ej                  ZBdeB_#        e!geB_"        ej                  ZCdeC_#        e!geC_"        ej                  ZDdeD_#        e!geD_"        ej                  ZEdeE_#        e!e0e/geE_"        ej                  ZFe1eF_#        e!e9e1e!geF_"        ej                  ZGdeG_#        e!e7e!geG_"        ej                  ZHe!eH_#        e!e9geH_"         G d  d!ej                  e"      ZIy# e$ r	  ed      w xY w)#    )*)IntEnum)DictTYPE_CHECKINGListCallableMappingOptionalAny)GObject)GLibN)SingletonGObjectMeta)GSignalszlibpulse.so.0zlibpulse-mainloop-glib.so.0z(Could not load pulseaudio shared library)_FuncPointer_NamedFuncPointer_Pointer)	TypedDictc                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)CardProfileInfonamedescriptionn_sinks	n_sourcespriorityN)__name__
__module____qualname__str__annotations__int     >/usr/lib/python3/dist-packages/blueman/main/PulseAudioUtils.pyr   r      s    	r"   r   c                   d    e Zd ZU eed<   eeef   ed<   eed<   eed<   eed<   ee   ed<   eed<   y)	CardInfor   proplistowner_moduledriverindexprofilesactive_profileN)	r   r   r   r   r   r   r    r   r   r!   r"   r#   r%   r%      s6    	sCx. 
''r"   r%   c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	ContextStater                     N)
r   r   r   UNCONNECTED
CONNECTINGAUTHORIZINGSETTING_NAMEREADYFAILED
TERMINATEDr!   r"   r#   r-   r-   0   s%    KJKLEFJr"   r-   c                   D    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZy)	EventTyper   r.   r/   r0   r1   r2   r3      	             0   N)r   r   r   SINKSOURCE
SINK_INPUTSOURCE_OUTPUTMODULECLIENTSAMPLE_CACHESERVERCARDFACILITY_MASKNEWCHANGEREMOVE	TYPE_MASKr!   r"   r#   r<   r<   :   sH    DFJMFFLFDM
CFFIr"   r<   c                   8    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)SubscriptionMask)r   )r.   )r/   )r1   )   )r@   )rA   )@   )   )i   i  N)r   r   r   NULLrC   rD   INPUTrF   rG   rH   rI   rJ   rK   ALLr!   r"   r#   rR   rR   L   s9    DDFEMFFLFD
Cr"   rR   c                       e Zd Zy)	NullErrorNr   r   r   r!   r"   r#   rZ   rZ   Z       r"   rZ   c                       e Zd Zy)PANotConnectedNr[   r!   r"   r#   r^   r^   ^   r\   r"   r^   c                   .    e Zd ZdefdefdefdefdefgZy)PaCardProfileInfor   r   r   r   r   N)r   r   r   c_char_pc_uint32_fields_r!   r"   r#   r`   r`   b   s1    		!	H	h	XHr"   r`   c            
       X    e Zd Zdefdefdefdefdefd ee      fd ee      fdefgZy	)

PaCardInfor)   r   r'   r(   
n_profilesr*   r+   r&   N)	r   r   r   rb   ra   POINTERr`   c_void_prc   r!   r"   r#   re   re   l   sU    	(		"	8	x 	W./0	7#456	X	Hr"   re   c            
       Z    e Zd ZU ej                  j
                  ddfej                  j
                  ddfej                  j
                  deeffdZee	d<   d,dZ
ededd ddfd	       Zd
edeeef   fdZer G d de      Zdedddeddddf
dZdedef   deeededgdf   gdf   deed   egdf   deddf
dZdeegdf   dddeddfdZd-dZdeeedf   gdf   ddfd Zd!ededgdf   ddfd"Zd!ed#edeegdf   ddfd$Z ded%ed&ed'eddf
d(Z!d, fd)Z"defd*Z#d,d+Z$ xZ%S ).PulseAudioUtilsNr!   )	connecteddisconnectedevent__gsignals__returnc                 2    | j                   st        d      y )Nz2Connection to PulseAudio daemon is not established)rk   r^   selfs    r#   check_connectedzPulseAudioUtils.check_connected   s    ~~ !UVV r"   
pa_contextrr   c                 4   |sy t        |       }t        j                  |       |t        j                  k(  rRd|_        |j                  d       t        j                  t        j                  z  }|j                  d t        |       n$|j
                  r|j                  d       d|_        |j                  t        j                  k(  rH|t        j                  k(  r5t        j                  d       t        j                  d|j                          ||_        y )NTrk   c                 ,    t        j                  |       S N)logginginfo)xs    r#   <lambda>z2PulseAudioUtils.pa_context_event.<locals>.<lambda>   s    7<<? r"   rl   Fz-Pulseaudio probably crashed, restarting in 5si  )pa_context_get_staterx   ry   r-   r8   rk   emitrR   rK   rG   simple_callbackpa_context_subscribe
prev_stater9   r   timeout_addconnect_pulseaudio)rt   rr   statemasks       r#   pa_context_eventz PulseAudioUtils.pa_context_event   s    $Z0UL&&&!DNIIk"#((+;+B+BBD  !:!5!%' ~~		.)!&??l000Ul>Q>Q5QLLHIT4#:#:;r"   r&   c                    |rot        |d      }t        |t              }|j                  r8|j                  j	                  d      D cg c]  }|j                  d       c}ng }~t        |       ng }i }|D ]I  }|j	                  d      D cg c]  }|j                  d       }	}t        |	      dk(  s?|	d   ||	d   <   K |S c c}w c c}w )N   |UTF-8=z "r/   r.   r   )	pa_proplist_to_string_sepcastra   valuesplitdecodepa_xfreestriplen)
rr   r&   plaplproplsresultitemrz   spls
             r#   __get_proplistzPulseAudioUtils.__get_proplist   s    +Hd;Cc8$BLNHH288>>$3GH4$++g&HZ\BSMB 	(D+/::c?;a1775>;C;3x1}!$Qs1v	(
  I <s   CCc                   6    e Zd ZU ded<   eed   egdf   ed<   y)!PulseAudioUtils._ListCallbackInfor   cb_info_Pointer[PaCardInfo]Nhandler)r   r   r   r   r   r
   boolr!   r"   r#   _ListCallbackInfor      s#    ##x(>?FLMMr"   r   _context
entry_infor   eolry   c                 z    |r |d   |d       |r+ |d   d d       t         j                  t        |             y y )Nr   FT	pythonapi	Py_DecRef	py_object)rr   r   r   r   ry   s        r#   __list_callbackzPulseAudioUtils.__list_callback   s?    DOJ.DOD$'	$0 r"   func.cb_typer   r   argsc                      || j                         |d}t        j                  t        |             ||d   t        |      fz  } || j                  g| }t        |       y )N)r   r   r   )_PulseAudioUtils__list_callbackr   	Py_IncRefr   rt   pa_operation_unref)rr   r   r   r   r   ry   ops          r#   __init_list_callbackz$PulseAudioUtils.__init_list_callback  s]     #4#7#78WMIdO,i)D/22$//)D)2r"   r   c                 L   dt         dt        dddd ffd}t        |      }t        j	                  t        |             ||t        |      fz  } || j                  g| }|s4t        j                  d       t        j                  |j                         t        |       y )Nr   resdatar   ro   c                 R     |       t         j                  t        |             y rw   r   )r   r   r   r   s      r#   wrapperz0PulseAudioUtils.simple_callback.<locals>.wrapper  s    CL	$0r"   zOperation failed)rh   r    pa_context_index_cb_tr   r   r   rt   rx   ry   errorr   r   )rr   r   r   r   r   cbr   s    `     r#   r~   zPulseAudioUtils.simple_callback  s    	1h 	1S 	1 	14 	1 #7+IbM*Yr]##$//)D)LL+,MM$--(2r"   r%   c                    |d   j                   j                  d      | j                  |d   j                        |d   j                  |d   j
                  j                  d      |d   j                  t        d|d   j                        D cg c]  }|d   j                  |   j                   j                  d      |d   j                  |   j                  j                  d      |d   j                  |   j                  |d   j                  |   j                  |d   j                  |   j                  d c}|d   j                  d   j                   j                  d      dS c c}w )Nr   r   )r   r   r   r   r   )r   r&   r'   r(   r)   r*   r+   )r   r   _PulseAudioUtils__get_proplistr&   r'   r(   r)   rangerf   r*   r   r   r   r   r+   )rr   	card_infois      r#   __card_infozPulseAudioUtils.__card_info  sS   aL%%,,W5++IaL,A,AB%aL55l))009q\'' Q	! 7 78:  "!--a055<<WE(|44Q7CCJJ7S$Q<003;;&q\2215??%aL11!4== : (l99!<AAHHQ
 	
:s   B/E-callbackc                       j                          i dt        d   dt        dd f fd} j                  t        t
        |       y )Nr   r   endro   c                 V    |r	        y | J j                  |       }||d   <   y )Nr   _PulseAudioUtils__card_info)r   r   entryr   r   rr   s      r#   r   z+PulseAudioUtils.list_cards.<locals>.handler4  s:    )))$$Z0E"'Dvr"   )rs   r
   r   $_PulseAudioUtils__init_list_callbackpa_context_get_card_info_listpa_card_info_cb_t)rr   r   r   r   s   `` @r#   
list_cardszPulseAudioUtils.list_cards/  sM    &(	()? @ 	(t 	(PT 	( 	!!"?"3W	>r"   cardc                       j                          dt        d   dt        dd f fd} j                  t        t
        ||       y )Nr   r   r   ro   c                 B    |ry | J  j                  |              y rw   r   )r   r   r   rr   s     r#   r   z)PulseAudioUtils.get_card.<locals>.handlerD  s(    )))T%%j12r"   )rs   r
   r   r   !pa_context_get_card_info_by_indexr   )rr   r   r   r   s   ` ` r#   get_cardzPulseAudioUtils.get_cardA  sJ    	3)? @ 	3t 	3PT 	3 	!!"CEVX_aefr"   profilec                 R    | j                  |t        ||j                  d             y )Nr   )r~   $pa_context_set_card_profile_by_indexencode)rr   r   r   r   s       r#   set_card_profilez PulseAudioUtils.set_card_profileM  s$    X'KTSZSaSabiSjkr"   
event_typeidx	_userdatac                 ^    t        j                  | d|        | j                  d||       y )N rm   )rx   ry   r}   )rr   r   r   r   r   s        r#   __event_callbackz PulseAudioUtils.__event_callbackP  s)    
|1SE*+		':s+r"   c                 R   t         |           t        | j                        | _        d| _        t        t        j                        | _	        t        d       }t        |      | _        d | _        d| _        | j                          t!        j"                  | | j$                         y )NFr   )super__init__pa_context_subscribe_cb_t _PulseAudioUtils__event_callbackevent_cbrk   pa_context_notify_cb_trj   r   ctx_cbpa_glib_mainloop_newpa_glib_mainloop_get_apipa_mainloop_apirt   r   r   weakreffinalize
_on_delete)rr   mainloop	__class__s     r#   r   zPulseAudioUtils.__init__T  s~    1$2G2GH,_-M-MN'-7A!t/r"   c                    | j                   s| j                  rt        | j                         t        | j                  d      | _        | j                  st        d      t        j                  |       | _        t        | j                  | j                  | j                         t        | j                  d dd        t        | j                  | j                  d        y)Ns   BluemanzPA Context returned NULLr   F)rk   rt   pa_context_unrefpa_context_newr   rZ   r   proxyweakpa_context_set_state_callbackr   pa_context_connect!pa_context_set_subscribe_callbackr   rq   s    r#   r   z"PulseAudioUtils.connect_pulseaudioh  s    ~~ 1,T-A-A:NDO?? :;;d+DI)$//4;;		Rta>-doo.2mm.24 r"   c                     t        j                  d       t        | j                         t	        | j                         d | _        | `| `y )Nz#Destroying PulseAudioUtils instance)rx   ry   pa_context_disconnectrt   r   r   r   rq   s    r#   r   zPulseAudioUtils._on_delete{  s9    :;doo.)K r"   )ro   N)r   r   ro   r%   )&r   r   r   r   SignalFlagsNO_HOOKSr    rn   r   r   rs   staticmethodrh   r   r   r   r   r   r   r   c_intr   r   r
   r   r   r   r~   r   r	   r   r   r   r   r   r   r   __classcell__)r   s   @r#   rj   rj      se   ))22D"= ,,55tR@%%..sCjAL( W  X  5F  4    2x DcN & 	N	 	N1 1>T 1[` 1116:1#x-)@ 8U]_g3U<O_QRV_W VX UYZhUi Lj &.9O0PRV/WY]/]&^gjosxt'< DW `c hl  
">8WS*_-E,F,L#M >RV >$
gS 
gHj\45G,H 
gT 
glS l3 l(C5RV;BW l\` l, ,s , ,Ya ,fj ,0(D &	!r"   rj   )	metaclass)Jctypesenumr   typingr   r   r   r   r	   r
   r   gi.repositoryr   r   r   rx   blueman.gobjectr   blueman.bluemantypingr   CDLLlibpulselibpulse_glibOSErrorImportErrorr   r   r   typing_extensionsr   r   r%   r   rh   argtypesrestyper   r-   r<   rR   	ExceptionrZ   r^   	Structurer`   re   	CFUNCTYPEr   r   r   r   pa_context_success_cb_trg   r   rb   r   #pa_context_set_card_profile_by_namera   r   r   r   r   c_charr   r|   r   r   r   r   r   r   r   r   rj   r!   r"   r#   <module>r     s     N N N !    0 *BO$H67M @@+) 9  %99 !)
  '  (AA #+   %-J  !7  $w 		 		Y 		 
 
 #49= !$%C / dHgj.A5)T %dHh(S &.&R&R #.6 # +08(HNegp/q # ,'/'T'T $/7 $ ,198XOfhq0r $ -$,$N$N !,4 ! ).6BSU^-_ ! * ( F F (0  %*24Ey)Q  &$>> $+FO  !&.%9  "44 '  !)52I9 U  44 $  !)
   J  66  $  "*  ,,   %J  00 !  'j   ( F F (,  %*24JI)V  &00 "  '5(C  $,$N$N !,0 ! ).68QS[-\ ! *((! #X. F!goo1E F!]  B
@
AABs   K; ;L	