
Настала пора написать историю и по тематике "мультимедиа"

Предыстория:
есть bluetooth донгл, с помощью которого замечательно работает связка комп-мобила.
есть bluetooth гарнитура (стерео) с помощью которой удобно слушать музыку и разговаривать по мобиле.
Почему бы не передавать ту-же музыку с компьютера на гарнитуру?!
И вот, после пары вечеров поисков, все заработало.
Источником информации выступили страницы:
bluetooth-alsa,
gentoo-wiki HOWTO,
bluez HOWTO и, конечно,
bluez.orgПо порядку.
1. Требуются bluez-libs и bluez-utils версии
3.19. В текущей слаквари версия старая, поэтому пришлось качать новые с
bluez.org1.1 Если libs скомпилировались и поставились без проблем (используя SlackBuild из слаки), то utils потребовали вмешательства в SlackBuild:
опция --enable-all в параметрах запуска configure не сработала, пришлось дописать:
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure --prefix=/usr \
--sysconfdir=/etc \
--mandir=/usr/man \
--localstatedir=/var \
--enable-all \
--enable-serial \
--enable-audio \
--enable-network \
--enable-input \
--build=$ARCH-slackware-linux
1.2. Компилим и ставим libs и utils. В /etc/rc.d/rc.bluetooth во всех _ENABLE параметрах поставил
true, не помешает и что-то лишнее. Поскольку используется скрипт автоматической передачи PIN-кода на устройства, то в /etc/bluetooth/passkeys создал файлик с именем типа 00:11:22:33:44:55, содержащий
00001.3. Содержимое hcid.conf:
#
# HCI daemon configuration file.
#
# HCId options
options {
# Automatically initialize new devices
autoinit yes;
# Security Manager mode
# none - Security manager disabled
# auto - Use local PIN for incoming connections
# user - Always ask user for a PIN
#
security auto;
# Pairing mode
# none - Pairing disabled
# multi - Allow pairing with already paired devices
# once - Pair once and deny successive attempts
pairing multi;
# Default PIN code for incoming connections
passkey "0000";
}
# Default settings for HCI devices
device {
# Local device name
# %d - device id
# %h - host name
name "Computer (%d)";
# Local device class
# class 0x120104;
class 0x3e0100;
# Default packet type
#pkt_type DH1,DM1,HV1;
# Inquiry and Page scan
iscan enable; pscan enable;
# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept;
# Default link policy
# none - no specific policy
# rswitch - allow role switch
# hold - allow hold mode
# sniff - allow sniff mode
# park - allow park mode
lp rswitch,hold,sniff,park;
}
Содержимое rfcomm.conf:
#
# RFCOMM configuration file.
#
rfcomm0 {
# # Automatically bind the device at startup
bind no;
# # Bluetooth address of the device
device 00:11:22:33:44:55;
# # RFCOMM channel for the connection
channel 1;
# # Description of the connection
comment "headset";
}
2. Ставим libsbc:
cvs -d:pserver:anonymous@sbc.cvs.sourceforge.net:/cvsroot/sbc login
cvs -d:pserver:anonymous@sbc.cvs.sourceforge.net:/cvsroot/sbc co sbc
cd sbc
./bootstrap
./configure --prefix=/usr
make
sudo make install
3. Ставим plugz:
cvs -d:pserver:anonymous@bluetooth-alsa.cvs.sourceforge.net:/cvsroot/bluetooth-alsa login
cvs -d:pserver:anonymous@bluetooth-alsa.cvs.sourceforge.net:/cvsroot/bluetooth-alsa co plugz
cd plugz
./bootstrap
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install
4. Создаем в домашнем каталоге файл
.a2dprc Заготовка содержится в alsa-plugins/a2dpd/sample.a2dprc (из plugz-а), поэтому покажу только действующие строки:
[a2dpd]
rate=44100
#channels=2
#plugin-rate=32000
sbcbitpool=32
flags=0
enablereversestereo=1
enableautoconnect=1
timeout=20
cmdplay=dcop amarok player play
cmdpause=dcop amarok player pause
cmdprev=dcop amarok player prev
cmdnext=dcop amarok player next
cmdnew=dcop amarok player play
cmdstop=dcop amarok player stop
enableavrcp=1
enablerereadconfig=1
enabledebug=1
#logfile=/dev/null
enablestdin=0
enableredirectalsa=0
address=00:11:22:33:44:55
your alsa output (default : plughw:0,0) you have to know what to do
#alsaoutput=
5. В домашнем каталоге создаем файл
.asoundrc. Вообще, в различных экспериментах он у меня "распух", привожу полностью, что сейчас работает:
pcm.a2dpd {
type a2dpd
}
pcm.bluetooth {
type bluetooth
device 00:11:22:33:44:55
}
pcm.headset-sco-resample {
type plug
slave {
pcm "headset"
rate 8000
format S16_LE
channels 1
}
}
pcm.headset {
@args [BDADDR TIMEOUT]
@args.BDADDR {
type string
default "00:11:22:33:44:55"
}
@args.TIMEOUT {
type integer
default 6000
}
type sco
bdaddr $BDADDR
timeout $TIMEOUT
}
ctl.headset {
type sco
}
pcm.a2dpdsoftvol {
type softvol
slave {
pcm "a2dpd"
}
control {
name "Bluetooth Headset"
card 0
count 1
}
}
6. Для нормальной работы требуется
ядро > 2.6.19. Качаем
патч и патчим ядро (у меня сейчас работает 2.6.22.9). Убеждаемся, что включено:
Networking support / Bluetooth subsystem support / Bluetooth device drivers / HCI USB driver / SCO (voice) supportСтавим ядро как обычно.
7. Запускаемся:
/etc/rc.d/rc.bluetooth start # от рута
a2dpd -v -g -o # от пользователя, в домашнем каталоге которого создавали файлики с точками
8. Переводим гарнитуру в режим сопряжения
9. Для проверки запускаем, например, mplayer:
mplayer -ao alsa:device=a2dpd песня.mp3
В окне запуска a2dpd должны наблюдать, как пошел процесс сопряжения и должна пойти музыка в наушники

10. Можно настроить amaroK : в настройках, иконка Движок, ставим модуль вывода alsa, в полях Моно и Стерео прописываем
a2dpdПоскольку, в ~/.a2dprc прописали команды для амарока, то кнопками на гарнитуре можно управлять переключением песен в списке амарока.
11. _Наслаждаемся_

PS. Конечно, bluetooth расчитан на ~10м по расстоянию. Но тем не менее, использование полученных "беспроводных наушников" возможно. А если донгл подключить через usb-удлинитель, то площадь квартиры можно запросто покрыть.
Одно плохо - аккумулятор в гарнитуре садится
PPS. Везде по тексту 00:11:22:33:44:55 - это mac адрес гарнитуры. Узнается как обычно:
hcitool scan при активированной bluetooth подсистеме в линуксе и гарнитуре в режиме сопряжения.
"No! Try not! Do. Or do not. There is no try." -- Yoda