
    ̺i-#                         S r SSKrSSKrSSKJrJrJr  SSKJr	  SS0r
S rS	 rS
 rS rS rS r " S S5      r " S S\\5      r " S S\\5      rg)z
Input and Output ports for PortMidi.

There is no need to use this module directly. All you need is
available in the toplevel module.

PortMidi documentation:
http://portmedia.sourceforge.net/portmidi/doxygen/
    N   )	BaseInput
BaseOutputsleep   )portmidi_init
port_countc                      [         S   S:X  a=  [        R                  R                  5         [        R                  R	                  5         g g )Nr	   r   )_statepmlibPm_TerminatePm_Initialize     U/var/www/piano.thomer.com/venv/lib/python3.13/site-packages/mido/backends/portmidi.py_refresh_port_listr      s6    lq  	
 !r   c                     U [         R                  :X  a-  [        SR                  [         R                  " 5       5      5      eU S:  a(  [        [         R
                  R                  U 5      5      eg)zgRaise IOError if return_value < 0.

The exception will be raised with the error message from PortMidi.
zPortMidi Host Error: {}r   N)r   pmHostErrorOSErrorformatget_host_error_messager   Pm_GetErrorText)return_values    r   _check_errorr       s^    
 r~~% !6"";";"=>@ 	@		bff,,\:;; 
r   c                 ^   [         R                  R                  U 5      nU(       d  [        SR	                  U 5      5      eUR
                  nU UR                  R                  S5      UR                  R                  S5      UR                  UR                  [        UR                  5      S.$ )Nz$PortMidi device with id={} not foundzutf-8)id	interfacenameis_input	is_outputopened)r   r   Pm_GetDeviceInfor   r   contentsr   decoder   r    r!   boolr"   )	device_idinfo_pointerinfos      r   _get_devicer*   ,   s    66**95L<CC  	  D ^^**73		  )MM^^t{{# r   c                     U (       a  [         R                  R                  5       nO[         R                  R                  5       nUS:  a  [	        S5      e[        U5      $ )Nr   zno default port found)r   r   Pm_GetDefaultInputDeviceIDPm_GetDefaultOutputDeviceIDr   r*   )	get_inputr'   s     r   _get_default_devicer/   =   sG    FF557	FF668	1}-..y!!r   c                     [        5        HI  nUS   U :w  a  M  U(       a  US   (       d  M!  OUS   (       d  M.  US   (       a  [        SU < 35      eUs  $    [        SU < 35      e)Nr   r    r!   r"   zport already opened: zunknown port )get_devicesr   )r   r.   devices      r   _get_named_devicer3   I   ss    -&>T! *% & +&(1$:;;  " dX.//r   c                      [        5         [        [        R                  R	                  5       5       Vs/ s H  n[        U5      PM     sn$ s  snf )z)Return a list of devices as dictionaries.)r   ranger   r   Pm_CountDevicesr*   )kwargsis     r   r1   r1   _   s8    $)"&&*@*@*B$CD$CqKN$CDDDs   Ac                   $    \ rS rSrSrS rS rSrg)
