
高音質再生アプリのAudirvānaで、これまた高音質配信サービスのQobuzを聴けるようにしたのが前回。引き続き、ローカルファイルの再生設定と車載のための電源断対策を行います。
少し使ってみて、音質のために面倒をいとわない人向けのアプリだと感じました。似ているなんて言ってRoonに申し訳ない、UI/UXはそのくらい(略)
特にクルマではRoon ARCやQobuzアプリ、あとAndroid限定かつAndroid Auto未対応ですがUAPP。このあたりで
スマホにUSB出力させた方が楽で便利、USB以降の機器がしっかりしていれば音質も一定水準は確保できます。
ならばこちらは使い勝手などガン無視、音質最優先で攻めてみましょう。サブスク料金もかかるし、そこで圧倒的な魅力がなければ勝ち目はなさそうなので。
ローカル再生の設定
すんなり動いたストリーミング再生に対してこっちは少しこだわったら手こずることになり、
Qobuzでいい音出てるしローカル再生要らなくね?
と心折れそうになりました。でもサブスクで配信してないアーティストさんもいるし、これをやらないとRoon+Qobuzの代わりにはならないので頑張ってみました。
AudirvānaにおけるファイルアクセスはベースとなるOSに依存し、NASやUSBなど使うストレージに合わせてOS側で設定を行う必要があります。裏を返せば、OSで扱えるストレージなら何でもライブラリにできるということでもあります。
システム構成

前回の図、Audirvānaのフルシステムはこんな構成です。PCはラズパイに、ルーターはモバイルルーターかスマホのテザリングにするとして、楽曲データをどこに置くか。
USBストレージをラズパイにつなぐのが簡単ですが、せっかく高音質のAudirvānaなのにオーディオ出力用のUSBバスをファイル読み込みに使いたくない気分(単なるこだわりです)。
以前製作したUPS付きのラズパイをファイルサーバーに仕立て直すのがいいけど、あのケースもう売ってないのよ。そういえば
クラファンで出ていたモバイルNASが正式発売になりましたね、あれいいな。ただしお値段ちょい高め。
ちょっと調べて、AndroidスマホをNAS化することにしていくつか構成を考えてみました。
車載システム案1(モバイルルーターを使う場合)

車載システム案2(サーバー役スマホのEthernetテザリングを使う場合)

車載システム案3(コントロール役スマホのWi-Fiテザリングを使う場合)

オーディオ出力部とデータ・制御を分離した、小さいながらネットオーディオの文法に沿ったシステムでしょ?
スマホが2台となっているのは、リモートアプリはWi-Fi接続がないと使えず、安定再生のためにEthernet接続にしたサーバーとは兼用できなかったためです。
おススメは(される人がいるかどうかわかりませんが)接続が安定しているモバイルルーター。自分はiPhoneに入れているpovoのeSIM(1.2TBトッピング済み)を動かせず案3にしました。
なお火災事故も起きておりスマホを車内に放置するのは厳禁です。

サーバー役のスマホにはLANアダプターを接続し、大量のデータが流れるラズパイにEthernetで伝送します。ギガビットとかの必要はなく100Mで十分。給電機能付きのアダプターなら長時間の車載運用も可能です。

ハブはUSB給電で動作するものが便利です。
スマホ側の設定
PCやNASで使われるファイル共有プロトコルとしてはSMBがポピュラーですが、スマホでは標準サポートされていない上、使い勝手の良いSMBサーバーアプリも見当たりませんでした。AndroidではLinuxカーネルのセキュリティにより、SMBが利用するTCPのポート(445番)はルート権限でなければ開けないので、おそらくOSレベルで対応してくれないと苦しいですね。
今回はSSHベースのファイル転送プロトコルSFTPを使いました。スマホでSFTPサーバーを動作させ、ラズパイでネットワークドライブとしてマウントします。
SFTPサーバーアプリの
SSH Server(Banana Studio)
をインストール。有料版はSSH Server、無料版はSSH/SFTP Serverとなぜか名前が違いますが機能は同じ。無料版は広告視聴がありアプリ内課金で回避可能です。残念ながらiOSで同じような機能のアプリは見つからずAndroid限定となります。

接続ユーザーを作成し公開するフォルダーを設定。名前やパスワードは後でラズパイ側で合わせるのでここでは任意に設定して構いません。
スマホのmicroSDカードも公開可能なので1TB程度のファイルサーバーならこれで実現できそうです。

利用するネットワークをローカルネット(有線LANなのでeth0、Wi-Fiならwlan0)に限定。インターネット側は外部からのアタックに晒される可能性があり禁止します。

