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.

210 lines
6.1KB

  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_server_switch_master = libjs.jackctl_server_switch_master
  75. jackctl_server_switch_master.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ]
  76. jackctl_server_switch_master.restype = c_bool
  77. class Parameter(object):
  78. def __init__( self, param_ptr ):
  79. self.param_ptr = param_ptr
  80. self.param_type = jackctl_parameter_get_type( self.param_ptr )
  81. def get_short_desc( self ):
  82. return jackctl_parameter_get_short_description( self.param_ptr )
  83. short_desc = property( get_short_desc )
  84. def get_name( self ):
  85. return jackctl_parameter_get_name( self.param_ptr )
  86. name = property( get_name )
  87. def set_value( self, val ):
  88. param_v = jackctl_parameter_value()
  89. if self.param_type == 1:
  90. # int
  91. assert( type(val) == int )
  92. param_v.i = val
  93. elif self.param_type == 2:
  94. # uint
  95. assert( type(val) == int )
  96. param_v.ui = val
  97. elif self.param_type == 3:
  98. # char
  99. assert( (type(val) == str) and len(val)==1 )
  100. param_v.c = val
  101. elif self.param_type == 4:
  102. # string
  103. assert( type(val) == str )
  104. param_v.str = val
  105. elif self.param_type == 5:
  106. # bool
  107. assert( type(val) == bool )
  108. param_v.b = val
  109. jackctl_parameter_set_value( self.param_ptr, pointer(param_v) )
  110. def get_value( self ):
  111. param_v = jackctl_parameter_get_value( self.param_ptr )
  112. if self.param_type == 1:
  113. # int
  114. return param_v.i
  115. elif self.param_type == 2:
  116. # uint
  117. return param_v.ui
  118. elif self.param_type == 3:
  119. # char
  120. return param_v.c
  121. elif self.param_type == 4:
  122. # string
  123. return param_v.ss.value
  124. elif self.param_type == 5:
  125. # bool
  126. return param_v.b
  127. value = property( get_value, set_value )
  128. class Driver(object):
  129. def __init__( self, drv_ptr ):
  130. self.drv_ptr = drv_ptr
  131. params_jslist = jackctl_driver_get_parameters( self.drv_ptr )
  132. self.params = {}
  133. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  134. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  135. class Server(object):
  136. def __init__( self ):
  137. self.srv_ptr = jackctl_server_create( None, None )
  138. driver_jslist = jackctl_server_get_drivers_list( self.srv_ptr )
  139. self.drivers = {}
  140. for i in JSIter( driver_jslist, POINTER(jackctl_driver_t) ):
  141. self.drivers[ jackctl_driver_get_name( i ) ] = Driver(i)
  142. params_jslist = jackctl_server_get_parameters( self.srv_ptr )
  143. self.params = {}
  144. for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ):
  145. self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i)
  146. def __del__( self ):
  147. pass
  148. def start( self, driver ):
  149. return jackctl_server_start( self.srv_ptr, driver.drv_ptr )
  150. def switch_master( self, driver ):
  151. return jackctl_server_switch_master( self.srv_ptr, driver.drv_ptr )
  152. def stop( self ):
  153. return jackctl_server_stop( self.srv_ptr )