| 
				imported>Uri.mashiach     | 
				
| (One intermediate revision by one other user not shown) | 
| Line 5: | 
Line 5: | 
|   | Make sure that the Bluetooth driver is loaded:  |   | Make sure that the Bluetooth driver is loaded:  | 
|   | <pre>  |   | <pre>  | 
| − | root@cl-rootfs:~# lsmod | grep btwilink  | + | root@cl-debian:~# lsmod | grep hci_uart  | 
| − | btwilink                3822  0
  | + | hci_uart               10445  1  | 
|   | </pre>  |   | </pre>  | 
|   | The Bluetooth driver can be loaded manually:  |   | The Bluetooth driver can be loaded manually:  | 
|   | <pre>  |   | <pre>  | 
| − | root@cl-rootfs:~# modprobe btwilink  | + | root@cl-rootfs:~# modprobe hci_uart  | 
|   | </pre>  |   | </pre>  | 
|   |  |   |  | 
| Line 16: | 
Line 16: | 
|   | <pre>  |   | <pre>  | 
|   | root@cl-rootfs:~# hciconfig hci0 -a  |   | root@cl-rootfs:~# hciconfig hci0 -a  | 
| − | hci0:   Type: BR/EDR  Bus: UART  | + | hci0:   Type: Primary  Bus: UART  | 
| − |          BD Address: 74:DA:EA:F9:CE:E3  ACL MTU: 1021:6  SCO MTU: 180:4  | + |          BD Address: 3C:A3:08:A8:03:B9  ACL MTU: 1021:6  SCO MTU: 180:4  | 
|   |          UP RUNNING    |   |          UP RUNNING    | 
| − |          RX bytes:636 acl:0 sco:0 events:39 errors:0  | + |          RX bytes:746 acl:0 sco:0 events:49 errors:0  | 
| − |          TX bytes:1234 acl:0 sco:0 commands:39 errors:0  | + |          TX bytes:3441 acl:0 sco:0 commands:49 errors:0  | 
|   |          Features: 0xff 0xfe 0x2d 0xfe 0xdb 0xff 0x7b 0x87  |   |          Features: 0xff 0xfe 0x2d 0xfe 0xdb 0xff 0x7b 0x87  | 
|   |          Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3    |   |          Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3    | 
|   |          Link policy: RSWITCH HOLD SNIFF    |   |          Link policy: RSWITCH HOLD SNIFF    | 
|   |          Link mode: SLAVE ACCEPT    |   |          Link mode: SLAVE ACCEPT    | 
| − |          Name: 'BlueZ 5.36'  | + |          Name: 'cl-debian'  | 
| − |          Class: 0x000000  | + |          Class: 0x0c0000  | 
| − |          Service Classes: Unspecified  | + |          Service Classes: Rendering, Capturing  | 
|   |          Device Class: Miscellaneous,    |   |          Device Class: Miscellaneous,    | 
|   |          HCI Version: 4.1 (0x7)  Revision: 0x0  |   |          HCI Version: 4.1 (0x7)  Revision: 0x0  | 
| Line 42: | 
Line 42: | 
|   | root@cl-rootfs:~# hcitool scan  |   | root@cl-rootfs:~# hcitool scan  | 
|   | Scanning ...  |   | Scanning ...  | 
| − | </pre>
  |   | 
| − | 
  |   | 
| − | ==== Bluez5 & PulseAudio ====
  |   | 
| − | Debian stretch/sid is using BlueZ 5 and PluseAudio 5, which are fairly new.<br>
  |   | 
| − | BlueZ 5 dropped support for alsa, so the solution for now is to use PulseAudio.<br>
  |   | 
| − | PulseAudio 5 only supports the A2DP profile and not HSP/HFP. <br>
  |   | 
| − | * Software to install {{filename|pulseaudio}}, {{filename|pulseaudio-module-bluetooth}}
  |   | 
