Skip to content

Commit

Permalink
Improvements to pairing agent in demo code. Bug fixes in audio codec.
Browse files Browse the repository at this point in the history
  • Loading branch information
liamw9534 committed Sep 1, 2014
1 parent 335d75b commit 9aac5be
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 31 deletions.
2 changes: 1 addition & 1 deletion bt_manager/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import cffi
import os

__version__ = '0.3.0'
__version__ = '0.3.1'

if StrictVersion(cffi.__version__) < StrictVersion('0.7'):
raise RuntimeError(
Expand Down
46 changes: 28 additions & 18 deletions bt_manager/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ def __init__(self, uuid, path):
codec = dbus.Byte(A2DP_CODECS['SBC'])
delayed_reporting = dbus.Boolean(True)
self.tag = None
self.path = None
self.user_cb = None
self.user_arg = None
self.properties = dbus.Dictionary({'UUID': uuid,
'Codec': codec,
'DelayReporting': delayed_reporting,
Expand All @@ -183,9 +186,24 @@ def _transport_ready_handler(self, fd, cb_condition):
Wrapper for calling user callback routine to notify
when transport data is ready to read
"""
self.user_cb(self.user_arg)
if(self.user_cb):
self.user_cb(self.user_arg)
return True

def _install_transport_ready(self):
if ('r' in self.access_type):
io_event = gobject.IO_IN
else:
io_event = gobject.IO_OUT

self.tag = gobject.io_add_watch(self.fd, io_event,
self._transport_ready_handler)

def _uninstall_transport_ready(self):
if (self.tag):
gobject.source_remove(self.tag)
self.tag = None

def register_transport_ready_event(self, user_cb, user_arg):
"""
Register for transport ready events. The `transport ready`
Expand All @@ -208,24 +226,14 @@ def register_transport_ready_event(self, user_cb, user_arg):
self.user_cb = user_cb
self.user_arg = user_arg

if ('r' in self.access_type):
io_event = gobject.IO_IN
else:
io_event = gobject.IO_OUT

self.tag = gobject.io_add_watch(self.fd, io_event,
self._transport_ready_handler)

def unregister_transport_ready_event(self):
"""
Unregister previously registered `transport ready`
events.
See also: :py:meth:`register_transport_ready_event`
"""
if (self.tag):
gobject.source_remove(self.tag)
self.tag = None
self.user_cb = None

def read_transport(self):
"""
Expand Down Expand Up @@ -262,8 +270,10 @@ def close_transport(self):
.. note:: The user should first make sure any transport
event handlers are unregistered first.
"""
self._release_media_transport(self.path,
self.access_type)
if (self.path):
self._release_media_transport(self.path,
self.access_type)
self.path = None

def _notify_media_transport_available(self, path, transport):
"""
Expand All @@ -284,13 +294,15 @@ def _acquire_media_transport(self, path, access_type):
self.read_mtu = read_mtu
self.access_type = access_type
self.path = path
self._install_transport_ready()

def _release_media_transport(self, path, access_type):
"""
Should be called by subclass when it is finished
with the media transport file descriptor
"""
try:
self._uninstall_transport_ready()
os.close(self.fd) # Clean-up previously taken fd
transport = BTMediaTransport(path=path)
transport.release(access_type)
Expand Down Expand Up @@ -375,17 +387,16 @@ def _parse_config(config):
@dbus.service.method("org.bluez.MediaEndpoint",
in_signature="", out_signature="")
def Release(self):
print('Release')
pass

@dbus.service.method("org.bluez.MediaEndpoint",
in_signature="", out_signature="")
def ClearConfiguration(self):
print('ClearConfiguration')
pass

@dbus.service.method("org.bluez.MediaEndpoint",
in_signature="ay", out_signature="ay")
def SelectConfiguration(self, caps):
print('SelectConfiguration(%s)' % caps)
our_caps = SBCAudioCodec._parse_config(self.properties['Capabilities'])
device_caps = SBCAudioCodec._parse_config(caps)
frequency = SBCSamplingFrequency.FREQ_44_1KHZ
Expand Down Expand Up @@ -460,7 +471,6 @@ def SelectConfiguration(self, caps):
@dbus.service.method("org.bluez.MediaEndpoint",
in_signature="oay", out_signature="")
def SetConfiguration(self, transport, config):
print('SetConfiguration(%s, %s)' % (transport, config))
self._notify_media_transport_available(config.get('Device'), transport)

def __repr__(self):
Expand Down
82 changes: 70 additions & 12 deletions demo/demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ def agent_event_handler(*args):
print 'Agent event:', args
return True

def agent_event_request_pin_code(event, device):
print '\n========================================================='
print 'Agent event:', event
print 'Device:', device
print 'Enter PIN 1234 on device'
return dbus.String('1234')

def agent_event_request_pass_key(event, device):
print '\n========================================================='
print 'Agent event:', event
print 'Device:', device
print 'Using pass code 1234765'
return dbus.UInt32('1234765')

def device_created_ok(*args):
print '\n========================================================='
Expand Down Expand Up @@ -117,6 +130,25 @@ def adapter_set(args):
print 'Unable to complete:', sys.exc_info()


def device_listen(args):
if (len(args)):
dev_path = args.pop(0)
else:
print 'Error: Requires device path'
return

global services

try:
device = bt_manager.BTDevice(dev_path=dev_path)
device.add_signal_receiver(dump_signal,
bt_manager.BTDevice.SIGNAL_PROPERTY_CHANGED,
None)
services[dev_path] = device
except dbus.exceptions.DBusException:
print 'Unable to complete:', sys.exc_info()


def device_rm(args):
if (len(args)):
dev_path = args.pop(0)
Expand Down Expand Up @@ -228,6 +260,26 @@ def device_discovery(args):
print 'Unable to complete:', sys.exc_info()


def device_create(args):

global adapter

if (len(args) >= 2):
path = args.pop(0)
dev_id = args.pop(0)
else:
print 'Error: Must provide agent path and device address'
return

try:
caps = 'DisplayYesNo'
adapter.create_paired_device(dev_id, path, caps,
device_created_ok,
device_created_error)
except dbus.exceptions.DBusException:
print 'Unable to complete:', sys.exc_info()


def discovery_start(args):

global adapter
Expand Down Expand Up @@ -255,28 +307,20 @@ def agent_start(args):

if (len(args)):
path = args.pop(0)
if (len(args)):
dev_id = args.pop(0)
else:
print 'Error: Must provide agent path e.g., /test/agent'
return

try:
agent = bt_manager.BTAgent(path=path,
cb_notify_on_request_pin_code=agent_event_request_pin_code,
cb_notify_on_request_pass_key=agent_event_request_pass_key,
cb_notify_on_release=agent_event_handler,
cb_notify_on_authorize=agent_event_handler,
cb_notify_on_request_confirmation=agent_event_handler, # noqa
cb_notify_on_confirm_mode_change=agent_event_handler, # noqa
cb_notify_on_cancel=agent_event_handler)
services[path] = agent
caps = 'DisplayYesNo'

if (dev_id):
adapter.create_paired_device(dev_id, path, caps,
device_created_ok,
device_created_error)
else:
adapter.register_agent(path, caps)
except dbus.exceptions.DBusException:
print 'Unable to complete:', sys.exc_info()

Expand Down Expand Up @@ -480,12 +524,16 @@ def media_sbc_sink_start(args):

if (len(args)):
path = args.pop(0)
if (len(args)):
dev_path = args.pop(0)
else:
dev_path = None
else:
print 'Error: Must provide endpoint path e.g., /test/endpoint/sbc0'
return

try:
ep = bt_manager.SBCAudioSink(path=path)
ep = bt_manager.SBCAudioSink(path=path, dev_path=dev_path)
print '========================================================='
print repr(ep)
services[path] = ep
Expand Down Expand Up @@ -547,12 +595,16 @@ def media_sbc_source_start(args):

if (len(args)):
path = args.pop(0)
if (len(args)):
dev_path = args.pop(0)
else:
dev_path = None
else:
print 'Error: Must provide endpoint path e.g., /test/endpoint/sbc0'
return

try:
ep = bt_manager.SBCAudioSource(path=path)
ep = bt_manager.SBCAudioSource(path=path, dev_path=dev_path)
print '========================================================='
print repr(ep)
services[path] = ep
Expand Down Expand Up @@ -620,6 +672,12 @@ def media_stop(args):
'device-discovery': CmdEntry(device_discovery,
'Run BT device discovery session',
'<dev_path>'),
'device-listen': CmdEntry(device_listen,
'Listen for device proeprty change events',
'<dev_path>'),
'device-create': CmdEntry(device_create,
'Create device',
'[dev_id e.g., 11:22:33:44:55:66]'), # noqa
'discovery-start': CmdEntry(discovery_start,
'Start device discovery',
None),
Expand Down

0 comments on commit 9aac5be

Please sign in to comment.