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.

221 lines
6.4KB

  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. jackctl_server_start = libjs.jackctl_server_start
  39. jackctl_server_start.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  40. jackctl_server_start.restype = c_bool
  41. jackctl_server_stop = libjs.jackctl_server_stop
  42. jackctl_server_stop.argtypes = [ POINTER(jackctl_server_t) ]
  43. jackctl_server_stop.restype = c_bool
  44. jackctl_server_create = libjs.jackctl_server_create
  45. jackctl_server_create.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  46. jackctl_server_create.restype = POINTER(jackctl_server_t)
  47. jackctl_server_get_drivers_list = libjs.jackctl_server_get_drivers_list
  48. jackctl_server_get_drivers_list.argtypes = [ POINTER(jackctl_server_t) ]
  49. jackctl_server_get_drivers_list.restype = POINTER(JSList)
  50. jackctl_server_get_parameters = libjs.jackctl_server_get_parameters
  51. jackctl_server_get_parameters.argtypes = [ POINTER(jackctl_server_t) ]
  52. jackctl_server_get_parameters.restype = POINTER(JSList)
  53. jackctl_driver_get_parameters = libjs.jackctl_driver_get_parameters
  54. jackctl_driver_get_parameters.argtypes = [ POINTER(jackctl_driver_t) ]
  55. jackctl_driver_get_parameters.restype = POINTER(JSList)
  56. jackctl_driver_get_name = libjs.jackctl_driver_get_name
  57. jackctl_driver_get_name.argtypes = [ POINTER(jackctl_driver_t) ]
  58. jackctl_driver_get_name.restype = c_char_p
  59. jackctl_parameter_get_name = libjs.jackctl_parameter_get_name
  60. jackctl_parameter_get_name.argtypes = [ POINTER(jackctl_parameter_t) ]
  61. jackctl_parameter_get_name.restype = c_char_p
  62. jackctl_parameter_get_short_description = libjs.jackctl_parameter_get_short_description
  63. jackctl_parameter_get_short_description.argtypes = [ POINTER(jackctl_parameter_t) ]
  64. jackctl_parameter_get_short_description.restype = c_char_p
  65. jackctl_parameter_get_type = libjs.jackctl_parameter_get_type
  66. jackctl_parameter_get_type.argtypes = [ POINTER(jackctl_parameter_t) ]
  67. jackctl_parameter_get_type.restype = c_uint
  68. jackctl_parameter_set_value = libjs.jackctl_parameter_set_value
  69. jackctl_parameter_set_value.argtypes = [ POINTER(jackctl_parameter_t), POINTER(jackctl_parameter_value) ]
  70. jackctl_parameter_set_value.restype = c_bool
  71. jackctl_parameter_get_value = libjs.jackctl_parameter_get_value
  72. jackctl_parameter_get_value.argtypes = [ POINTER(jackctl_parameter_t) ]
  73. jackctl_parameter_get_value.restype = jackctl_parameter_value
  74. jackctl_parameter_get_id = libjs.jackctl_parameter_get_id
  75. jackctl_parameter_get_id.argtypes = [ POINTER(jackctl_parameter_t) ]
  76. jackctl_parameter_get_id.restype = c_char
  77. jackctl_server_switch_master = libjs.jackctl_server_switch_master
  78. jackctl_server_switch_master.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  79. jackctl_server_switch_master.restype = c_bool
  80. class Parameter(object):
  81. def __init__( self, param_ptr ):
  82. self.param_ptr = param_ptr
  83. self.param_type = jackctl_parameter_get_type( self.param_ptr )
  84. def get_short_desc( self ):
  85. return jackctl_parameter_get_short_description( self.param_ptr )
  86. short_desc = property( get_short_desc )
  87. def get_name( self ):
  88. return jackctl_parameter_get_name( self.param_ptr )
  89. name = property( get_name )
  90. def get_id( self ):
  91. return jackctl_parameter_get_id( self.param_ptr )
  92. id = property( get_id )
  93. def set_value( self, val ):
  94. param_v = jackctl_parameter_value()
  95. if self.param_type == 1:
  96. # int
  97. param_v.i = int(val)
  98. elif self.param_type == 2:
  99. # uint
  100. param_v.ui = int(val)
  101. elif self.param_type == 3:
  102. # char
  103. assert( (type(val) == str) and len(val)==1 )
  104. param_v.c = val
  105. elif self.param_type == 4:
  106. # string
  107. assert( type(val) == str )
  108. param_v.ss = val
  109. elif self.param_type == 5:
  110. # bool
  111. assert( type(val) == bool )
  112. param_v.b = val
  113. jackctl_parameter_set_value( self.param_ptr, pointer(param_v) )
  114. def get_value( self ):
  115. param_v = jackctl_parameter_get_value( self.param_ptr )
  116. if self.param_type == 1:
  117. # int
  118. return param_v.i
  119. elif self.param_type == 2:
  120. # uint
  121. return param_v.ui
  122. elif self.param_type == 3:
  123. # char
  124. return param_v.c
  125. elif self.param_type == 4:
  126. # string
  127. return param_v.ss
  128. elif self.param_type == 5:
  129. # bool
  130. return param_v.b
  131. value = property( get_value, set_value )
  132. class Driver(object):
  133. def __init__( self, drv_ptr ):
  134. self.drv_ptr = drv_ptr
  135. params_jslist = jackctl_driver_get_parameters( self.drv_ptr )
  136. self.params = {}
  137. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  138. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  139. def get_name( self ):
  140. return jackctl_driver_get_name( self.drv_ptr )
  141. name = property( get_name )
  142. class Server(object):
  143. def __init__( self ):
  144. self.srv_ptr = jackctl_server_create( None, None )
  145. driver_jslist = jackctl_server_get_drivers_list( self.srv_ptr )
  146. self.drivers = {}
  147. for i in JSIter( driver_jslist, POINTER(jackctl_driver_t) ):
  148. self.drivers[ jackctl_driver_get_name( i ) ] = Driver(i)
  149. params_jslist = jackctl_server_get_parameters( self.srv_ptr )
  150. self.params = {}
  151. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  152. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  153. def __del__( self ):
  154. pass
  155. def start( self, driver ):
  156. return jackctl_server_start( self.srv_ptr, driver.drv_ptr )
  157. def switch_master( self, driver ):
  158. return jackctl_server_switch_master( self.srv_ptr, driver.drv_ptr )
  159. def stop( self ):
  160. return jackctl_server_stop( self.srv_ptr )