← Back to team overview

kernel-packages team mailing list archive

[Bug 1245832] Re: Bluetooth not working 13.10

 

** Tags added: kernel-bug-exists-upstream

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1245832

Title:
  Bluetooth not working 13.10

Status in “linux” package in Ubuntu:
  Confirmed

Bug description:
  Please be patient as I am new to bug reporting and examining the
  workings of the system,

  Hardware:- Dell Latttitude D610, Mem- 2Gb, Processor- Intel Pentium
  (R)M 1.86 Ghz, Graphics- Galium 04 on ATI RV370, 32 Bit

  Bug, Unable to effect bluetooth connection. Able to prior to upgrade
  to 13.10.

  As standard Bluetooth indicator not working on top bar, open "as standard bluetooth" via settings or dash okay, Can pair with external speaker for example but cannot connect, slider in Bluetooth GUI will not slide to give connect staus.
  Tried Blueman Device Manager 1.23, can also find and pair but unable to connect to device.

  As installed config shown below just incase there is an error ./ect/bluetooth/audio.conf
  # Configuration file for the audio service

  # This section contains options which are not specific to any
  # particular interface
  [General]

  # Switch to master role for incoming connections (defaults to true)
  #Master=true

  # If we want to disable support for specific services
  # Defaults to supporting all implemented services
  #Disable=Gateway,Source,Socket

  # SCO routing. Either PCM or HCI (in which case audio is routed to/from ALSA)
  # Defaults to HCI
  #SCORouting=PCM

  # Automatically connect both A2DP and HFP/HSP profiles for incoming
  # connections. Some headsets that support both profiles will only connect the
  # other one automatically so the default setting of true is usually a good
  # idea.
  #AutoConnect=true

  # Headset interface specific options (i.e. options which affect how the audio
  # service interacts with remote headset devices)
  [Headset]

  # Set to true to support HFP, false means only HSP is supported
  # Defaults to true
  HFP=true

  # Maximum number of connected HSP/HFP devices per adapter. Defaults to 1
  MaxConnected=1

  # Set to true to enable use of fast connectable mode (faster page scanning)
  # for HFP when incoming call starts. Default settings are restored after
  # call is answered or rejected. Page scan interval is much shorter and page
  # scan type changed to interlaced. Such allows faster connection initiated
  # by a headset.
  FastConnectable=false

  # Just an example of potential config options for the other interfaces
  #[A2DP]
  #SBCSources=1
  #MPEG12Sources=0

  A system crash report generated an error in /usr/bin/blueman-assistant
  file copy below
  #! /usr/bin/python

  # Copyright (C) 2008 Valmantas Paliksa <walmis at balticum-tv dot lt>
  # Copyright (C) 2008 Tadas Dailyda <tadas at dailyda dot com>
  #
  # Licensed under the GNU General Public License Version 3
  #
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation, either version 3 of the License, or
  # (at your option) any later version.
  #
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  # 
  PAGE_INTRO =      0
  PAGE_DEVLIST =    1
  PAGE_PASSKEY =    2
  PAGE_PAIRING =    3
  PAGE_CONNECT =    4
  PAGE_CONNECTING = 5
  PAGE_FINISH =     6

  pages = {}

  
  import os
  import sys
  import gtk
  import random
  import dbus.glib
  from optparse import OptionParser

  #support running uninstalled
  _dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
  if os.path.exists(os.path.join(_dirname,"ChangeLog")):
  	sys.path.insert(0, _dirname)

  from blueman.Functions import *
  from blueman.gui.DeviceSelectorWidget import DeviceSelectorWidget
  from blueman.bluez.Agent import Agent, AgentMethod
  from blueman.bluez.Manager import Manager
  from blueman.main.FakeDevice import FakeDevice
  from blueman.main.Device import Device
  from blueman.main.AppletService import AppletService
  from blueman.Sdp import *

  class Assistant(Agent):
  	def __init__(self):
  		Agent.__init__(self, "/")
  		setup_icon_path()
  		
  		usage = "Usage: %prog [options]"
  		parser = OptionParser(usage)
  		parser.add_option("-d", "--device", dest="device",
  				action="store", help=_("Start configuration assistant for this device"), metavar="ADDRESS")
  	
  		(options, args) = parser.parse_args()
  		
  		check_bluetooth_status(_("Bluetooth needs to be turned on for the Bluetooth assistant to work"), lambda: exit())
  		
  		self.options = options		
  		
  		self.Device = None
  		self.Adapter = None
  		self.PairType = 0
  		self.Passkey = ""
  		self.Service = None
  		
  		self.Builder = gtk.Builder()
  		self.Builder.set_translation_domain("blueman")
  		self.Builder.add_from_file(UI_PATH +"/assistant.ui")
  		self.assistant = self.Builder.get_object("assistant")
  		self.assistant.set_title(_("Bluetooth Assistant"))
  			
  		self.applet = AppletService()
  		
  		self.assistant.connect("prepare", self.on_prepare)
  		self.assistant.connect("close", self.on_close)
  		self.assistant.connect("cancel", self.on_close)

  		pages[PAGE_INTRO] = self.Builder.get_object("l_page0")
  		self.assistant.set_page_header_image(pages[PAGE_INTRO], get_icon("blueman", 32))
  		self.assistant.set_page_complete(pages[PAGE_INTRO], True)
  		
  		pages[PAGE_DEVLIST] = self.Builder.get_object("a_page1")
  		self.assistant.set_page_header_image(pages[PAGE_DEVLIST], get_icon("blueman", 32))
  		
  		pages[PAGE_PASSKEY] = self.Builder.get_object("a_page2")
  		self.assistant.set_page_header_image(pages[PAGE_PASSKEY], get_icon("gtk-dialog-authentication", 32))
  		
  		pages[PAGE_PAIRING] = self.Builder.get_object("l_page3")
  		self.assistant.set_page_header_image(pages[PAGE_PAIRING], get_icon("gtk-dialog-authentication", 32))
  		
  		pages[PAGE_CONNECT] = self.Builder.get_object("a_page4")
  		self.assistant.set_page_header_image(pages[PAGE_CONNECT], get_icon("gtk-connect", 32))
  		
  		pages[PAGE_CONNECTING] = self.Builder.get_object("l_page5")
  		self.assistant.set_page_header_image(pages[PAGE_CONNECTING], get_icon("gtk-connect", 32))
  		
  		pages[PAGE_FINISH] = self.Builder.get_object("l_page6")
  		self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-yes", 32))
  		
  		self.svc_vbox = self.Builder.get_object("svcs")
  		
  		self.cust_passkey = self.Builder.get_object("e_myp")
  		self.cust_passkey.props.sensitive = False
  		self.cust_passkey.connect("changed", self.on_passkey_changed)
  		
  		self.Builder.get_object("r_dontp").connect("toggled", self.on_pairing_method_changed, 2)
  		self.Builder.get_object("r_myp").connect("toggled", self.on_pairing_method_changed, 1)
  		self.Builder.get_object("r_randp").connect("toggled", self.on_pairing_method_changed, 0)
  		
  		self.dev_widget = DeviceSelectorWidget()
  		self.dev_widget.List.connect("device-selected", self.on_device_selected)
  		self.dev_widget.List.connect("row-activated", self.on_row_activated)
  		
  		self.assistant.set_forward_page_func(self.next_page_fn, None)
  			
  		pages[PAGE_DEVLIST].add(self.dev_widget)
  		
  		self.dev_widget.show()
  		
  		if not self.dev_widget.List.IsValidAdapter():
  			d = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, )
  			d.props.text = _("No adapters found")
  			d.props.icon_name = "blueman"
  			d.props.title = "Blueman Assistant"
  			d.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL)
  			d.run()
  			exit(1)
  		
  		self.assistant.show()
  				
  		if options.device != None:
  			m = Manager("gobject")
  			try:
  				adapter = m.GetAdapter()
  			except:
  				print "Error: No Adapters present"
  				exit(1)
  			try:
  				d = adapter.FindDevice(options.device)
  				self.Device = Device(d)
  				self.Adapter = adapter
  				if self.Device.Paired:
  					self.assistant.set_current_page(PAGE_CONNECT)
  				else:
  					self.assistant.set_current_page(PAGE_PASSKEY)
  			except:
  				info = {}
  				info["Address"] = options.device
  				info["Name"] = info["Address"].replace(":", "-")
  				info["Alias"] = info["Name"]
  				info["Fake"] = True
  				
  				self.Device = FakeDevice(info)
  				self.Adapter = adapter
  				self.assistant.set_current_page(PAGE_PASSKEY)
  							
  		else:
  			self.dev_widget.List.DiscoverDevices()

  		
  		gtk.main()
  		
  	def on_row_activated(self, treeview, path, view_column, *args):
  		self.assistant.set_current_page(self.next_page_fn(self.assistant.get_current_page(), None))
  		
  		
  	def next_page_fn(self, page, data):
  		if page == PAGE_INTRO:
  			return PAGE_DEVLIST
  		
  		elif page == PAGE_DEVLIST:
  			if self.Device:
  				if self.Device.Fake or not self.Device.Paired:
  					return PAGE_PASSKEY
  				else:
  					return PAGE_CONNECT
  			else:
  				return PAGE_PASSKEY
  		elif page == PAGE_PASSKEY:
  			if not self.Device.Fake and not self.Device.Paired and self.PairType == 2:
  				return PAGE_CONNECT
  			#self.assistant.set_page_complete(pages[PAGE_PASSKEY], True)
  			return PAGE_PAIRING
  		elif page == PAGE_PAIRING:
  			if len(self.Device.Services) == 0:
  				return PAGE_FINISH
  				
  			return PAGE_CONNECT
  		elif page == PAGE_CONNECT:
  			
  			if self.Service and self.Service[0]:
  				return PAGE_CONNECTING
  			else:
  				return PAGE_FINISH
  		elif page == PAGE_CONNECTING:
  			return PAGE_FINISH
  		elif page == PAGE_FINISH:
  			return PAGE_FINISH+1
  			
  		return page
  		
  		
  	def check_custom_passkey(self):
  		return len(self.cust_passkey.props.text) != 0
  		
  	def on_passkey_changed(self, e):
  		if self.PairType == 1:
  			if self.check_custom_passkey():
  				self.Passkey = e.props.text
  				self.assistant.set_page_complete(pages[PAGE_PASSKEY], True)
  			else:
  				self.assistant.set_page_complete(pages[PAGE_PASSKEY], False)
  		
  		
  	def on_pairing_method_changed(self, radio_button, type):
  		if radio_button.props.active:
  			if type == 0:
  				self.cust_passkey.props.sensitive = False
  				self.assistant.set_page_complete(pages[PAGE_PASSKEY], True)
  			elif type == 1:
  				self.cust_passkey.props.sensitive = True
  				if not self.check_custom_passkey():
  					self.assistant.set_page_complete(pages[PAGE_PASSKEY], False)
  			else:
  				self.cust_passkey.props.sensitive = False
  				self.assistant.set_page_complete(pages[PAGE_PASSKEY], True)
  			
  			self.PairType = type
  		
  		
  	def on_device_selected(self, list, device, iter):
  		if not device:
  			self.assistant.set_page_complete(pages[PAGE_DEVLIST], False)
  			self.Device = None
  			self.Adapter = list.Adapter
  		else:
  			self.assistant.set_page_complete(pages[PAGE_DEVLIST], True)
  			self.Device = device
  			self.Adapter = list.Adapter
  	
  	@AgentMethod
  	def RequestPinCode(self, device):
  		dprint("Agent.RequestPinCode")
  		return self.Passkey
  	
  	@AgentMethod
  	def RequestPasskey(self, device):
  		dprint("Agent.RequestPasskey")
  		return self.Passkey
  		
  	def on_close(self, assistant):
  		gtk.main_quit()
  		
  	def on_service_toggled(self, rb, sv_name, *args):
  		if rb.props.active:
  			self.Service = (sv_name, args)
  			self.assistant.set_page_complete(pages[PAGE_CONNECT], True)

  	def on_prepare(self, assistant, page):
  		num = assistant.get_current_page()
  		if num == PAGE_PASSKEY:
  			self.assistant.set_page_complete(pages[PAGE_PASSKEY], True)
  		
  		elif num == PAGE_PAIRING:
  			if self.Device.Fake and self.PairType == 2:
  				pages[PAGE_PAIRING].set_markup(_("<b>Adding Device...</b>"))
  				self.assistant.set_page_title(pages[PAGE_PAIRING], _("Adding"))
  			else:
  				if self.PairType == 0:
  					self.Passkey = "%04d" % random.randint(0, 9999)

  pages[PAGE_PAIRING].set_markup(_("<b>Pairing in
  progress...</b>\n\nEnter passkey <b>%s</b> on the device.") %
  self.Passkey)

  			def ok(dev):
  				self.Device = Device(dev)
  				
  				def refresh_cb(*args):
  					self.assistant.set_current_page(PAGE_CONNECT)
  				
  				self.applet.RefreshServices(self.Device.GetObjectPath(), reply_handler=refresh_cb, error_handler=refresh_cb)
  				
  			def err(err):
  				print err
  				pages[PAGE_FINISH].set_markup(_("<b>Failed to add device</b>"))
  				self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-no", 32))
  				self.assistant.set_current_page(PAGE_FINISH)
  			
  			if self.PairType != 2:
  				self.Adapter.CreatePairedDevice(self.Device.Address, self.GetObjectPath(), "", reply_handler=ok, error_handler=err)
  			else:
  				self.Adapter.CreateDevice(self.Device.Address, reply_handler=ok, error_handler=err)
  		
  		elif num == PAGE_CONNECT:
  			self.svc_vbox.foreach(lambda x, y: self.svc_vbox.remove(x), None)
  			
  			print self.Device.Services
  			uuids = self.Device.UUIDs
  			rbs = []
  			def get_first_item():
  				try:
  					return rbs[0]
  				except:
  					return None
  				
  			for name, service in self.Device.Services.iteritems():
  				if name == "serial":
  					for uuid in uuids:
  						uuid16 = uuid128_to_uuid16(uuid)
  						if uuid16 == DIALUP_NET_SVCLASS_ID:
  							rbs.append(gtk.RadioButton(get_first_item(), uuid16_to_name(uuid16)))
  							rbs[-1].connect("toggled", self.on_service_toggled, name, uuid)
  							self.svc_vbox.pack_start(rbs[-1], False)
  						
  						if uuid16 == SERIAL_PORT_SVCLASS_ID:
  							rbs.append(gtk.RadioButton(get_first_item(), uuid16_to_name(uuid16)))
  							rbs[-1].connect("toggled", self.on_service_toggled, name, uuid)
  							self.svc_vbox.pack_start(rbs[-1], False)
  				elif name == "input":
  					rbs.append(gtk.RadioButton(get_first_item(), _("Input Service")))
  					rbs[-1].connect("toggled", self.on_service_toggled, name)
  					self.svc_vbox.pack_start(rbs[-1], False)
  				
  				elif name == "network":
  					for uuid in uuids:
  						uuid16 = uuid128_to_uuid16(uuid)
  						if uuid16 == GN_SVCLASS_ID:						
  							rbs.append(gtk.RadioButton(get_first_item(), _("Group Network")))
  							rbs[-1].connect("toggled", self.on_service_toggled, name, uuid)
  							self.svc_vbox.pack_start(rbs[-1], False)
  					
  						if uuid16 == NAP_SVCLASS_ID:
  							rbs.append(gtk.RadioButton(get_first_item(), _("Network Access Point")))
  							rbs[-1].connect("toggled", self.on_service_toggled, name, uuid)
  							self.svc_vbox.pack_start(rbs[-1], False)
  			
  				elif name == "audiosink":
  					rbs.append(gtk.RadioButton(get_first_item(), _("A2DP Sink (Send Audio)")))
  					rbs[-1].connect("toggled", self.on_service_toggled, name)
  					self.svc_vbox.pack_start(rbs[-1], False)
  				
  				elif name == "audiosource":
  					rbs.append(gtk.RadioButton(get_first_item(), _("A2DP Source (Receive Audio)")))
  					rbs[-1].connect("toggled", self.on_service_toggled, name)
  					self.svc_vbox.pack_start(rbs[-1], False)				
  				
  				elif name == "headset":
  					rbs.append(gtk.RadioButton(get_first_item(), _("Headset Service")))
  					rbs[-1].connect("toggled", self.on_service_toggled, name)
  					self.svc_vbox.pack_start(rbs[-1], False)
  				
  			rbs.append(gtk.RadioButton(get_first_item(), _("Don't connect")))
  			rbs[-1].connect("toggled", self.on_service_toggled, None)
  			self.svc_vbox.pack_start(rbs[-1], False, False, 8)			
  			self.svc_vbox.show_all()

  			rbs[0].emit("toggled")
  			if len(self.svc_vbox.get_children()) == 1:
  				self.assistant.set_current_page(self.next_page_fn(self.assistant.get_current_page(), None))
  			
  		elif num == PAGE_CONNECTING:
  			print "connect"
  			
  			svc = self.Device.Services[self.Service[0]]
  			
  			def success(*args):
  				pages[PAGE_FINISH].set_markup(_("<b>Device added and connected successfuly</b>"))
  				self.assistant.set_page_complete(pages[PAGE_CONNECTING], True)
  				self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-yes", 32))
  				self.assistant.set_current_page(PAGE_FINISH)
  				
  			def fail(*args):
  				pages[PAGE_FINISH].set_markup(_("<b>Device added successfuly, but failed to connect</b>"))
  				self.assistant.set_page_complete(pages[PAGE_CONNECTING], True)
  				self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-dialog-warning", 32))
  				self.assistant.set_current_page(PAGE_FINISH)
  			
  			if self.Service[0] == "network":
  				uuid = self.Service[1][0]
  				self.applet.ServiceProxy(svc.GetInterfaceName(), svc.GetObjectPath(), "Connect", [uuid], reply_handler=success, error_handler=fail)
  			
  			elif self.Service[0] == "serial":
  				uuid = self.Service[1][0]
  				self.applet.RfcommConnect(self.Device.GetObjectPath(), uuid, reply_handler=success, error_handler=fail)
  			else:
  				self.applet.ServiceProxy(svc.GetInterfaceName(), svc.GetObjectPath(), "Connect", [], reply_handler=success, error_handler=fail)
  			
  			

  
  Assistant()
  --- 
  ApportVersion: 2.12.5-0ubuntu2.1
  Architecture: i386
  AudioDevicesInUse:
   USER        PID ACCESS COMMAND
   /dev/snd/controlC0:  andy       2024 F.... pulseaudio
   /dev/snd/pcmC0D0p:   andy       2024 F...m pulseaudio
  DistroRelease: Ubuntu 13.10
  HibernationDevice: RESUME=UUID=0fe88b05-130d-4160-a554-904a636985a3
  InstallationDate: Installed on 2013-03-15 (227 days ago)
  InstallationMedia: Ubuntu 12.10 "Quantal Quetzal" - Release i386 (20121017.2)
  MachineType: Dell Inc. Latitude D610
  MarkForUpload: True
  Package: linux (not installed)
  PccardctlIdent:
   Socket 0:
     no product info available
  PccardctlStatus:
   Socket 0:
     no card
  ProcFB: 0 radeondrmfb
  ProcKernelCmdLine: BOOT_IMAGE=/boot/vmlinuz-3.11.0-13-generic root=UUID=dbeb0bf9-d815-4f72-b405-ce0693a0827e ro quiet splash vt.handoff=7
  ProcVersionSignature: Ubuntu 3.11.0-13.20-generic 3.11.6
  RelatedPackageVersions:
   linux-restricted-modules-3.11.0-13-generic N/A
   linux-backports-modules-3.11.0-13-generic  N/A
   linux-firmware                             1.116
  Tags:  saucy
  Uname: Linux 3.11.0-13-generic i686
  UpgradeStatus: Upgraded to saucy on 2013-10-18 (10 days ago)
  UserGroups: adm cdrom dip lpadmin plugdev sambashare sudo
  dmi.bios.date: 10/02/2005
  dmi.bios.vendor: Dell Inc.
  dmi.bios.version: A06
  dmi.board.name: 0C4708
  dmi.board.vendor: Dell Inc.
  dmi.chassis.type: 8
  dmi.chassis.vendor: Dell Inc.
  dmi.modalias: dmi:bvnDellInc.:bvrA06:bd10/02/2005:svnDellInc.:pnLatitudeD610:pvr:rvnDellInc.:rn0C4708:rvr:cvnDellInc.:ct8:cvr:
  dmi.product.name: Latitude D610
  dmi.sys.vendor: Dell Inc.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1245832/+subscriptions


References