
どうも、半年ぶりのブログです。更新の少ないこんなところに見にきてくれて、ありがとうございます。
ここ2年ほどはネットワークオーディオに取り組んでいます。PV数を見る限り結構人気のこのシリーズ、今回はちょっとマニアックなところを攻めます。
自分のネットワークオーディオはこんな構成で始めました。

ラズベリーパイ(3B)のサーバー
ネットワークオーディオ自作(1) MinimServer
APU.2D4のレンダラー
ネットワークオーディオ自作(2) lightMPD
を製作しました。スマホからコントロールする、コンパクトなDLNA/UPnP/OpenHome対応システムです。
こんな風に車載しました。
ネットワークオーディオ車載
モバイルルーター Aterm MR04LN(NEC)
スイッチングハブ LSW-TX-3EP/CUW(BUFFALO)
その後、レンダラーをAPUからPCに
ネットワークオーディオ自作(7) lightMPDをPCで(番外編)
サーバーはUPSを変更して12V電源化、アプリをMinimServer2へ
ネットワークオーディオ自作(8) ラズパイサーバーを改良する
と更新しています。PCを車載するため安定化電源も追加しました。
PC用安定化電源(遅延起動対応)
音源を自前で用意するセルフ再生としては、機能的にはこれで満足。音質的にもそれまでのAndroid端末やDAPより改善しましたが、ネットワークオーディオにふさわしい音質改善方法は何かないものか、と探ってみました。
オーディオ用ネットワークの分離

オーディオ用ネットワークを他と分離するために、図のルーター2(数千円で購入できるトラベルルーター)を追加しました。詳しくはこちら。
ネットワークオーディオ用ネットワークの分離
こんなことで音質が上がる、てゆうか「落ちなくなる」んですよ。ネットワークにつながっている機器が多いほど効果を実感できると思います。
これで完成だな、と整備手帳を上げて悦に入っていたところ、
「追加ルーターはラズパイでできるのでは?」
「ついでにHUBも無くせるんじゃね?」
とのレビューコメント(意訳)を頂きました。
ぐぬぬ・・・その手があったか!
ネットワークに欠かせない、というか「あって当たり前」のHUBを無くしてしまうというのは、相当にアグレッシブな発想です。コメントではストレートマフラーに例えられていたのが言い得て妙だなぁと。世の中にはオーディオ用スイッチングHUB(!)なんてのがある位なので、良いか悪いかはともかく音質への影響があるはずと直管、いや直感しました。
高級ケーブルとかも否定はしません(むしろ好物です)が、もっと根本的な、原理的なところに手を入れる、そんなアプローチでオーディオをやってみたかった!のです。
それに、ラズパイがあればサーバーもルーターもHUBも要らないなんて、今ネットワークオーディオで商売しているメーカーさんは・・・やらないよね。
システムプラン
まずはイメージから。

サーバーとなっているラズパイにソフトウェアルーターを追加し、
・モバイルルーターに対する子機 と
・スマホに対する親機
の2つの役割を持たせます。ラズパイ・PC・スマホの3台でオーディオ専用ネットワークLAN2を構成します。ルーター機能によりセグメントを分ければ、上位のネットワークLAN1からLAN2に不要なブロードキャストパケットが流れ込むことはありません。さらにサーバーとレンダラーは対向接続のため他からのアナログ的なノイズ混入はゼロ、かつHUBによるバッファ(ストア&フォワード)動作もなく低レイテンシーです。
なお理解のためwlan0およびwlan1と分けて記載してあるWi-Fiは、実際にはラズパイの内蔵Wi-Fiだけで実現できます。
USBドングル型のアダプターを使用する場合も「デュアルモード」対応かつ同時動作可能な機種なら同じく1つでOKです。
OS導入
ラズパイのOSは今回もデスクトップレス版を使用します。
OSイメージ作成アプリのRaspberry Pi Imagerを
公式サイトからダウンロード、Raspberry Pi OS Lite(32bit)を選択してmicroSDカードに書き込みます。
ラズパイのコンソールとして、USBポートにキーボード、HDMIポートにモニター(TVでも可)を接続、microSDカードをセットして起動します。
LANポートには何もつなぎません。よって最初はインターネットが使えず、ローカルコンソールで設定してゆきます。
Wi-Fiネットワークに接続
OS標準の構成ツールで設定します。
(ログイン後、以下同じ)
$ sudo raspi-config
「System Options」から「Wireless LAN」を選択、初回は地域コードの設定を促されるので「JP」を選択後、接続するルーターのSSIDとパスワードを入力します。
「Localization Options」からタイムゾーンとキーボードも設定しておきます。日本語キーボードを使う場合、設定しないと「 | 」(パイプ記号)が入力できなかったりするので注意。
リブート後、Wi-Fiが有効になります。
$ ifconfig wlan0
としてIPアドレスが割り振られていれば成功です。(起動時の画面にも表示されます。スマホアプリの
Fing も便利。)
ここまででインターネットに接続できたので、OSを最新状態に更新しておきます。
$ sudo apt-get update
$ sudo apt-get full-upgrade
$ sudo reboot
内蔵Wi-Fiアダプタの機能を調べてみました。
$ iw list | grep -A 4 "interface combinations"
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
managed はクライアント、APはアクセスポイントです。model 3B のラズパイでは、クライアントとアクセスポイントの同時動作は可能ですがチャンネル数は1、つまり同じチャンネルを共有するということ。速度は落ちるかもですが、DLNAのコントロール用なので大丈夫でしょう。
Wi-Fiルーター構築
さて肝心のネットワークをどうやって実現するか?いくつか試してみて、ここで解説されている方法がうまく動作したので紹介します。
StackExchange.com - Access point as WiFi router/repeater, optional with bridge
ステップ1. systemd-networkdのインストール
ステップ2. hostapdのインストール
ステップ3. wpa_supplicantの設定(クライアント)
ステップ4. インターフェースwlan0の設定
ステップ5. hostapdの設定(ブリッジ)
ステップ6. wpa_supplicantの設定(ブリッジ)
ステップ7. インターフェースbr0、eth0の設定
手順が多めですが、アレンジが必要なのはWi-Fiの設定とIPアドレスくらいで、ほとんど記事の通りにしていけば大丈夫です。
設定後はこうなります。システムプラン通りです。
これでWi-Fiルーターとしての設定ができました。Wi-Fiのアクセスポイントにスマホなどを接続し、インターネットに抜けられることを確認します。
サーバーとレンダラーの対向接続
こちらは簡単。PC同士を(HUB同士も)直結する場合、本来LANケーブルにはクロスケーブルという特殊な結線のものを使います。しかしLANコントローラとOSが「AutoMDI/MDI-X」対応であれば通常のLANケーブルが使用可能です。
ラズパイとlightMPDのPCを接続し、Wi-Fi上のスマホから
Fing などを使ってlightMPDが見えれば通信できています。
ストレートとクロスを間違えたり、HUBレスにしたからといって機器に電気的な過負荷がかかったり壊れたりすることはありません。普通に動くケースが多いと思います。
MinimServer2のインストールと設定
UPnP/DLNAサーバーのMinimServer2をインストールします。方法は以前の
ブログで紹介した通りなので省略します。
MinimWatchから設定できるプロパティに ohnet.subnet という項目があり、複数のネットワークがある場合にMinimServerが使用するネットワークを指定できるようになっています。今回の構成では192.168.13.0にすべきと思いますが、設定してもしなくても再生できていてよくわかりません。
動作確認と考察
UPS付きラズパイとLIVA Q2はクルマで運用中のため別システムを作って動作確認しました。

