diff --git a/python/jackctl.py b/python/jackctl.py index c13b9b0..c56c9b0 100644 --- a/python/jackctl.py +++ b/python/jackctl.py @@ -54,6 +54,8 @@ class JSIter: 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) ] @@ -64,7 +66,7 @@ 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 = [ POINTER(jackctl_server_t), POINTER(jackctl_driver_t) ] +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 @@ -191,9 +193,15 @@ class Driver(object): name = property( get_name ) + class Server(object): def __init__( self ): - self.srv_ptr = jackctl_server_create( None, None ) + 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 ) @@ -218,3 +226,17 @@ class Server(object): 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) + + + diff --git a/python/jackd.py b/python/jackd.py old mode 100644 new mode 100755 index 594c3bd..02d9413 --- a/python/jackd.py +++ b/python/jackd.py @@ -1,10 +1,12 @@ #!/usr/bin/env python import sys -from mygetopt import my_getopt -import jackctl +from pyjackd.mygetopt import my_getopt +from pyjackd import jackctl import readline +import time +import reserve_audio argv = sys.argv[1:] @@ -75,8 +77,18 @@ def driver_parse_args( drv, argv ): else: p.value = optarg +def acquire_dev(cardname): + reserve_audio.reserve_dev(cardname,20,None) + time.sleep(0.1) + return True + +def release_dev(cardname): + reserve_audio.rr.unreserve() + reserve_audio.rr = None srv = jackctl.Server() +srv.acquire_card_cb = acquire_dev +srv.release_card_cb = release_dev drv, argv = server_parse_ags( srv, argv ) driver_parse_args( drv, argv ) @@ -90,7 +102,16 @@ driver_parse_args( drv, argv ) #for p in drv.params.values(): # print p.name, "-> ", p.value -srv.start( drv ) +started = srv.start( drv ) + +if not started: + print "failed to start with driver " + drv.name + print "trying to start with dummy driver, switch to the right master yourself" + + started = srv.start( srv.drivers["dummy"] ) + + if not started: + sys.exit(20) quit = False while not quit: diff --git a/python/reserve_audio.py b/python/reserve_audio.py index 5096600..d664d4c 100644 --- a/python/reserve_audio.py +++ b/python/reserve_audio.py @@ -31,6 +31,10 @@ class reservation_t( dbus.service.Object ): return False + def unreserve (self): + self.connection.release_name( 'org.freedesktop.ReserveDevice1.' + self.dev_name ) + rr.remove_from_connection() + def reserve_dev( dev_name, prio, override_cb ): global rr @@ -43,6 +47,7 @@ def reserve_dev( dev_name, prio, override_cb ): r_proxy = session_bus.get_object( "org.freedesktop.ReserveDevice1." + dev_name, "/org/freedesktop/ReserveDevice1/" + dev_name ) r_iface = dbus.Interface( r_proxy, "org.freedesktop.ReserveDevice1" ) except Exception: + print "no other reservation exists. taking the name" rr = reservation_t( dev_name, prio, override_cb ) return