jack1 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
4.8KB

  1. from ctypes import *
  2. class jack_client_t(Structure):
  3. pass
  4. class jack_port_t(Structure):
  5. pass
  6. client_p = POINTER(jack_client_t)
  7. port_p = POINTER(jack_port_t)
  8. libjack = cdll.LoadLibrary( "libjack.so" )
  9. client_new = libjack.jack_client_new
  10. client_new.argtypes = [ c_char_p ]
  11. client_new.restype = client_p
  12. client_close = libjack.jack_client_close
  13. client_close.argtypes = [ client_p ]
  14. client_close.restype = None
  15. activate = libjack.jack_activate
  16. activate.argtypes = [ client_p ]
  17. activate.restype = None
  18. deactivate = libjack.jack_deactivate
  19. deactivate.argtypes = [ client_p ]
  20. deactivate.restype = None
  21. get_ports = libjack.jack_get_ports
  22. get_ports.argtypes = [ client_p, c_char_p, c_char_p, c_ulong ]
  23. get_ports.restype = POINTER( c_char_p )
  24. port_by_name = libjack.jack_port_by_name
  25. port_by_name.argtypes = [ client_p, c_char_p ]
  26. port_by_name.restype = port_p
  27. port_get_all_connections = libjack.jack_port_get_all_connections
  28. port_get_all_connections.argtypes = [ client_p, port_p ]
  29. port_get_all_connections.restype = POINTER( c_char_p )
  30. jack_free = libjack.jack_free
  31. jack_free.argtypes = [ c_void_p ]
  32. jack_free.restype = None
  33. rename_client = libjack.jack_rename_client
  34. rename_client.argtypes = [ client_p, c_char_p, c_char_p ]
  35. rename_client.restype = c_int
  36. class jack_session_command_t( Structure ):
  37. _fields_ = [ ("uuid", 16*c_char ), ("command", 256*c_char ) ]
  38. session_notify = libjack.jack_session_notify
  39. session_notify.argtypes = [ client_p, c_uint, c_char_p ]
  40. session_notify.restype = POINTER( jack_session_command_t )
  41. get_client_name_by_uuid = libjack.jack_get_client_name_by_uuid
  42. get_client_name_by_uuid.argtypes = [ client_p, c_char_p ]
  43. get_client_name_by_uuid.restype = c_char_p
  44. get_cookie_by_uuid = libjack.jack_get_cookie_by_uuid
  45. get_cookie_by_uuid.argtypes = [ client_p, c_char_p, c_char_p ]
  46. get_cookie_by_uuid.restype = c_char_p
  47. PortRegistrationCallback = CFUNCTYPE( None, c_uint, c_int, c_void_p )
  48. set_port_registration_callback = libjack.jack_set_port_registration_callback
  49. set_port_registration_callback.argtypes = [ client_p, PortRegistrationCallback, c_void_p ]
  50. set_port_registration_callback.restype = c_int
  51. port_by_id = libjack.jack_port_by_id
  52. port_by_id.argtypes = [ client_p, c_uint ]
  53. port_by_id.restype = port_p
  54. port_name = libjack.jack_port_name
  55. port_name.argtypes = [ port_p ]
  56. port_name.restype = c_char_p
  57. port_type = libjack.jack_port_type
  58. port_type.argtypes = [ port_p ]
  59. port_type.restype = c_char_p
  60. port_flags = libjack.jack_port_flags
  61. port_flags.argtypes = [ port_p ]
  62. port_flags.restype = c_int
  63. JACK_DEFAULT_AUDIO_TYPE="32 bit float mono audio"
  64. JACK_DEFAULT_MIDI_TYPE="8 bit raw midi"
  65. JackPortIsInput = 0x1
  66. JackPortIsOutput = 0x2
  67. JackPortIsPhysical = 0x4
  68. JackPortCanMonitor = 0x8
  69. JackPortIsTerminal = 0x10
  70. class Port( object ):
  71. def __init__( self, client, name ):
  72. self.client = client
  73. self.name = name
  74. self.portname = name.split(':')[1]
  75. self.port_p = port_by_name( self.client, name )
  76. def get_connections( self ):
  77. conns = port_get_all_connections( self.client, self.port_p )
  78. i=0
  79. retval = []
  80. while conns[i]:
  81. retval.append( conns[i] )
  82. i+=1
  83. jack_free(conns)
  84. return retval
  85. class Client( object ):
  86. def __init__( self, client, name ):
  87. self.client = client
  88. self.name = name
  89. self.ports = []
  90. def add_port( self, portname ):
  91. self.ports.append( Port( self.client, portname ) )
  92. class JackGraph( object ):
  93. def __init__( self, client, ports, uuids=[] ):
  94. self.client = client
  95. self.clients = {}
  96. self.uuid_to_name = {}
  97. self.name_to_uuid = {}
  98. for uid in uuids:
  99. name = get_client_name_by_uuid( self.client, uid )
  100. if name:
  101. self.uuid_to_name[uid] = name
  102. self.name_to_uuid[name] = uid
  103. jack_free( name )
  104. i=0
  105. while(ports[i]):
  106. port_split = ports[i].split(':')
  107. if not self.clients.has_key(port_split[0]):
  108. self.clients[port_split[0]] = Client( client, port_split[0] )
  109. self.clients[port_split[0]].add_port( ports[i] )
  110. i+=1
  111. def get_client( self, name ):
  112. return self.clients[name]
  113. def get_client_by_uuid( self, uuid ):
  114. return self.clients[self.uuid_to_name[uuid]]
  115. class JackClient(object):
  116. def __init__( self, name ):
  117. self.client = client_new( name )
  118. self.reg_cb = PortRegistrationCallback( self.port_registration_cb )
  119. set_port_registration_callback( self.client, self.reg_cb, None )
  120. activate( self.client )
  121. def close( self ):
  122. client_close( self.client )
  123. def get_graph( self ):
  124. ports = get_ports( self.client, None, None, 0 )
  125. retval = JackGraph( self.client, ports )
  126. jack_free( ports )
  127. return retval
  128. def rename_client( self, old, new ):
  129. if rename_client( self.client, old, new ):
  130. raise Exception
  131. def port_registration_cb( self, port_id, reg, arg ):
  132. port_t = port_by_id( self.client, port_id )
  133. print port_name( port_t )
  134. print port_type( port_t )
  135. print reg