PortCommone   z6
Mixin with common things for input and output ports.
c                 v   [        5         UR                  S5      (       a  [        S5      e[        R                  " 5       U l        U R                  c   [        U R                  5      nUS   U l        O [        U R                  U R                  5      nUS   (       a;  U R                  (       a  SnOSn[        SR                  UU R                  5      5      eU R                  (       ay  [        [        R                  R                  [        R                   " U R
                  5      US   [        R"                  S	[        R$                  [        R"                  5      5        Oy[        [        R                  R'                  [        R                   " U R
                  5      US   [        R"                  S
[        R$                  [        R"                  S
5      5        SU l        [*        S==   S-  ss'   U R                  (       a  S U l        UR                  S5      U l        SR                  US   5      U l        g )Nvirtualz7virtual ports are not supported by the PortMidi backendr   r"   inputoutputz{} port {!r} is already openr   i  r   Fr	   r   callbackzPortMidi/{}r   )r   get
ValueErrorr   PortMidiStreamPtr_streamr   r/   r    r3   r   r   r   r   Pm_OpenInputctypesbyrefnullNullTimeProcPtrPm_OpenOutputclosedr   _threadr@   _device_type)selfr7   r2   devtypes       r   _openPortCommon._openi   s   ::i   8 9 9 ++-99(7FvDI&tyy$--@F(}}!"8??@D		K L L ==,,dll3++" # --dll3++  |!==DL"JJz2DM)001DEr   c                     S U l         [        [        R                  R	                  U R
                  5      5        [        S==   S-  ss'   g )Nr	   r   )r@   r   r   r   Pm_CloserD   r   rN   s    r   _closePortCommon._close   s2    RVV__T\\23|!r   )rM   rD   rL   r@   rK   r   N)__name__
__module____qualname____firstlineno____doc__rP   rU   __static_attributes__r   r   r   r:   r:   e   s    3Fj"r   r:   c                   n    \ rS rSrSrSS jr\S 5       r\R                  S 5       rS r	S r
S rS	 rS
rg)Input   z
PortMidi Input port
c                    Sn[         R                  U-  nU" 5       n[         R                  R                  U R                  5      (       a  Sn[         R                  R                  U R                  XE5      n[        U5        US   nUR                  S-  n[        S5       H(  n	US-  n
U R                  R                  U
5        US-  nM*     [         R                  R                  U R                  5      (       a  M  g g )Nr   r   l             )r   PmEventr   Pm_PollrD   Pm_Readr   messager5   _parser	feed_byte)rN   block
max_events
BufferTyperead_bufferlength
num_eventseventpacked_message_ibytes              r   _receiveInput._receive   s     
ZZ*,
 l ffnnT\\** FkJJ$  NE #]]Z7NAh%,&&t,1$ # ffnnT\\**r   c                     U R                   $ N)	_callbackrT   s    r   r@   Input.callback   s    ~~r   c                 X    Xl         Uc  U R                  5         g U R                  5         g rw   )rx   _stop_thread_start_thread)rN   funcs     r   r@   ry      s$    < r   c                     U R                   (       dV  SU l        [        R                  " U R                  S9U l         SU R                   l        U R                   R                  5         gg)z-Start callback thread if not already running.N)targetT)rL   _stop_event	threadingThread_thread_maindaemonstartrT   s    r   r|   Input._start_thread   sM    ||#D$++((*DL"&DLLLL  r   c                     U R                   (       a<  [        R                  " 5       U l        U R                  R	                  5         SU l         gg)z Stop callback thread if running.N)rL   r   Eventr   waitrT   s    r   r{   Input._stop_thread   s6    <<(0D!!#DL	 r   c                     U R                   (       dd  U R                  5         U R                   H'  nU R                  (       d  M  U R                  U5        M)     [	        5         U R                   (       d  Md  U R                   (       a  U R                   R                  5         g g ! U R                   (       a  U R                   R                  5         f f = frw   )r   rt   rh   r@   r   set)rN   rg   s     r   r   Input._thread_main   s    
	'&&#||G}}}g.  ,  &&&   $$&  t  $$&  s   ?B$ 0B$ $.Cc                 N    U R                  5         [        R                  U 5        g rw   )r{   r:   rU   rT   s    r   rU   Input._close   s    $r   )rx   r   rL   N)T)rW   rX   rY   rZ   r[   rt   propertyr@   setterr|   r{   r   rU   r\   r   r   r   r^   r^      sM    "%H   __! !! '( r   r^   c                       \ rS rSrSrS rSrg)Outputi  z
PortMidi output port
c                    UR                   S:X  ac  [        R                  " [        UR	                  5       5      5      nSn[        [        R                  R                  U R                  X25      5        g Sn[        UR                  5       5       H  nUS-  nXE-  nM     Sn[        [        R                  R                  U R                  UU5      5        g )Nsysexr   rc   )typerF   c_char_pbytesbinr   r   r   Pm_WriteSysExrD   reversedPm_WriteShort)rN   rg   string	timestamprq   rs   s         r   _sendOutput._send  s    <<7"__U7;;=%9:FI--dllINO N 11$& 2 I--dll.7.<> ?r   r   N)rW   rX   rY   rZ   r[   r   r\   r   r   r   r   r     s    ?r   r   )r[   rF   r   portsr   r   r    r   r   r   r   r   r*   r/   r3   r1   r:   r^   r   r   r   r   <module>r      sn   
   0 0 !
		<"	"0,E<" <"~[ J	 [ |?Z ?r   