自動起動の設定が充実していますが有線LAN関連の設定は無し。
ラズパイ側の設定
SFTPクライアントには「Rclone」を使います。SFTPだけでなくGoogleドライブなどオンラインストレージもマウントできる、というかそっちがメインの優れもの。
再度PuTTYでコンソールを開きログイン。
Audirvānaを停止し、Rcloneとファイルシステム操作用の「fuse」をインストール。
$ sudo /opt/audirvana/studio/setAsService.sh stop
$ sudo apt install rclone fuse
設定は対話形式でできます。
$ sudo rclone config
最初の接続名(sftp1)は任意、ホスト名は名前でもIPアドレスでも登録可能ですが、サーバー(スマホ)のIPは家とクルマで変わるので名前で定義しました。ユーザー名・パスワード・ポート番号はスマホ側で設定したものに合わせ、その他はデフォルト(ENTER)で大丈夫です。
hostsファイルに定義したホスト名を登録し名前解決を行います。保存終了したら再起動して反映。以後、スマホのIPアドレスが変わる場合はこのファイルだけ修正すれば対応できます。
$ sudo nano /etc/hosts
192.168.1.22 musicserver
$ sudo reboot now
必要なフォルダを作成して
$ sudo mkdir /mnt/music
$ sudo mkdir /var/cache/rclone
ネットワークドライブとしてマウントします。名前は先ほど設定したもの。
$ sudo rclone mount sftp1: /mnt/music --allow-other --no-modtime --read-only --vfs-cache-mode off &
マウントポイントからスマホ内の楽曲が見えれば設定できています。
$ ls /mnt/music
見えない場合はここまでの設定を再チェック。
ラズパイ起動時に自動マウントさせます。
テキストエディタでfstabファイルを開きマウント条件を追記します。
$ sudo nano /etc/fstab
sftp1: /mnt/music rclone ro,noauto,nofail,_netdev,allow_other,x-systemd.automount,args2env,vfs_cache_mode=off,config=/root/.config/rclone/rclone.conf,cache_dir=/var/cache/rclone 0 0
編集が終わったら保存して終了。fstabでマウントさせるためにリンクを一つ追加する必要がありました。
$ sudo ln -s /usr/bin/rclone /sbin/mount.rclone
スマホのSFTPサーバーが動作していることを確認して再起動します。
$ sudo reboot now
ネットワーク確立後、アクセス発生時に自動マウントされます。

リモートアプリで「フォルダを追加」すると楽曲のスキャンが始まります。自分のライブラリ(400GB弱)の取り込みは1時間ほどで終わりました。表示されている通りメタデータのみコピーして独自のデータベースを作成するため、ライブラリ本体には手を付けずに済みます(書き換えも可能)。
MusicBrainzというデータベースサービスが統合されており、これによるメタデータ補完を設定するとスキャン後にバックグラウンドで解析が行われます。こちらはかなり時間がかかり、自分の場合は丸一日ファイルアクセスが続きました。
車載では起動時の自動スキャンはOFFにした方が良いでしょう。リプレイゲイン計算は未使用。
スキャンできない場合はfstabの記述をチェック。デバッグには以下のコマンドが役に立ちました。
$ journalctl -b | grep -i mount
ラジオ再生

ネットラジオはリモートアプリの画面左下、メインメニューの「ラジオ」で再生できます。しかしデスクトップ版Audirvānaにはあるステーション追加のボタンがアプリに見当たりません。URLが頻繁に変わるNHKなどでは必須の機能で、案の定プリセットのNHKは再生できず。ダメじゃん・・・
ファイルシステムのROM化
突然電源が落ちてもファイルシステムが破損しないよう対策します。
overlayroot、オーバレイされた(重ねた)ルートファイルシステムという意味で、RO(Read Only)としてマウントしたmicroSDと、RW(Read/Write)属性のRAMディスクを「重ねた」ファイルシステムです。読み出しは普通にSDカードから行い、カード上のファイルに書き込みが発生した時はRAMディスクに書き込みます。書き込み中に電源が切れてもRAM上のデータが消えるだけなのでSDカードは元通り、つまりoverlayrootの動作中に更新したファイルは電源OFFで全て無かったことになります。
ただしAudirvānaは楽曲のデータベースや設定ファイルをコアプレーヤー内部に作成するため、これらのファイルまでROM化すると起動のたびにライブラリを再スキャンしたり設定が元に戻ってしまうことになります。書き換えが必要なファイルはROM化の対象から外す設定を行います。
データベースの書き込み中に電源が落ちた時はファイル破損の可能性があり、新曲を追加した後のスキャン中など注意が必要です。バックアップ推奨。
Audirvāna用データの移動
ラズパイをシャットダウン、起動用microSDカードを別のLinuxマシンにセットし、パーティション管理ツールのGParted(Gnome PARTition EDitor)で編集します。
Linuxマシンがない場合は、Windows上の仮想マシンにLinux環境を構築したり(
過去の事例)、LiveCD形式といってCDやUSBメモリーからOSごと起動させるGPartedもあります。

右上のプルダウンでmicroSDカードを選択すると、二つのパーティションが見えるはずです。「boot」とついている小さな領域が起動用のブートローダー、残りがLinux本体です。

Linux本体のパーティションを少し縮小して

空いたエリアに「audirvana」パーティションを作成します。容量は1GBもあれば十分でしょう。

