さて、昨今ラズパイ・オーディオなどど銘打って、RaspberryPi上に音楽再生用のソフトウェアを導入して、ネットワークオーディオに変える遊びが、ここ3年程の環境の整備がようやく整ったためか、急速に流行っているような印象を受ける。
そのような中でラズパイ・オーディオのポータルブルにおける利用については、モバイル環境で使用するにはパワー(音質)重視で消費電力が大きすぎたり、操作に対する考慮が不足していたり、バッテリー切れ時にOSが突然シャットダウンする課題に対処できていなかったりと、まだまだ発展途上なように思う。
という事で、今回は前回書いた「Raspberry Pi はポータブルオーディオプレーヤーの夢を見るか?」の続きの話題として、ポータブルオーディオプレーヤーで使用する、主にソフトウェア(ディストリビューション)について考えてみたいと思う。
そして、せっかくなのでボクがRaspbianを改変して作ってみた「Sabreberry DAC ZERO」と「Raspberry Pi Zero W」の組み合わせを前提とした似非ディストリビューション、その名も「Lean(引き締まった) MPD」を恥ずかしげも無く公開してみたい。
なお、公開するイメージについては、様々なサイトで紹介されている情報や、他で提供されているディストリビューションの良いところを
ディストリビューション(似非)のコンセプトを考える。
さて、ポータブルオーディオ向けのディストリビューションを考える際、主には以下の5点を考える必要があるかとおもう。
1.突然のシャットダウンによりファイルシステムが破壊されるのを回避する
2.消費電力をなるべく低減する
3.プレーヤーのリモート操作方法
4.プレーヤー操作における機能の過不足と配置
5.上記を踏まえた上でより良い音質となるよう配慮
特に、Raspberry Piが幾らIoTでの利用も視野に入れたような機器とは言え、「Linuxシステムを正しいOSシャットダウンも行わず、いきなり電源を切る」なんて行為は長らくLinuxシステムを触ってきた人達(ボクを含む)からすると、常軌を逸した行為であることは間違いないと思う。
というわけで、ボクが改変するディストリビューションのコンセプトとしては、まず、LightMPDやVoyageMPDで採用されていたような、「Read Only」なシステムである事が望ましいかと思う。その上で、利便性をどう確保するか、その点を考えたい。
そして、次に消費電力の話になるけど、当然、ポータブルでの利用なので、バッテリー駆動になるだろうが、充電容量が有限である以上、消費電力は可能な限り小さくなるようにする方が望ましいだろう。
さらに、ポータブルでの利用においては、当然Sabreberry DAC ZEROにはボタンが装備されているので、この操作を用いるというのもあるけど、やはりその他のディストリビューションと同様に画面から操作できるのが便利かと思う。ここをどうするか。
画面の操作においてはUIの最適化という観点もあるのでそこも併せて考えたい。
最後に。せっかくラズパイ・オーディオなどというある程度手間のかかる趣味で遊んでいるわけなので、音質に対する配慮は必須だろう。
以上、もう色々考える事がありすぎて、この記事を書こうと思ってから既に数週間が経過したのも、その理由が良くわかるんじゃないだろうか(笑)
RaspbianをベースにAuFSを組み込んでRead-Onlyなシステムを実現する。
もう、この似非ディストリビューションの肝はこれ(Read-Onlyシステム)くらいと言っても過言では無いのだけど(笑)、「その改変のしやすさ=汎用のOSをベースに作る」だと思うので、まずRaspbianをベースに開発したいと思う。
Raspbianで使用できるReadOnlyファイルシステムとしては、以前から色々と調べていて、UnionFSもしくはAuFSがそれなりに実績があるという事だったので、Raspbianでの成功事例の多いAuFSを今回は採用する事としたい。
なお、AuFSの組み込み方については、他で解説しているサイトも色々あるので、ここでは詳細に述べないが、基本はカーネルのソースを取得してきたものに、パッチを適用し、Kernelコンパイル時にこれを有効にしてコンパイルを通すことになる。
AuFS - GitHub
なお、このAuFSの有効化/無効化にはfsprotectというソフトウェアを用いて行う事になる。fsprotect自体はaptで導入可能となっている。
なお、実際にこのAuFSを有効化する方法は、起動時のカーネルパラメーターを決める/boot配下の「cmdline.txt」に有効化する場合は最後に「fsprotect」を追加、無効化する場合はfsprotectの項目を削除するか「nofsprotect」に変更した後、再起動を行う事で適用される。
この辺りは、ファイル操作が結構面倒なので、「/home/pi/scripts」配下に以下のシェルを準備したので活用いただきたい。
・remountrw.sh …「nofsprotect」に変更した上で再起動
・remountro.sh …「fsprotect」に変更した上で再起動
・switch2rw.sh …「nofsprotect」に変更のみ実施
・switch2ro.sh …「fsprotect」に変更のみ実施
なお、シェルスクリプトなんて書くのは既に5年ぶりだったりするので、バグ等は十分ありえるかも(笑)
あと、全てをRead-Onlyにしてしまうと結構使い勝手が悪いので、以下の通り、パーティション構成を変更している。
/dev/mmcblk0p1 …「/boot」 起動時に読むのみでほぼ読み書きしないのでRW。
/dev/mmcblk0p2 …「/」 頻繁に書き込みが行われるのでRO。
/dev/mmcblk0p3 …「/mnt/sd/music」 音楽ファイルを配置するのみなのでRW。
こうする事で、音楽ファイルの追加に関しては、SCPなどを経由してRWモードへの変更無く追加が可能となっている。
この構成変更に合わせて、raspi-configにおいて「/dev/mmcblk0p3」を拡張できるように修正を加えている。
なお、初期の/mnt/sd/musicの容量は64MBしか無いのでご注意を(笑)
不要なサービス&モジュールを起動停止&削除して消費電力を減らす
MPDによる音楽の再生やその利便性の向上のために使用するプロセスやモジュール以外のサービスについては、単純に意味も無くバッテリーを消費しているだけとなるので、これらは可能な限り停止する事が望ましいだろう。
なお、今回のベースとした「RASPBIAN STRETCH LITE 2017-09-07」のイメージで色々確認したのだけど、なんだかんだ最初からかなり最適化されていて、ほとんど停止できそうなサービスは無い状態だった。
最終的に停止できたのは以下のサービス。
・dphys-swapfile(Swapを使わない前提)
・keyboard-setup
・triggerhappy
・dhcpcd(固定IP化した後に停止可能)
不要なパッケージの削除も色々試したのだけど、Debianはどうもそのパッケージ管理の仕組みの弊害か必要だか不要だかよくわからないパッケージもaptでのインストール時に入ってしまい、何度かチャレンジしたのだけど、面倒でパッケージの整理はやめてしまった。
だって、fsprotectの関連モジュール消そうとしたら、何故かmpdまで消そうとするとか訳が分かんないんだもの(笑)
あと、電源系のTIPSで使わない機能の使用する電力を削減するために、以下も適用しておいた。
・Wifiをオフ …
config.txtに起動オプション(dtoverlay=pi3-disable-wifi)指定、iwconfigで恒久的に停止、ifconfigで起動後に停止の3つの方法があるけど、今回はいつでもONにできるようにifconfigで起動後に自動停止させるようにした。
・HDMI出力をオフ …
起動後に「tvservice -o」をrc.lcoalに設定。
・USB給電をオフ …
起動後にhubctrlコマンドでUSB給電を停止。(Raspberry pi zero Wがポートが一つのため、影響も少なかろうと今のところ未設定)
その他、カーネルモジュールについても一通り目を通して、使わなそうな物(WiMAXとかジョイスティックとか大量)も一式、コンパイル時からモジュールを組み込まないようにしてる(つまりUSB等で接続しても使えない)けど、効果は不明。
Bluetoothテザリングを用いてより省電力な通信経路を構築する
自分でディストリビューションを構築し始めるまではたかじんさんの公開しているAPモード対応版のOSイメージをありがたく利用させていただいていたのだけど、Raspberry Pi zero W側をアクセスポイントとして使用する方式には2つ程課題があるように感じていた。それが、「消費電力の問題」と「インターネットアクセスの問題」だ。
まず、消費電力の削減においては、どうにも無線LANが消費する電力量が多いような気がしていて、可能ならこれをオフにしたままで運用できれば良いんだろうけど、無線LANをオフにしてしまえば、Sabreberry DAC ZERO側の物理ボタンの操作のみでしか操作ができなくなってしまい、これはやはり利便性を大きく損なう事になってしまう。
なるべくならリモートアクセスは有効としておきたいところだろう。
というわけで、これまではSabreberry DAC ZEROでは、無線LANのオン/オフを物理キーで操作できるようにたかじんさんが実装してくれていたので、その機能を使って、都度、操作時にオンとオフを切り替える方法で運用していたのだけど、やっぱりちょっとこれだとかなり具合が悪いように感じていた。
そして、もう一点が、どうしてもRaspberry Pi Zero W側がAPとする方式だと、Raspberry Piへの無線接続をONにしている間は、インターネットへのアクセスができなくなってしまうという問題が生じてしまい、こちらも不便を感じていた。
というわけで。ふと思いついた新しい方式として「スマホのBluetoothテザリングをON」にして「Raspberry Pi Zero WとBluetooth経由でネットワーク通信する」手法を試したところ、これがすこぶる調子が良い事に気づいた。
接続時は以下のようにアイコンが表示されるので、これも接続や起動が視覚的に判断できて便利だったり。
消費電力はちゃんと比較していないけど、BluetoothはClass2程度だと、WiFiの数分の一の電波出力しか出さないためか、無線ノイズも感じないし、何より、Raspberry Pi Zero側のympdとインターネットに同時にアクセスできるのが大変に便利だ。
というわけで、ボクのディストリビューションではこのBluetooth経由での端末アクセスを採用する事にしている。
この接続方法については、「bt-pan」という優秀なPAN(Personal Area Networking)接続を行うための優秀なPythonスクリプトが公開されているので、これを利用する事で、Raspbianへの組み込み自体はとても簡単。
bt-pan
なお、将来的にはBT-LE経由でコマンドのみ発行するなどでさらなる省電力が望めるかと思うけど、現在のところはBT ClassicでのPAN接続を利用している。
ympdをプチ改造して、スマホ利用時の利便性を向上させる
最近、急速にその勢力を広げているディストリビューションにパパリウスさんが公開しているSymphonic-MPDというカリカリに高音質にチューニングされたRaspbery Pi 3専用のディストリビューションがあるのだけど、Symphonic-MPDの登場でインスピレーションを受けたのは、実はその音質だけではなかったりする。
Symphonic-MPD
ボクがこのディストリビューションからインスピレーションを受けたポイント。それはympdは改造できるというポイントだ。
Symphonic-MPDを使っている人はよく知っていると思うけど、ympdの実に多くの部分に手が入っており、ユーザビリティを大きく向上させている。
というわけで、ボクもちょっとympdをいじれないかとソースファイルを確認したところ、主にはHTML&Javascript&C言語と、ボク程度のスキルでも「ギリギリならプチ改造できる」レベルだと感じた。
というわけで、ボクがスマホから操作している際に気になっていた3点、
・音量スライダーが使いにくい
・何故か曲送り・曲戻しなどの操作系がプルダウンメニュー内にある
・OSのシャットダウンにSabreberry DAC ZERO側でのボタン長押しが面倒
について対処してみる事にしよう。
まず、音量スライダーだけど、これが実に長さが短く、微妙な音量調節ができずに不便な点、それは音量ボタン(-5/+5)を新たに配置する事で解決した。
配置位置は最初プルダウンメニュー内に追加で配置したのだけど、色々試した結果、現在は以下のように曲送り/曲戻しボタンと併せて、曲名表示の下部に配置するようにしている。
使ってみると思うけど、この位置の機能配置は随分便利かと思う。
なお、PCでの接続時に同機能のボタンが画面中に複数並ぶので、余裕があればPC表示時は消す(レスポンシブ対応)などやりたいけど、今のところ困らないのでこれで(笑)
また、ボタンからのシャットダウン実装については、パパリウスさんの実装を拝見させていただく機会もあり、結構ちょろいだろうという事で実装を試みたのだけど、Debian Stretchの権限周りの制約に翻弄され、かなり苦労してしまった。
WebサービスからのOSコマンド発行って、確かに普通に危ないかもしれない。
あれこれ調べながらやっていたので、結局おそらくパパリウスさんとは異なる手法で実装は完了したけど(笑)
なお、画面から「RWモード」に再起動するボタンが操作できれば便利だろうという事で、こちらも合わせて配置&機能実装している。
こちらも、ソースの改造やスクリプトの作成自体は簡単に終わったのだけど、やはり、権限周りの制約をどうクリアするかで相当苦しんだ。
Linuxの設定に知見のある方はsudo関連ファイルの中を見てもらえれば、「コイツかなり苦しんだんだな」がわかってもらえるかと思う(笑)
うーん、でもまあ正解知りたいのはやまやまなんだけどね。「/boot配下のファイルをWebサービスの起動ユーザーであるnobodyからどう操作させるべきか」というお題なんだけど。
音質についても真面目に考える
さて、次に音質について。これは上記の不要なサービスを停止したり、使わない機器に対する電源供給を停止したりする事で、ある程度の向上が見込める事かと思う。
もしかするとRead-Onlyファイルシステムを採用している事による、書き込みIOの低減も音質の向上に貢献するかもしれない。
それに加えて、積極的な音質改善手法として、このディストリビューションでは以下を試している。
・RealTimeカーネルの採用。
・mpdに対するRTパッチの適用、および最適化設定。
・CPU供給電圧のオーバーボルテージ(1.4v)
なお、CPU供給電圧のオーバーボルテージのみ、違和感があるように感じる方もいるかもしれないけど、ボクの過去からの経験により「如何にCPUが音楽再生のために元気に動けるか」がこういったLinuxオーディオシステムの肝だと思っているので、デフォルトで適用する事にしている。
オーバークロックに比べて、印可電圧の変更は、MPDのディストリビューションのようなCPUを余りぶん回さないシステムではあまり消費電力に影響しないだろうという、経験に基づく勘が働いたこともある。
その他、細かい調整は他のディストリビューションでやっている手法が色々あるのでそれを
というか、ここまででちょっと疲れたのかも(笑)
まあ、後からいじれるところはまだ0.01版だからここからいじればいいしね。
Lean MPDらしさを求めて(笑)、表示を変更する
実際、使用する上では名前なんてどうでも良いんだけど(笑)、ちょっと自身のプロジェクトとしての管理の意味も含めて「Lean MPD」なんて名前を付けているので、せっかくなので幾つか修正して「らしく」してやる事にしよう。なお、構築し始めた時は「Skinny MPD」という名称だったのだけど、Raspbianの容量がいくらやってもうまく減らせないので、これでは「Skinny(ガリガリ)」なんて名乗れないという事で、「Lean MPD」に変更した経緯があったり(笑)
というわけで、以下辺りを修正。
・/etc/motdを修正して、ログイン時の表示を変更。
・ympdの画面上部の表示を変更
・ホスト名をleanmpdに変更
ログイン時に大きなロゴが表示されるディストリビューションが多いので、自分もちょっと真似して試してみる事にした。
なお、修正自体は簡単で「/etc/motd」というファイルを修正するのみで、対応が可能。
文字をASCII文字に変換してくれるサイトを色々巡回して、以下のデザインを採用した。
また、ympdの表示&アイコン変更はソースの改修が必要になるのだけど、以下の通り、Bootstrapの「炎アイコン」を採用して脂肪燃焼を表現してみている。
後は、ホスト名は「leanmpd」という風に変えてみているけど、あくまでRaspbianのちょい(?)改造版という事で、ユーザー名等については「pi」のまま変更はしていない。
ディストリビューション作りってば大変
ふう。疲れた(笑)
以上、今回は実際に「ディストリビューションを作ってみた」というところを紹介してみたのだけど、たったこれだけの改変でここまでの労力や検討事項があるという点については理解していただけたんじゃないかと思う。
というわけで、あまり、無料で色々配布してくれている皆さんに、無邪気に要望など出すという事がどれだけ空気の読めない行為かという事がご理解いただけるだろうか(笑)
まあ、そのためにオープンソースという形で「そんなに気になるならお前で勝手に改変していいよ」といったやり方が世界で主流になっているのかと思うんだけどね。
なお、実際のボクが作ったLeanMPDのイメージについても、次の記事で、初期設定(コマンド操作です、、、)の手順と共に公開中だったり。
今のところ、「単なる習作」としての扱いなので、サポートとか継続的な更新は全く考えていないのだけど、色々実験的な要素を含んでいるので、興味のある方は是非試してみてはいかがだろうか。
うーん。でもここ数週間の調査と実験を通じて、やっぱりラズパイ・オーディオって、突き詰めるためにはLinuxの知識が必須だよなあと再認識したなあ。
オーディオやるためにLinux勉強するのって変な時代なんだけどね(笑)
スポンサーリンク
スポンサーリンク