BrainとBTドングルでBT-Auido出力してみたら大変だった
結論
罠が多すぎるので、USB-Audio -> BT-Audioトランスミッタ 一体型ドングルを使う事をお勧め
以下、備忘録
使った機材
PW-SR1
詳細不明BTドングル "BT5.0" (VID:0bda,PID:8771)
MDR-ZX770BN
参考にした記事
はまったところ
ファームウェアファイルが無いというメッセージが出てドライバがロードされない
ネットから拾って"/lib/firmware/rtl_bt/"へ配置するも存在しない"rtl8761a_config.bin"が必要とのこと。
ALSAと別経路で Bluez -> pulseaudio というパスになるのが分かりづらかった。
Bluezに加えて pulseaudio-module-bluetooth を入れないとAD2PデバイスはConnectされない。
pulseaudio-bluetooth が pulseaudio-module-bluetooth に改名されていてパッケージが見つからなかった。
aptX対応ヘッドホンはSBC限定に切り替えないと接続できなかった。
BT対応カーネルの設定とBTドライバのパッチ
RTL8761b(中華 BT5.0 刻印)はRTL8761aと誤認されるドングルのためドライバにパッチを当ててカーネルビルド
"/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c"
他に RTL8761bu にも対応したパッチがあったがソース構造がけっこう違ったのでパス
Bluetoothが無効になっているので有効にしてカーネルリビルド
CONFIG_BT=y
CONFIG_BT_HCIBTUSB=y
に書き換えて
make lbuild
でbluetooth関連の設定について聞かれるので適当にY/Nで回答したら、ビルド開始
ビルドが終わったら zImage を FAT32のルートにコピー
BTドングルのファームウェア
RTL8761bのFWはノンフリーのためカーネルドライバには内包されないらしい。
aptでも見つからないので、ネットで拾ってFAT32パーティション経由でコピーした。
"rtl8761b_fw.bin"
"rtl8761b_config.bin"
を FAT32 パーティションの "/root/lib/firmware/rtl_bt" にコピーしておいて、
brainから
sudo mount /dev/mmcblk1p1 /boot
sudo cp -r /boot/root/lib/firmware /lib
として"/lib/firmware/rtl_bt" へコピー
必要なパッケージのインストール
sudo apt install bluetooth pulseaudio pulseaudio-module-bluetooth
BlueZはALSAには接続できないらしく、 ALSA -> PulseAudio -> pulseaudio-module-bluetooth -> BlueZ のパスになるっぽい。
aptX使いたい場合は"pulseaudio-module-bluetooth"を有志の対応版に差し替えるらしい
起動
Bluezのサービスを動かす。
pulseaudio デーモンを動かす。
サービスに登録して自動起動にもできるらしい。
BTドングルがUSBで認識されているか確認
lsusb
Bus 001 Device 004: ID 0bda:8771 Realtek Semiconductor Corp. Bluetooth Radio
BTドングルを刺した時にfwファイルが正しくロードできたかbrainのコンソールメッセージで確認する。
PulseAudioデーモンを起動
pulseaudio --start
bluetoothctl を起動してヘッドホンをペアリング
Agent registered
CHG Controller 00:E0:45:8F:4F:03 Pairable: yes Discovery started
CHG Controller 00:E0:45:8F:4F:03 Discovering: yes NEW Device ??:??:??:??:??:?? MDR-ZX770BN NEW Device 10:4F:A8:5C:61:9E MDR-ZX770BN Attempting to pair with 10:4F:A8:5C:61:9E
CHG Device 10:4F:A8:5C:61:9E Connected: yes CHG Device 10:4F:A8:5C:61:9E UUIDs: 00001108-0000-1000-8000-00805f9b34fb CHG Device 10:4F:A8:5C:61:9E UUIDs: 0000110b-0000-1000-8000-00805f9b34fb CHG Device 10:4F:A8:5C:61:9E UUIDs: 0000110c-0000-1000-8000-00805f9b34fb CHG Device 10:4F:A8:5C:61:9E UUIDs: 0000110e-0000-1000-8000-00805f9b34fb CHG Device 10:4F:A8:5C:61:9E UUIDs: 0000111e-0000-1000-8000-00805f9b34fb CHG Device 10:4F:A8:5C:61:9E ServicesResolved: yes CHG Device 10:4F:A8:5C:61:9E Paired: yes Pairing successful
CHG Device 10:4F:A8:5C:61:9E Trusted: yes Changing 10:4F:A8:5C:61:9E trust succeeded
Device 10:4F:A8:5C:61:9E MDR-ZX770BN
Attempting to connect to 10:4F:A8:5C:61:9E
CHG Device 10:4F:A8:5C:61:9E Connected: yes Connection successful
CHG Device 10:4F:A8:5C:61:9E ServicesResolved: yes pulseaudioで認識されているか確認
user@brain:~/user/x$ pacmd list-cards | grep name:
name: <bluez_card.10_4F_A8_5C_61_9E>
※ aplay -L では仮想PulseAudioデバイスはリストされない。
PCMの再生が出来るか確認
aplay {wavファイル}
音が出ない場合は "amixer" などでミュートされてないか確認
C言語からプログラムで再生
PulseAudioのは依存パッケージが不在でインストールできない。
apt search libpulse-dev
ので、ALSAから叩くことを試みる
sudo apt install libasound2d-dev
BT-audioはpulseaudioに繋がるのでALSAを叩く方法ではアクセスできない。aplayは仮想ALSA->pulseaudioに迂回するが自前のALSA対応プログラムはsnd_pcm_hw_openでエラーになる。 ALSAの デバイス指定を"default"にするとALSA->仮想PulseAudioにルートされるので、ALSA経由で叩けば音は出せる。