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.

243 lines
6.9KB

  1. from ctypes import *
  2. libj = cdll.LoadLibrary( "libjack.so" )
  3. libjs = cdll.LoadLibrary( "libjackserver.so" )
  4. class jackctl_parameter_value( Union ):
  5. _fields_ = [ ( "ui", c_uint ),
  6. ( "i", c_int ),
  7. ( "c", c_char ),
  8. ( "ss", c_char * 128 ),
  9. ( "b", c_bool ) ]
  10. def get_str( self ):
  11. return buffer(self.ss)
  12. def set_str( self, sss ):
  13. self.ss = sss
  14. str = property( get_str, set_str )
  15. class jackctl_server_t( Structure ):
  16. pass
  17. class jackctl_driver_t( Structure ):
  18. pass
  19. class jackctl_internal_t( Structure ):
  20. pass
  21. class jackctl_parameter_t( Structure ):
  22. pass
  23. class JSList( Structure ):
  24. pass
  25. JSList._fields_ = [ ("data", c_void_p), ("next", POINTER(JSList)) ]
  26. class JSIter:
  27. def __init__(self, ptr, typ=c_void_p):
  28. self.ptr = ptr
  29. self.typ = typ
  30. def __iter__(self):
  31. return self
  32. def next( self ):
  33. if not self.ptr:
  34. raise StopIteration
  35. retval = self.ptr.contents.data
  36. self.ptr = self.ptr.contents.next
  37. return cast( retval, self.typ )
  38. DeviceAcquireFunc = CFUNCTYPE( c_int, c_char_p )
  39. DeviceReleaseFunc = CFUNCTYPE( None, c_char_p )
  40. jackctl_server_start = libjs.jackctl_server_start
  41. jackctl_server_start.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  42. jackctl_server_start.restype = c_bool
  43. jackctl_server_stop = libjs.jackctl_server_stop
  44. jackctl_server_stop.argtypes = [ POINTER(jackctl_server_t) ]
  45. jackctl_server_stop.restype = c_bool
  46. jackctl_server_create = libjs.jackctl_server_create
  47. jackctl_server_create.argtypes = [ DeviceAcquireFunc, DeviceReleaseFunc ]
  48. jackctl_server_create.restype = POINTER(jackctl_server_t)
  49. jackctl_server_get_drivers_list = libjs.jackctl_server_get_drivers_list
  50. jackctl_server_get_drivers_list.argtypes = [ POINTER(jackctl_server_t) ]
  51. jackctl_server_get_drivers_list.restype = POINTER(JSList)
  52. jackctl_server_get_parameters = libjs.jackctl_server_get_parameters
  53. jackctl_server_get_parameters.argtypes = [ POINTER(jackctl_server_t) ]
  54. jackctl_server_get_parameters.restype = POINTER(JSList)
  55. jackctl_driver_get_parameters = libjs.jackctl_driver_get_parameters
  56. jackctl_driver_get_parameters.argtypes = [ POINTER(jackctl_driver_t) ]
  57. jackctl_driver_get_parameters.restype = POINTER(JSList)
  58. jackctl_driver_get_name = libjs.jackctl_driver_get_name
  59. jackctl_driver_get_name.argtypes = [ POINTER(jackctl_driver_t) ]
  60. jackctl_driver_get_name.restype = c_char_p
  61. jackctl_parameter_get_name = libjs.jackctl_parameter_get_name
  62. jackctl_parameter_get_name.argtypes = [ POINTER(jackctl_parameter_t) ]
  63. jackctl_parameter_get_name.restype = c_char_p
  64. jackctl_parameter_get_short_description = libjs.jackctl_parameter_get_short_description
  65. jackctl_parameter_get_short_description.argtypes = [ POINTER(jackctl_parameter_t) ]
  66. jackctl_parameter_get_short_description.restype = c_char_p
  67. jackctl_parameter_get_type = libjs.jackctl_parameter_get_type
  68. jackctl_parameter_get_type.argtypes = [ POINTER(jackctl_parameter_t) ]
  69. jackctl_parameter_get_type.restype = c_uint
  70. jackctl_parameter_set_value = libjs.jackctl_parameter_set_value
  71. jackctl_parameter_set_value.argtypes = [ POINTER(jackctl_parameter_t), POINTER(jackctl_parameter_value) ]
  72. jackctl_parameter_set_value.restype = c_bool
  73. jackctl_parameter_get_value = libjs.jackctl_parameter_get_value
  74. jackctl_parameter_get_value.argtypes = [ POINTER(jackctl_parameter_t) ]
  75. jackctl_parameter_get_value.restype = jackctl_parameter_value
  76. jackctl_parameter_get_id = libjs.jackctl_parameter_get_id
  77. jackctl_parameter_get_id.argtypes = [ POINTER(jackctl_parameter_t) ]
  78. jackctl_parameter_get_id.restype = c_char
  79. jackctl_server_switch_master = libjs.jackctl_server_switch_master
  80. jackctl_server_switch_master.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  81. jackctl_server_switch_master.restype = c_bool
  82. class Parameter(object):
  83. def __init__( self, param_ptr ):
  84. self.param_ptr = param_ptr
  85. self.param_type = jackctl_parameter_get_type( self.param_ptr )
  86. def get_short_desc( self ):
  87. return jackctl_parameter_get_short_description( self.param_ptr )
  88. short_desc = property( get_short_desc )
  89. def get_name( self ):
  90. return jackctl_parameter_get_name( self.param_ptr )
  91. name = property( get_name )
  92. def get_id( self ):
  93. return jackctl_parameter_get_id( self.param_ptr )
  94. id = property( get_id )
  95. def set_value( self, val ):
  96. param_v = jackctl_parameter_value()
  97. if self.param_type == 1:
  98. # int
  99. param_v.i = int(val)
  100. elif self.param_type == 2:
  101. # uint
  102. param_v.ui = int(val)
  103. elif self.param_type == 3:
  104. # char
  105. assert( (type(val) == str) and len(val)==1 )
  106. param_v.c = val
  107. elif self.param_type == 4:
  108. # string
  109. assert( type(val) == str )
  110. param_v.ss = val
  111. elif self.param_type == 5:
  112. # bool
  113. assert( type(val) == bool )
  114. param_v.b = val
  115. jackctl_parameter_set_value( self.param_ptr, pointer(param_v) )
  116. def get_value( self ):
  117. param_v = jackctl_parameter_get_value( self.param_ptr )
  118. if self.param_type == 1:
  119. # int
  120. return param_v.i
  121. elif self.param_type == 2:
  122. # uint
  123. return param_v.ui
  124. elif self.param_type == 3:
  125. # char
  126. return param_v.c
  127. elif self.param_type == 4:
  128. # string
  129. return param_v.ss
  130. elif self.param_type == 5:
  131. # bool
  132. return param_v.b
  133. value = property( get_value, set_value )
  134. class Driver(object):
  135. def __init__( self, drv_ptr ):
  136. self.drv_ptr = drv_ptr
  137. params_jslist = jackctl_driver_get_parameters( self.drv_ptr )
  138. self.params = {}
  139. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  140. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  141. def get_name( self ):
  142. return jackctl_driver_get_name( self.drv_ptr )
  143. name = property( get_name )
  144. class Server(object):
  145. def __init__( self ):
  146. self.dacqd = DeviceAcquireFunc(self.acquire_card)
  147. self.reled = DeviceReleaseFunc(self.release_card)
  148. self.srv_ptr = jackctl_server_create( self.dacqd, self.reled )
  149. self.acquire_card_cb = None
  150. self.release_card_cb = None
  151. driver_jslist = jackctl_server_get_drivers_list( self.srv_ptr )
  152. self.drivers = {}
  153. for i in JSIter( driver_jslist, POINTER(jackctl_driver_t) ):
  154. self.drivers[ jackctl_driver_get_name( i ) ] = Driver(i)
  155. params_jslist = jackctl_server_get_parameters( self.srv_ptr )
  156. self.params = {}
  157. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  158. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  159. def __del__( self ):
  160. pass
  161. def start( self, driver ):
  162. return jackctl_server_start( self.srv_ptr, driver.drv_ptr )
  163. def switch_master( self, driver ):
  164. return jackctl_server_switch_master( self.srv_ptr, driver.drv_ptr )
  165. def stop( self ):
  166. return jackctl_server_stop( self.srv_ptr )
  167. def acquire_card( self, cardname ):
  168. if self.acquire_card_cb:
  169. return self.acquire_card_cb(cardname)
  170. else:
  171. return True
  172. def release_card( self, cardname ):
  173. if self.release_card_cb:
  174. self.release_card_cb(cardname)