from ctypes import * libj = cdll.LoadLibrary( "libjack.so" ) libjs = cdll.LoadLibrary( "libjackserver.so" ) class jackctl_parameter_value( Union ): _fields_ = [ ( "ui", c_uint ), ( "i", c_int ), ( "c", c_char ), ( "ss", c_char * 128 ), ( "b", c_bool ) ] def get_str( self ): return buffer(self.ss) def set_str( self, sss ): self.ss = sss str = property( get_str, set_str ) class jackctl_server_t( Structure ): pass class jackctl_driver_t( Structure ): pass class jackctl_internal_t( Structure ): pass class jackctl_parameter_t( Structure ): pass class JSList( Structure ): pass JSList._fields_ = [ ("data", c_void_p), ("next", POINTER(JSList)) ] class JSIter: def __init__(self, ptr, typ=c_void_p): self.ptr = ptr self.typ = typ def __iter__(self): return self def next( self ): if not self.ptr: raise StopIteration retval = self.ptr.contents.data self.ptr = self.ptr.contents.next return cast( retval, self.typ ) DeviceAcquireFunc = CFUNCTYPE( c_int, c_char_p ) DeviceReleaseFunc = CFUNCTYPE( None, c_char_p ) jackctl_server_start = libjs.jackctl_server_start jackctl_server_start.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ] jackctl_server_start.restype = c_bool jackctl_server_stop = libjs.jackctl_server_stop jackctl_server_stop.argtypes = [ POINTER(jackctl_server_t) ] jackctl_server_stop.restype = c_bool jackctl_server_create = libjs.jackctl_server_create jackctl_server_create.argtypes = [ DeviceAcquireFunc, DeviceReleaseFunc ] jackctl_server_create.restype = POINTER(jackctl_server_t) jackctl_server_get_drivers_list = libjs.jackctl_server_get_drivers_list jackctl_server_get_drivers_list.argtypes = [ POINTER(jackctl_server_t) ] jackctl_server_get_drivers_list.restype = POINTER(JSList) jackctl_server_get_parameters = libjs.jackctl_server_get_parameters jackctl_server_get_parameters.argtypes = [ POINTER(jackctl_server_t) ] jackctl_server_get_parameters.restype = POINTER(JSList) jackctl_driver_get_parameters = libjs.jackctl_driver_get_parameters jackctl_driver_get_parameters.argtypes = [ POINTER(jackctl_driver_t) ] jackctl_driver_get_parameters.restype = POINTER(JSList) jackctl_driver_get_name = libjs.jackctl_driver_get_name jackctl_driver_get_name.argtypes = [ POINTER(jackctl_driver_t) ] jackctl_driver_get_name.restype = c_char_p jackctl_parameter_get_name = libjs.jackctl_parameter_get_name jackctl_parameter_get_name.argtypes = [ POINTER(jackctl_parameter_t) ] jackctl_parameter_get_name.restype = c_char_p jackctl_parameter_get_short_description = libjs.jackctl_parameter_get_short_description jackctl_parameter_get_short_description.argtypes = [ POINTER(jackctl_parameter_t) ] jackctl_parameter_get_short_description.restype = c_char_p jackctl_parameter_get_type = libjs.jackctl_parameter_get_type jackctl_parameter_get_type.argtypes = [ POINTER(jackctl_parameter_t) ] jackctl_parameter_get_type.restype = c_uint jackctl_parameter_set_value = libjs.jackctl_parameter_set_value jackctl_parameter_set_value.argtypes = [ POINTER(jackctl_parameter_t), POINTER(jackctl_parameter_value) ] jackctl_parameter_set_value.restype = c_bool jackctl_parameter_get_value = libjs.jackctl_parameter_get_value jackctl_parameter_get_value.argtypes = [ POINTER(jackctl_parameter_t) ] jackctl_parameter_get_value.restype = jackctl_parameter_value jackctl_parameter_get_id = libjs.jackctl_parameter_get_id jackctl_parameter_get_id.argtypes = [ POINTER(jackctl_parameter_t) ] jackctl_parameter_get_id.restype = c_char jackctl_server_switch_master = libjs.jackctl_server_switch_master jackctl_server_switch_master.argtypes = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ] jackctl_server_switch_master.restype = c_bool class Parameter(object): def __init__( self, param_ptr ): self.param_ptr = param_ptr self.param_type = jackctl_parameter_get_type( self.param_ptr ) def get_short_desc( self ): return jackctl_parameter_get_short_description( self.param_ptr ) short_desc = property( get_short_desc ) def get_name( self ): return jackctl_parameter_get_name( self.param_ptr ) name = property( get_name ) def get_id( self ): return jackctl_parameter_get_id( self.param_ptr ) id = property( get_id ) def set_value( self, val ): param_v = jackctl_parameter_value() if self.param_type == 1: # int param_v.i = int(val) elif self.param_type == 2: # uint param_v.ui = int(val) elif self.param_type == 3: # char assert( (type(val) == str) and len(val)==1 ) param_v.c = val elif self.param_type == 4: # string assert( type(val) == str ) param_v.ss = val elif self.param_type == 5: # bool assert( type(val) == bool ) param_v.b = val jackctl_parameter_set_value( self.param_ptr, pointer(param_v) ) def get_value( self ): param_v = jackctl_parameter_get_value( self.param_ptr ) if self.param_type == 1: # int return param_v.i elif self.param_type == 2: # uint return param_v.ui elif self.param_type == 3: # char return param_v.c elif self.param_type == 4: # string return param_v.ss elif self.param_type == 5: # bool return param_v.b value = property( get_value, set_value ) class Driver(object): def __init__( self, drv_ptr ): self.drv_ptr = drv_ptr params_jslist = jackctl_driver_get_parameters( self.drv_ptr ) self.params = {} for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ): self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i) def get_name( self ): return jackctl_driver_get_name( self.drv_ptr ) name = property( get_name ) class Server(object): def __init__( self ): self.dacqd = DeviceAcquireFunc(self.acquire_card) self.reled = DeviceReleaseFunc(self.release_card) self.srv_ptr = jackctl_server_create( self.dacqd, self.reled ) self.acquire_card_cb = None self.release_card_cb = None driver_jslist = jackctl_server_get_drivers_list( self.srv_ptr ) self.drivers = {} for i in JSIter( driver_jslist, POINTER(jackctl_driver_t) ): self.drivers[ jackctl_driver_get_name( i ) ] = Driver(i) params_jslist = jackctl_server_get_parameters( self.srv_ptr ) self.params = {} for i in JSIter( params_jslist, POINTER(jackctl_parameter_t) ): self.params[ jackctl_parameter_get_name( i ) ] = Parameter(i) def __del__( self ): pass def start( self, driver ): return jackctl_server_start( self.srv_ptr, driver.drv_ptr ) def switch_master( self, driver ): return jackctl_server_switch_master( self.srv_ptr, driver.drv_ptr ) def stop( self ): return jackctl_server_stop( self.srv_ptr ) def acquire_card( self, cardname ): if self.acquire_card_cb: return self.acquire_card_cb(cardname) else: return True def release_card( self, cardname ): if self.release_card_cb: self.release_card_cb(cardname)