編集が終わったら最後に適用(チェックのボタン)すれば完了です。間違ってPCのSSDを操作して起動不能にしないよう超注意。
カードをラズパイに戻し起動、ログイン、Audirvānaを停止。
追加したパーティションのID(PARTUUID)を確認します。
$ sudo /opt/audirvana/studio/setAsService.sh stop
$ blkid
新パーティションを手動でマウントし、/home/audirvanaフォルダーを移動
$ sudo mkdir /mnt/audirvana
$ sudo mount /dev/mmcblk0p3 /mnt/audirvana
$ sudo cp -a /home/audirvana/. /mnt/audirvana/
$ sudo rm -rf /home/audirvana
fstabファイルをエディタで開き、調べたIDでマウント条件を記述
$ sudo nano /etc/fstab
PARTUUID=xxxxxxxx /home/audirvana ext4 defaults 0 2
再起動し、マウントされたことを確認
$ sudo reboot now
$ df -h
hostsファイルの移動
Audirvānaのデータと同様SFTPサーバー(スマホ)のIPアドレスも変わるので、hostsファイルをROM化の対象から外し編集可能とします。
/etc/hostsをaudirvanaパーティションに移動し、元の場所にシンボリックリンクを作成。
$ sudo mv /etc/hosts /home/audirvana
$ sudo ln -s /home/audirvana/hosts /etc/hosts
overlayrootのインストール
overlayrootはRaspberry Pi OSでは標準の設定画面で導入できるようになったので簡単です。raspi-configを開き
$ sudo raspi-config

「Performance Options」-「Overlay File System」で設定します。
cmdline.txtファイルにrecurse(再帰)禁止フラグを追加、保存して終了
これをしないと追加したパーティションまでROM化されてしまいます。
$ sudo nano /boot/firmware/cmdline.txt
overlayroot=tmpfs:recurse=0
リブートして有効化。
$ sudo reboot now
mountコマンドでoverlay関連の表示があれば動作しています。
$ mount
設定変更などファイルを更新する時は、再度raspi-configで設定を戻せばOKです。
車載!
ファイルシステムをROM化しても、起動中それが有効になる前に電源が落ちたらやっぱりファイル破損の原因になります。
車載ではエンジン始動時が問題で、ACCONして起動が始まったちょうどいい(まずい)タイミングでイグニッション=電源OFFとなるので対策します。
以前PCの車載用に製作した、
タイマーリレーによる遅延起動回路を使用し、イグニッション終了後に電源ONとなるようにします。

シガーソケットからの12Vをタイマーリレーに接続、DC/DCコンバータで約6Vに落とし
リニア電源に入力。クリーンな5Vをラズパイに供給しています。
ノイズの多いラズパイをオーディオに使うのは正直引っかかるところはありますが、電源の5VをほぼそのままUSBのVbusとして出力するラズパイにはリニア電源が有効です。
感想など。
以上で導入完了。スマホでサーバーとか言い始めた時点で、ちょっと一般的でないシステムになってしまいました。最初からカーオーディオもターゲットにしているRoon ARCのようにスマートには行かず。
メリットとしては全ての音源をネイティブ再生できます。自分のプロセッサーは96kHz処理なので192kHzやDSDの音源は96kHzとか88.2kHzに変換しますが、それも高精度なアルゴリズムで処理されます。
対して回線速度の制約を受けるRoon ARCではネイティブ再生できるのは24bit/96kHzあたりが実用限界となります。変換配信で設定できるのはCD品質以下で上限を24/96とかにする機能はないため、高レートの音源はダウンロードを利用しMUSEと称するスマホのDSP演算で変換することになります。MUSEのアルゴリズムも64bit演算の凝ったものですが、自宅に集約したライブラリをロスレス配信というRoon ARCの先進的な仕組みもハイレゾ相手では美しくない対応が必要なことがわかります。
オンラインの時代だぜ?そんなのじきに回線速度も上がって…
と思っていたのにここ数年のモバイル通信は停滞、どころか悪化すら見られる状況なのでオンプレ回帰も準備しておこうかなと。いうのが今回の動機です。何なの5G。
音質について。ハイレゾ音源でなくともAudirvānaの音の良さは感じることができます。Roon ARCともQobuzアプリとも異なり、スマホとラズパイという出力デバイスの違いなのか、自宅のRoonのサブセットとしてのRoon ARCと、機能限定とはいえフルセットのAudirvānaの違いなのか。さすがに音質特化で生き残ってきたアプリだけのことはあります。
一方、ローカル音源とサブスクの統合という点ではRoon / Roon ARCには一歩、いや数歩譲る感じ。

こんな感じで、アーティスト表示やプレイリストで自分のライブラリとQobuzを横断的に使うことは可能なものの、一曲再生すればオートプレイでQobuzとローカル取り混ぜて同じアーティストや近しい?曲を引っ張ってくる、といったキュレーション機能はなく(カーオーディオではこれが便利)別のソースとして扱われています。
立ち位置はオーディオファイル向けプレーヤー、あくまで自分で選択した曲を高音質で聴くことに主眼を置いた製品と感じました。
とりあえず月額課金で始めたのを少しお得な年間契約に移行するかどうか、しばらく使って確かめてゆきたいと思います。RoonはLifetimeユーザーになって償却が終わっており、またサブスク料金を支払うだけのメリットがあるのか、モバイル回線の状況はどう変わってゆくのか、さて?