ラズパイでオーディオプレーヤを
2019/05/12
ラズパイで専用プレーヤ作れるかな?
  • 以前ですが "USB-DACとPCオーディオ(4)" にて、システム構成例の一つに、静音化PCを専用プレーヤとして使用する下記案を書いたことがあります。


  • この時は「専用PCは予算的に厳しい」と考えていたのですが、先日ラズパイを触った際に「ラズパイなら低予算で専用プレーヤを作れるかな」と思い始めていました。ファンレスにもできますしプレーヤ用のコンピュータとしては最適です。

  • ラズパイにはもちろんUSBがあるので、本体を持ってくればよいだけです。MPD(Music Player Daemon)には Volumio を使うことにしました。

しかし作ってみると問題が
  • 軽く作って楽しもうと思ったのですが、いざ使ってみると問題が出てきてしまいました。

  • ローカルストレージのデータを再生するのは問題ありませんが、無線LAN越しのサーバー経由で楽曲を再生した時や、ネットラジオを聴く場合に、再生音がノイズ(砂嵐)もしくは無音になってしまうことがあるのです。

  • 無音については、バッファアンダーランが起きていると考えれば良さそうですが、砂嵐についてはバッファアンダーランで説明できません。こちらはPCMのフレームが崩れ、本来無い位置に音圧のbitが立っている状態と思われます。

  • 原因についてネットを探ってみましたが、うまく情報を見つけられませんでした。

他の人はどうしているのかな?
  • 似たような問題に遭遇した人がいるのではと、ラズベリーパイを使用したオーディオについて再度ネットをを調べてみると、多くはGPIOにあるI2S経由でDACを接続したシステムを扱っていると感じました。

  • 何故かそのままUSB-DACに接続したシステムの話は少ないように見えます。USB電源/GNDノイズ対策がデフォルトなのか、または単純過ぎて面白くないのかもしれませんが、それにしても静音サーバーとしてのメリットだけでも大きいのに、ほとんど記事が無いことは不思議です。

  • ここで手詰まりになってきたので、一度ラズパイ/Linuxの音楽再生について調べることにしました。

ラズパイ/Linux音楽再生の仕組み
  • ラズパイ/Linuxのオーディオは下記のように
    • プレーヤーアプリケーション(今回はVolumio)
    • Pulse Audio
    • ALSA(Advanced Linux Sound Architecture)
    の階層を持っています。

  • 恐らくですが
    • Pulse Audioはいろいろなアプリケーションが出力するPCMデータのミキサー
    • ALSAはPulseAudioがまとめたPCMデータをUSB等のデバイスへ渡す
    といった役割と思われます。

  • しかしVolumioというディストリビューションでは標準でPulseAudioが入っていません。これはVolumioがPCMデータを直接ALSAへ送っていることを意味します。PCオーディオとして正しい形になっています。


    Figure 1. ラズパイ/Linux音楽再生

では原因について考えてみよう
  • 構成を把握したところで、今回のトラブルの原因ついて考えてみることにしました。

  • Volumioに原因があれば、USB/I2Sを使用したシステム構成に関係なく問題が起きますがそうではありません。つまりVolumioはシロです。

  • ALSAは複数のデバイスとやり取りしているので、もしALSA内部の上位階層が原因ならば使用インターフェースに関係なく問題が起きます。これもVolumioと同じ理由でシロです。

  • よって原因はALSAとUSBに絞れてきます。しかしALSAのUSB処理そのものが駄目な場合は、ほとんどのアプリケーションが成立しません。オーディオでUSBを使っていること、そして接続しているDACとの間に何かがあります。

  • 使用したUSB-DACをWindows PCに接続してもノイズ(砂嵐)は発生しません。つまりDACのハードの問題ではなく制御に原因があります。今回使用しているDACはUSB Audio Class 1.0です。これとALSAの関係をキーワードにして調べると、下記の情報を見つけました。

    • オーディオ向けにカスタマイズしたLinuxカーネル より引用しました (*1)
      フィードバックのデータ形式はUSBの規格で定められていて、 12Mbps以下ならば3バイト、480Mbpsならば4バイトのデータを送ります。 ところが、Windowsでは480Mbpsでも3バイトのフィードバックを期待しているようなのです。 ...(中略)...Linuxでは480Mbpsの場合に、 規格どおりに4バイトのフィードバックが帰ってくることを期待しているので、 Windows向け480Mbpsオーディオクラス1のデバイスが接続できなくなるのです。

  • 意外なところに問題があるかもしれないと感じました。多数派もしくはデファクトスタンダードになってしまっている Windows側に USB Audio Class 1.0 の仕様と異なっている点があるという内容です。

  • 転送調整制御データの構成bit数が異なっているらしいのです。これならストリームが停止しやすい状況で不具合が出るのも納得です。機器側もWindowsに接続することは必須のため、仕様と異なるデファクトスタンダードができあがってしまったものと思われます。あくまで想像ですが。

  • そうなってくると USB Audio Class 1.0 DAC への ALSAによるUSB接続はカーネル修正以外に解がありません。なるほどI2S経由になるわけです。これが暗黙の了解になっているとは...Linux Audioの世界は恐ろしいと感じます。

I2S経由でPCMデータを出力しよう
  • 話を戻して、PCM出力経路として、USBを避けて前例の多いI2Sを経由させるわけですが、その後ろをどうするか。

  • ラズパイのGPIO接続ボードにはDACもあるので、それを載せても良いのですが
    • 現在外にDACがある
    • USB Audio Class 2.0ならば普通にUSBを使える
    を考慮し、今回はデジタルAudioインターフェースの追加、すなわちS/PDIFを追加することにしました。


    Figure 2. HifiBerry Digi+ Standard

  • さて結果ですが非常に良好です。USBに問題が本当にあったかはさておき、不具合が無くなったところで趣味としては十分満足です。

  • 今回は使うというより、作ることそのものが目的だったので、できあがったモノを家族へ渡すことにしました。説明書がこちら。あらためて読んでみて、ちょっと自分に絶望...えっ、私の説明書、下手過ぎ...?。

  • ま、楽しめたから、良かったということで。
Notes
  • 今回は、この情報が無ければ詰んでいたと思います。
Copyright(C) 2019 Altmo
本HPについて