« 2022年9月 | トップページ | 2022年11月 »

2022年10月

2022年10月22日 (土)

現時点でのRaspberry PiのBluetooth Audio状況

机の片隅に転がってたRTL-SDR V3.0

パソコンに繋いでデジタルでラジオ受信が出来るという興味だけで買ったもので、一応ソフトウェアをインストールして「凄いなぁ」と

関心したところで放置されていました。w

ラジオ受信するためにパソコンが必要ってのが、ねぇ

 

久々に目に留まったので、パソコンじゃなくてラズパイとかで再生出来るなら、と、やはり放置されていたRaspberry Pi 3Bを掘り起こしてきました。

OSをmicroSDにインストールするツール(Raspberry Pi Imager)も以前と変わって便利になってるし💦

 

さて現時点でのRaspberry Pi OSの最新はBullseye。

3Bということで64bit版を選択し、インストール

 

インストールが済んだmicroSDをラズパイに挿し、電源を入れ初期設定を済まし

まず受信で最低限必要なものを

$apt-get install rtl-sdr

RTL-SDRをUSBポートに挿せばモジュールを認識します

 $ lsusb
Bus 001 Device 004: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

再生するには

 $rtl_fm -f 83.2M -M wfm -E demp  -s 200000 -r 48000 - | aplay --device=plughw:0 -r 48000 -f S16_LE

こんな感じでヘッドフォンから受信した音声が流れはじめます

(deviceは、環境によってはplughw:0がHDMIの場合もあります

さて、ここで違和感…モノラルじゃね?

rtl_fmの情報を読むと、予想通りモノラル受信オンリーです

せっかくのFM放送なのでステレオ受信に取り組みます。

RTL-SDRのステレオ受信に対応するソフトはいくつかみつかりますが(国内での高性能を謳うものもあります

今回はお手軽なSoftFMを利用

$git clone heetps://github.com/jorisvr/SoftFM
$ mkdir build
$ cd build
$ cmake ..
$ make

これで

$ ./softfm -f 83.2M


でデフォルト音声出力先にステレオ放送が出力されます




まぁここで本来の目的は達成できたんですが…
ここまで来たらLCDのメニューで放送選べたり、音量調整も出来たりすれば…なんで思い始めて
またまた手軽にpython使って組んでみました

そして、そんなことやってるウチに「ネットに繋がってるラズパイなんだしネットラジオ受信出来た方が良いんじゃ?」と
余計なことまで組み込むことに💦

お馴染みRadikoへアクセスし、受信地域や受信可能局とそのロゴをダウンロードし表示するなど…

ノイズ無しでラジオ聴ける…ウチじゃ受信が難しいTOKYO-FM、J-WAVE、beyfm78、NACK5、FMヨコハマも

RTL-SDRの必要性が無く💦

 

と、ここまで3.5mmジャックに刺さったヘッドフォンで聴いてたんです

スピーカーで聴こうと思った時に目に入った「最近作ったBluetoothスピーカー」が

 

うん、Bluetoothスピーカーに出力しよう。ラズパイはBluetooth付いてるんだし

 

で、ラズパイの最新Bluetooth Audio環境を調べ始める

これまで(busterまで)サポートされていたbluealsaが廃止され、現行はPluseAudioに集約されているらしい

しかしPulsaAudioはリソースバカ食いの様子。

ざっと調べたところ

 

  関連パッケージ数 ダウンロードサイズ DiscSpace
Bluealsa 6 242kByte 708kByte
PulsaAudio 105 69200kByte 244000kByte

 

これ以外にもPulsaAudioは負荷が大きくノイズが混じる等々の報告がコミュニティにちらほら

自分でも慣れ親しんだBluealsaで構築しようと思います

 

上に書いた通り現行RaspbianからBluealsaは除外されている(開発は進行中)ので、方法としては

1.旧OSバージョンbusterリポジトリからインストールする(bluealsaの旧バージョン…おそらく1.4くらいになる

2.bluealsaのソースからビルド(もちろん最新

 今回は2.を

 まずは必須のモジュールをインストール

 $sudo apt install git automake build-essential libtool pkg-config python3-docutils
$sudo apt install libasound2-dev libbluetooth-dev libdbus-1-dev libglib2.0-dev libsbc-dev libldacbt-enc-dev libldacbt-abr-dev  

 次に今回bluetoothで送る伝送コーデックとして使うaac、aptxHD(open aptx)のライブラリを先に構築

 $git clone https://github.com/mstorsjo/fdk-aac
$cd fdk-aac
$./autogen
$./configure
$make
$make install

$git clone https://github.com/pali/libopenaptx
 $cd libopenaptx
$make
$make install

 blue-alsa本体

 $git clone https://github.com/Arkq/bluez-alsa
$cd bluez-alsa
$autoreconf --install --force
$mkdir build
 $cd build
 $../configure --enable-aac --enable-aptx --enable-aptx-hd --with-libopenaptx --enable-ldac --enable-manpages
$../make
$../make install

インストールが終わったら環境として

/etc/default/bluealsaを
OPTIONS="-p a2dp-source -p a2dp-sink" 

で保存

 $systemctl start bluealsa
 $systemctl status bluealsa
● bluealsa.service - BluezALSA proxy
Loaded: loaded (/etc/systemd/system/bluealsa.service; static)
Active: active (running) since Fri 2022-10-21 17:23:12 JST; 7h ago
Main PID: 13981 (bluealsa)
Tasks: 3 (limit: 1010)
CPU: 55.584s
CGroup: /system.slice/bluealsa.service
mq13981 /usr/bin/bluealsa -p a2dp-source -p a2dp-sink
10月 21 21:02:40 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/ba-transport.c:631: Closing A2DP transport: 18
10月 21 21:02:40 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/ba-transport.c:1548: Exiting IO thread [ba-a2dp-sbc]: A2DP Source (SBC)
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/dbus.c:66: Called: org.bluez.MediaEndpoint1.ClearConfiguration() on /org/bluez/hci0/A2>
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/bluez.c:354: Disconnecting media endpoint: /org/bluez/hci0/A2DP/SBC/source/1
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/ba-transport.c:901: Freeing transport: A2DP Source (SBC)
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/storage.c:132: Saving storage: /var/lib/bluealsa/41:42:E6:A2:0B:96
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/ba-device.c:142: Freeing device: 41:42:E6:A2:0B:96
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/bluez.c:1160: Signal: org.freedesktop.DBus.ObjectManager.InterfacesRemoved()
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/bluez.c:1160: Signal: org.freedesktop.DBus.ObjectManager.InterfacesRemoved()
10月 21 21:03:01 raspberrypi bluealsa[13981]: /usr/bin/bluealsa: D: ../../src/bluez.c:1160: Signal: org.freedesktop.DBus.ObjectManager.InterfacesRemoved()

 

 表示されているアドレスがbluetoothスピーカーのもの

 接続はbluetoothctlでアドレスをtrust、pair、connectする

 

 最初に戻り、RTL-SDRでステレオ放送を受信し、bluetoothスピーカーで再生するには

 $alias AUDIODEV='bluealsa:DEV=41:42:E6:A2:0B:96'
$softfm -f 83.2M -a -R - |  ffplay -nodisp -f s16le -ar 44100 -ac 2 -i

※softFMの-Rは出力ファイル名だが、「-」を指定するとstdoutへ出力される

 それをffplayで受け、44.1kHz2chオーディオ信号としてbluetooth オーディオ機器に送信します

 

 

| | | コメント (0)

« 2022年9月 | トップページ | 2022年11月 »