| − | {{Note|{{filename|debian-image.tar.bz2}} has all these packages pre-installed. Continue to the [[#Start PulseAudio | Start PulseAudio]] section if you use this root filesystem.}}
  |   | 
| − | ===== Install and configure PulseAudio =====
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# apt-get install --no-install-recommends pulseaudio pulseaudio-module-bluetooth
  |   | 
| − | </pre>
  |   | 
| − | * Create a systemd service for running pulseaudio as the pulse user.
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# cat << eof > /etc/systemd/system/pulseaudio.service
  |   | 
| − | [Unit]
  |   | 
| − | Description=Pulse Audio
  |   | 
| − | 
  |   | 
| − | [Service]
  |   | 
| − | Type=simple
  |   | 
| − | ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm
  |   | 
| − | 
  |   | 
| − | [Install]
  |   | 
| − | WantedBy=multi-user.target
  |   | 
| − | eof
  |   | 
| − | 
  |   | 
| − | root@cl-rootfs:~# chown pulse:pulse /etc/systemd/system/pulseaudio.service
  |   | 
| − | </pre>
  |   | 
| − | 
  |   | 
| − | * Create a dbus configuration file for running pulseaudio. Give the pulse user permission to use Bluetooth.
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# cat << eof > /etc/dbus-1/system.d/pulseaudio-bluetooth.conf
  |   | 
| − | <busconfig>
  |   | 
| − | 
  |   | 
| − |   <policy user="pulse">
  |   | 
| − |     <allow send_destination="org.bluez"/>
  |   | 
| − |   </policy>
  |   | 
| − | 
  |   | 
| − | </busconfig>
  |   | 
| − | eof
  |   | 
| − | 
  |   | 
| − | root@cl-rootfs:~# chmod 0666 /etc/dbus-1/system.d/pulseaudio-bluetooth.conf
  |   | 
| − | </pre>
  |   | 
| − | * Paste the following lines to the end of /etc/pulse/system.pa:
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# cat << eof >> /etc/pulse/system.pa
  |   | 
| − | ### Automatically load driver modules for Bluetooth hardware
  |   | 
| − | .ifexists module-bluetooth-policy.so
  |   | 
| − | load-module module-bluetooth-policy
  |   | 
| − | .endif
  |   | 
| − | 
  |   | 
| − | .ifexists module-bluetooth-discover.so
  |   | 
| − | load-module module-bluetooth-discover
  |   | 
| − | .endif
  |   | 
| − | eof
  |   | 
| − | </pre>
  |   | 
| − | * Create {{filename|/var/run/pulse/.config/pulse}} directory. Change its ownership.
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# mkdir -p /var/run/pulse/.config/pulse
  |   | 
| − | root@cl-rootfs:~# chown -R pulse:pulse /var/run/pulse
  |   | 
| − | </pre>
  |   | 
| − | * Make the root belong to the pulse-access,audio groups
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# usermod -a -G pulse-access,audio root
  |   | 
| − | </pre>
  |   | 
| − | 
  |   | 
| − | ===== Start PulseAudio =====
  |   | 
| − | * Start PulseAudio service
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# systemctl daemon-reload
  |   | 
| − | root@cl-rootfs:~# systemctl start pulseaudio.service
  |   | 
| − | </pre>
  |   | 
| − | * Make sure that the service is active, running and reports on no errors.
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# systemctl status pulseaudio.service
  |   | 
| − |    Loaded: loaded (/etc/systemd/system/pulseaudio.service; disabled)
  |   | 
| − |    Active: active (running) since Mon 2015-07-20 12:00:13 UTC; 1min 34s ago
  |   | 
| − |  Main PID: 805 (pulseaudio)
  |   | 
| − |    CGroup: /system.slice/pulseaudio.service
  |   | 
| − |            └─805 /usr/bin/pulseaudio --system --disallow-exit --disable-shm
  |   | 
| − | </pre>
  |   | 
| − | 
  |   | 
| − | ===== Bluez5 pairing =====
  |   | 
| − | PulseAudio 5.x supports A2DP per default.<br>
  |   | 
| − | Make sure the following packages are installed:
  |   | 
| − | pulseaudio pulseaudio-module-bluetooth pulseaudio-utils, bluez, bluez-tools.
  |   | 
| − | {{Note|Without {{filename|pulseaudio-module-bluetooth}} you won't be able to connect after the next pairing and you won't get any usable error messages.}}
  |   | 
| − | 
  |   | 
| − | * Start the Bluetooth system:
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# systemctl start bluetooth
  |   | 
| − | </pre>
  |   | 
| − | Now we can use the {{cmd|bluetoothctl}} command line utility to pair and connect. Run
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# bluetoothctl
  |   | 
| − | [bluetooth]#
  |   | 
| − | </pre>
  |   | 
| − | to be greeted by its internal command prompt.Then enter:
  |   | 
| − | <pre>
  |   | 
| − | [bluetooth]# power on
  |   | 
| − | [bluetooth]# agent on
  |   | 
| − | [bluetooth]# default-agent
  |   | 
| − | [bluetooth]# scan 
  |   | 
| − | </pre>
  |   | 
| − | Now make sure that your headset is in pairing mode. It should be discovered shortly. For example,
  |   | 
| − | <pre>
  |   | 
| − | [NEW] Device 00:07:A4:F2:B3:CB Motorola HT820
  |   | 
| − | </pre>
  |   | 
| − | shows a device that calls itself "Motorola HT820" and has MAC address 00:07:A4:F2:B3:CB.
  |   | 
| − | We will now use that MAC address to initiate the pairing:
  |   | 
| − | <pre>
  |   | 
| − | [bluetooth]# pair 00:07:A4:F2:B3:CB
  |   | 
| − | </pre>
  |   | 
| − | After pairing, you also need to explicitly connect the device:
  |   | 
| − | <pre>
  |   | 
| − | [bluetooth]# connect 00:07:A4:F2:B3:CB
  |   | 
| − | </pre>
  |   | 
| − | If everything works correctly, you now have a separate output device in PulseAudio.<br>
  |   | 
| − | You can now disable scanning again and exit the program:
  |   | 
| − | <pre>
  |   | 
| − | [bluetooth]# scan off
  |   | 
| − | [bluetooth]# exit
  |   | 
| − | </pre>
  |   | 
| − | 
  |   | 
| − | ===== Playback using PulseAudio =====
  |   | 
| − | {{Note|Next examples assume that the device mac address is '''00_07_A4_F2_B3_CB'''}}
  |   | 
| − | * Show the PulseAudio device 
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# pactl list cards  | awk '/00_07_A4_F2_B3_CB/' RS=""
  |   | 
| − | Card #1                                                                                                                                                                     
  |   | 
| − |         Name: bluez_card.00_07_A4_F2_B3_CB                                                                                                                                  
  |   | 
| − |         Driver: module-bluez5-device.c                                                                                                                                      
  |   | 
| − |         Owner Module: 13                                                                                                                                                    
  |   | 
| − |         Properties:                                                                                                                                                         
  |   | 
| − |                 device.description = "Motorola HT820"                                                                                                                       
  |   | 
| − |                 device.string = "00:07:A4:F2:B3:CB"                                                                                                                         
  |   | 
| − |                 device.api = "bluez"                                                                                                                                        
  |   | 
| − |                 device.class = "sound"                                                                                                                                      
  |   | 
| − |                 device.bus = "bluetooth"                                                                                                                                    
  |   | 
| − |                 device.form_factor = "headset"                                                                                                                              
  |   | 
| − |                 bluez.path = "/org/bluez/hci0/dev_00_07_A4_F2_B3_CB"                                                                                                        
  |   | 
| − |                 bluez.class = "0x240404"                                                                                                                                    
  |   | 
| − |                 bluez.alias = "Motorola HT820"                                                                                                                              
  |   | 
| − |                 device.icon_name = "audio-headset-bluetooth"                                                                                                                
  |   | 
| − |                 device.intended_roles = "phone"                                                                                                                             
  |   | 
| − |         Profiles:                                                                                                                                                           
  |   | 
| − |                 headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: no)
  |   | 
| − |                 a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
  |   | 
| − |                 off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
  |   | 
| − |         Active Profile: a2dp_sink
  |   | 
| − |         Ports:
  |   | 
| − |                 headset-output: Headset (priority: 0, latency offset: 0 usec)
  |   | 
| − |                         Part of profile(s): headset_head_unit, a2dp_sink
  |   | 
| − |                 headset-input: Headset (priority: 0, latency offset: 0 usec, not available)
  |   | 
| − |                         Part of profile(s): headset_head_unit
  |   | 
| − | </pre>
  |   | 
| − | :* Make sure the active card profile is a2dp_sink. Otherwise switch to it:
  |   | 
| − | <pre>
  |   | 
| − | # pactl set-card-profile 1 a2dp_sink
  |   | 
| − | </pre>
  |   | 
| − | :* Show the PulseAudio sink
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# pactl list sinks | awk '/00_07_A4_F2_B3_CB/' RS=""
  |   | 
| − | Sink #1
  |   | 
| − |         State: SUSPENDED
  |   | 
| − |         Name: bluez_sink.00_07_A4_F2_B3_CB
  |   | 
| − |         Description: Motorola HT820
  |   | 
| − |         Driver: module-bluez5-device.c
  |   | 
| − |         Sample Specification: s16le 2ch 48000Hz
  |   | 
| − |         Channel Map: front-left,front-right
  |   | 
| − |         Owner Module: 13
  |   | 
| − |         Mute: no
  |   | 
| − |         Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
  |   | 
| − |                 balance 0.00
  |   | 
| − |         Base Volume: 65536 / 100% / 0.00 dB
  |   | 
| − |         Monitor Source: bluez_sink.00_07_A4_F2_B3_CB.monitor
  |   | 
| − |         Latency: 0 usec, configured 0 usec
  |   | 
| − |         Flags: HARDWARE DECIBEL_VOLUME LATENCY 
  |   | 
| − |         Properties:
  |   | 
| − |                 bluetooth.protocol = "a2dp_sink"
  |   | 
| − |                 device.description = "Motorola HT820"
  |   | 
| − |                 device.string = "00:07:A4:F2:B3:CB"
  |   | 
| − |                 device.api = "bluez"
  |   | 
| − |                 device.class = "sound"
  |   | 
| − |                 device.bus = "bluetooth"
  |   | 
| − |                 device.form_factor = "headset"
  |   | 
| − |                 bluez.path = "/org/bluez/hci0/dev_00_07_A4_F2_B3_CB"
  |   | 
| − |                 bluez.class = "0x240404"
  |   | 
| − |                 bluez.alias = "Motorola HT820"
  |   | 
| − |                 device.icon_name = "audio-headset-bluetooth"
  |   | 
| − |                 device.intended_roles = "phone"
  |   | 
| − |         Ports:
  |   | 
| − |                 headset-output: Headset (priority: 0)
  |   | 
| − |         Active Port: headset-output
  |   | 
| − |         Formats:
  |   | 
| − |                 pcm
  |   | 
| − | </pre>
  |   | 
| − | :* Play sound using {{filename|paplay}}. Example:
  |   | 
| − | <pre>
  |   | 
| − | root@cl-rootfs:~# paplay -d bluez_sink.00_07_A4_F2_B3_CB /path/to/<audio-file.wav>
  |   | 
|   | </pre>  |   | </pre>  |