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.

69 lines
1.8KB

  1. import dbus.service
  2. import gobject
  3. import dbus.mainloop.glib
  4. rr = None
  5. class reservation_t( dbus.service.Object ):
  6. def __init__( self, device_name, prio, override_cb=None ):
  7. self.dev_name = device_name
  8. self.prio = prio
  9. self.override_cb = override_cb
  10. self.bus = dbus.SessionBus()
  11. dbus.service.Object.__init__( self, None,
  12. "/org/freedesktop/ReserveDevice1/" + self.dev_name,
  13. dbus.service.BusName( "org.freedesktop.ReserveDevice1." + self.dev_name, bus=self.bus, allow_replacement=True, replace_existing=True, do_not_queue=True ) )
  14. @dbus.service.method( dbus_interface="org.freedesktop.ReserveDevice1", in_signature="i", out_signature="b" )
  15. def RequestRelease( self, prio ):
  16. if prio < self.prio:
  17. return False
  18. if self.override_cb:
  19. if self.override_cb( self.device_name ):
  20. self.connection.release_name( 'org.freedesktop.ReserveDevice1.' + self.dev_name )
  21. return True
  22. return False
  23. def unreserve (self):
  24. self.connection.release_name( 'org.freedesktop.ReserveDevice1.' + self.dev_name )
  25. rr.remove_from_connection()
  26. def reserve_dev( dev_name, prio, override_cb ):
  27. global rr
  28. try:
  29. session_bus = dbus.SessionBus()
  30. except Exception:
  31. return
  32. try:
  33. r_proxy = session_bus.get_object( "org.freedesktop.ReserveDevice1." + dev_name, "/org/freedesktop/ReserveDevice1/" + dev_name )
  34. r_iface = dbus.Interface( r_proxy, "org.freedesktop.ReserveDevice1" )
  35. except Exception:
  36. print "no other reservation exists. taking the name"
  37. rr = reservation_t( dev_name, prio, override_cb )
  38. return
  39. if not r_iface.RequestRelease( prio ):
  40. raise Exception
  41. rr = reservation_t( dev_name, prio, override_cb )
  42. dbus.mainloop.glib.threads_init()
  43. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  44. def run_main():
  45. loop = gobject.MainLoop()
  46. loop.run()