ラズパイとPCを直結。PCはUSBメモリーからlightMPDを起動、つながっているDAPはUSB-DACの代わりです。ラズパイにWi-Fi接続したスマホから、UPnPコントロールアプリ(BubbleDS)で再生しています。
改善と検討したい点がありますが、ひとまず完成とします。
(残課題とフォローアップに記載)
USB伝送におけるバルクペット、ネットワークオーディオのDirettaもそうで、データ伝送プロトコルによる音質改善は最新のデジタルオーディオでは割と見かけるようになりました。
クロック情報が含まれるS/PDIFと違って、USBやネットワークオーディオの伝送経路にはそこかしこに「非同期」が存在し、それを吸収するためのバッファ(メモリー)が必要です。
(非同期が悪ではなく、非同期と同期のどちらが音質的に有利かはケースバイケースなのでここでは触れません。)
大きなバッファを一気に満たすのか、小さなバッファをこまめに制御するのか。また、大きなパケットでドカンと送るのか、小さなパケットでちょろちょろ送るのか。非同期伝送にはシステムの数だけ送り方のバリエーションがあります。
エラーが発生しないよう適切に設計されている限り、送り方でデータが変わるわけではありません。しかしアナログ段への影響は(残念ながら)ゼロにはできず、伝送プロトコルによってその影響をコントロールしよう、ということなのでしょう。
さて音質的にはどんなもんでしょう。
HUBレス伝送によるレイテンシー削減は、ベルトドライブに対するダイレクトドライブのような音をもたらしてくれるのでしょうか。(んなバカな、いやそうとも言えんぞ・・・)
かつてはメーカーしかできなかったようなことが、1万円もしない手のひらサイズのコンピュータで試せるのは楽しいものです。
残課題
・Wi-Fiの制御系がどうにも頼りない感じ。再生時間表示がスキップしたり、アルバムアートの取得が遅かったり、一晩放っておくと接続が切れていたり。対する有線LANの再生系は盤石で、音飛びなど無く良い音で再生を続けてくれるので本腰を入れて改善したいと思います。
・UPnP版のlightMPDにはキャッシュがあり標準で有効になっています。HUBレスにしておいて、最後の最後に1曲まるごと格納できるようなバッファを設けるのはどうなんだろう。思想が合っていないような気もしたりしなかったり。
・あ、MTU値を最適化する宿題ももらってました。これも後日。
フォローアップ
(2012/5/27追記)
まずはよわよわなWi-Fiをなんとかしようと試みました。
1. パワーマネジメント機能の無効化
この対策は定番のようです。FAQにOFF推奨ってなっている機能って何よ?
$ sudo nano /etc/rc.local
/sbin/iw dev wlan0 set power_save off
/sbin/iw dev ap@wlan0 set power_save off
$ sudo raspi-config
System Optionsの「Wait for Network at Boot」を有効に
2. ACアダプターの容量アップ
3までのラズパイはmicroBのUSBコネクタで給電する仕様ですが3A近い電流を流すのはちょっと無理があり、ケーブルとコネクタの抵抗成分により電圧不足になりがちです。
コンソールに低電圧の警告「Under-voltage detected!」が出るような状態だと、ラズパイの内蔵Wi-Fiは性能が低下するようです。
以上の2つで多少改善しましたが、完全な解決には至らず。
あれれ、意外と手こずるぞ・・・今回は「概念実証編」ということにして、次回「実用化編」に続きます。