ラズベリーパイI2S出力のBCKを16bitファイルでも64fsにする方法

Raspberry pi3でデジタルミュージックプレーヤー6

前回発覚した「Raspberry pi(ラズパイ)のI2S出力は16bitファイルの再生時にBCKが32fsになってしまうために、 BCKが64fsであることを要求するDACチップ(ES9018やPCM179xなど)は、そのままではCDリッピングデータ(44.1kHz/16bit)が再生できない。」件ですが、断念したわけではなく、Webで情報集めたり、デバイスドライバ周辺のソースコードを眺めては深いため息をついたりしていました。

出力デバイス指定を「RPi-DAC」にすると16bitファイルの再生でもBCKが64fsになって再生できるという事は分かっていて、デバイスドライバで制御が可能なはずですが、「HiFiBerryDAC+PRO」はクロックソースがDAC側という特殊な構成のためドライバの構成が複雑怪奇で、ドライバソースのBCKレシオ指定を強制的に「64」にしてみても音が出なくなるだけでした。

ドライバ側でなく、MPD側のソースを弄って、出力先のALSAに16bitの受けがないように見せかけることで自動的に24bit以上の出力にするというTipsも見つけましたが、LightMPDとVolumioなどそれぞれのMPDをリコンパイルするのは、特にLightMPDのMPDにまつわる情報が少ないことからコンパイル以前の困難が予想されます。

そこで、bit深度の変換がどこで可能か、もう一度頭を整理をしてみました。

1:楽曲ファイルそのものを変換する。
2:MPDの出力で変換する。
3:RPi DACを指定する。
4:デバイスドライバで変換する。

1:は楽曲ライブラリ全部を変換する手間と「0埋め」のためにファイルサイズが50%増しになりストレージを圧迫するだけのためボツ。
2:は使いたいMPD全部のリコンパイルが困難。(MPDの改変ポイント情報がない)
3:これだとHiFiBerryDAC+PROのクロックが使えない。(無理やりMCKでしか動作しなくなる)
4:は現状の私のスキルでは困難。

八方ふさがりに見えたその時、ふと、「MPDのソースコードで変えるんじゃなくても、MPDって設定で動作変えられるんだから、出力フォーマットも設定できるんじゃないか?」と思ってMPDの設定情報を探してみたら。。

ありました。>爆<

こことかここに。。

それによりますと、
mpd.confに
audio_output_format “*:32:2”
と記述すると、MPDの出力フォーマットを「データのサンプリング周波数引継ぎ」「32bit」「2ch」に指定ができるようです。(注1)

早速、LightMPDのmpd.confを書き換えてみます。

Volumio2の場合は、起動してSSHで接続して書き換えます。

これで実験してみたところ、LightMPD、Volumio2ともに、ラズパイのI2S出力HiFiBerryDAC+PRO経由(外部クロックマスター)のPCM1794aで、44.1kHz/16bitファイルの再生に成功しました。

はあ。。長かった。。(苦笑)
やっとこさ、PCM1794aを使い、バランス出力で「ラズパイD-PLLあり+無理やりMCK」「ラズパイD-PLLなし+無理やりMCK」に加え「外部クロック」でライブラリ全体の再生ができるようになりました。

これでソフトウエア周りはおおよそ完了。
この後はハードウエア側で最後の詰めを行なっていきます。
(まだ終わらんのかい!)
 
 
 
 
(注1)
出力フォーマットのビット指定を24bitではなく32bitにしたことに疑問を持たれた方もいるようですが、24bit指定でも構いません。
BCK(ビットクロック)が64fs(サンプリング周波数の64倍)ということは1サンプリングあたり64bit(32bitx2ch)のデータが必要なので32bitにしていました。
細かいことを言うと、24bit指定で16→24→32の二段階の変換処理にせず、32bit指定で16→32と一回の変換処理で済ますようにしているとも言えますが、かと言って24bit指定時に実際の処理として二段階変換しているのかまでは確認していませんので、割と気分的なものと思っていただいても構いません。
というか、よくよくMPDのドキュメント読んだら、完全に気分的にものでした。(苦笑)

MPDのドキュメントを抜粋しますと、
The following values are valid for bits: 8 (signed 8 bit integer samples), 16, 24 (signed 24 bit integer samples padded to 32 bit),32 (signed 32 bit integer samples), f (32 bit floating point, -1.0 to 1.0), “dsd” means DSD (Direct Stream Digital). For DSD, there are special cases such as “dsd64”, which allows you to omit the sample rate (e.g. dsd512:2 for stereo DSD512, i.e. 22.5792 MHz).

ということで、「24bit整数サンプルは32bitにパディングされる」って、「しっかり」但し書きされておりました。

あと、mpd.confを眺めて気づかれた方もいると思いますが、
audio_output_format “*:24:2″
と指定すると全ての出力が24bit2chになってしまうので、
audio_output {
         type ”alsa”
        (中略)
}
の中で
         format ”*:24:2″
を追記すれば、ALSAへの出力だけ24bit/2chにフォーマット変換が掛かるようになります。