サウンドデバイスの認識

以下では、ALSA環境においてサウンドデバイスがどのように認識されるかの一例を示します。
※要は手持ちのUSB-DACやマザーボードの一例です。

TEAC UD-501、KENWOOD R-K731

富士通のTX100S3にUbuntu 12.04をインストールし、それにTEAC UD-501、KENWOOD R-K731を繋いだ場合を示します。
ALSAのバージョンは、1.0.24です。
システムが認識したサウンドデバイスは、

/proc/asound

にディレクトリができるので、それで確認できます。

card0〜card4が認識されたサウンドデバイスを示します。それぞれのデバイスには、ハードウェアから認識されたのでしょうか、機種名を示すようなエイリアスが設定されていてます。
card0のエイリアスNVidiaは、ビデオカードのHDMI出力です。ビデオカードは、玄人志向のGF8400GSです。
card1のエイリアスCMI8768はサウンドカードです。これも玄人志向のCMI8768を使っています。このカードは、アナログ出力とS/PDIF出力を備えています。
card2のエイリアスDACは、DigiFi誌付録のUSB-DACです。
card3のエイリアスUD501は、USB接続したTEAC UD-501です。
card4のエイリアスCODECは、USB接続したKENWOOD R-K731です
この状態で、

aplay -l

を実行すると、それぞれのデバイスの概要がわかります。
alsa_ud501_01.png
ここで表示されるカード番号、カード名、デバイス番号は、後述するmpd.confで使用します。
UD-501については、stream0ファイルで対応フォーマットを確認できます。
alsa_ud501_02.png
Ratesのところに、44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000とあり、これで44.1KHz〜384KHzに対応していることがわかります。一世代前のUSB-DACだと、192KHzには対応していても、176.4KHzには対応していないということがありますが、UD-501では両方に対応していることがわかります。また、EndpointにASYNCとあり、非同期転送に対応していることがわかります。

TEAC UD-501 V2

TEACのUD-501がDSD11.2MHzに対応するアップデートを行っていますので、僕も申し込んでみました。
こちらから送って、一週間ほどで戻ってきました。
Ubuntuにつないでみたところ、mpdから音が出ません。
なんのことはありません。ALSAのデバイス名が、UD501V2に変わっています。
ud501v2_01.png
UD501V2のstream0ファイルで対応フォーマットを確認すると、あらたに705.6KHzに対応していることがわかります。
ud501v2_02.png
DSD 11.2MHzの音源については、Volumio 2 Ver 2.295 で再生できることを確認しました。Raspbian 9.1、Ubuntu 16.04 では再生できません。

DigiFi No.15 付録D/Dコンバーター

富士通のTX1310 M1にUbuntu 14.04をインストールし、そこにDigiFi No.15 付録D/Dコンバーターを接続した結果です。
上と同じく/proc/asoundの中身を確認します。
DigiFiのD/Dコンバーターは、Olasonicと表示されています。

alsa_digifi15_01.png alsa_digifi15_02.png

Olasonicのstream0ファイルで対応フォーマットを確認すると、96KHz/88.2KHz/48KHz/44.1KHzに対応していることがわかります。

alsa_digifi15_03.png

また、EndpointにASYNCとあり、非同期転送に対応していることがわかります。

LXU-OT2

仮想PCにVortexBox 2.2をインストールし、そこにLXU-OT2(ステレオ誌付録)を接続した結果です。
ALSAのバージョンは、1.0.25です。
上と同じく/proc/asoundにディレクトリの中身を確認します。
alsa_lxuot01.png
I82801BACHI2は、仮想PCのオンボードサウンド出力です。LXUOT2は、文字通りLXU-OT2です。
aplay -lを実行すると、二つのデバイスが表示されます。
alsa_lxuot02.png
LXUOT2のstream0ファイルで対応フォーマットを確認すると、32KHz/44.1KHz/48KHzに対応していることがわかります。
alsa_lxuot03.png

ASUS E45M1-I

ASUS E45M1-Iには、オンボードでRealtekのALC887が実装されていて、マルチチャンネルのアナログ音声出力とS/PDIFを備えています。また、ビデオ出力にHDMIも備えています。
このマザーボードを搭載しているPCに、VortexBox 2.2をインストールしたときのサウンドデバイスの認識結果は以下の通りです。
/proc/asoundには、SBとGenericの二つのディレクトリができています。前者はALC887、後者はHDMIです。

alsa_e45_01.png

aplay -lを実行すると、三つのデバイスが表示されます。一つ目はHDMI、二つ目と三つ目はALC887のアナログ出力とS/PDIF出力です。

alsa_e45_02.png

C-Media CMI8768

ちょっと古いサウンドカードですが、アナログ5.1ch出力とS/PDIF出力を持っています。
S/PDIFから出力させる場合、alsamixerで、アナログ出力を全て無効にしないといけないようです。

Volumioの場合

Raspberry Pi 3を購入したので、Volumio 2をインストールしてみました。
Volumioも、ベースはDebianなので、コンソールから触る分にはUbuntuとほとんど同じです。
Volumioのバージョンは2.185で、mpdのバージョンは0.20.6、ALSAのバージョンはk4.4.9-v7+でした。

VolumioにKENWOOD R-K731を接続子細のaplayの出力は、このようものになりました。

aplay_01.png

card 0は、HDMIです。ここからもちゃんと音が出ます。R-K731は、card 5に割り当てられています。

mpdの設定ファイルは、Debian/Ubuntu同様に/etc/mpd.confですが、Web GUIから設定を変更すると、その内容/etc/mpd.confに反映されます。
なので、手動でmpd.confを手動で編集するのはやらないほうがいいのではないかと思います。
同時に複数デバイスに出力させたい場合などは、手動で/etc/mpd.confを編集することになりますが、そういう使い方をする場合は、Raspbianを使ったほうが良いのではないかなと思います。

mpd.confの設定

サウンド出力先の設定

インストール直後のmpd(mpd.conf)の設定では、システムのデフォルトのサウンド出力先がmpdの出力先にもなります。
複数のDACを使用する場合や、オンボードサウンドがあるPCでUSBから出力したい場合などは、mpd.confを書き換える必要が出てきます。
mpd.confの音声出力先は、デフォルトでは以下のようになっています。

audio_output {
    type        "alsa"
    name        "My ALSA Device"
}

この部分を、使用するサウンドデバイスにあわせて書き換えていきます。また、複数のサウンド出力先を使用する場合は、上記ブロックを繰り返し記述します。
以下は、TEAC UD-501の記述例です。

audio_output {
    type        "alsa"
    name        "UD-501"
    device        "hw:UD501,0"
    mixer_type    "none"
}

上記中、deviceの部分で、サウンドデバイスの指定を行います。ここは、plughwとhwの2種類の指定方法があるそうです。
plughwとhwの違いはよくわかりませんが、ググってみると、サンプリングレートの変換を行いつつ再生させたい場合はplughwを使えということのようです。
サウンドデバイスの指定は、aplay -lで表示されるサウンドデバイス一覧にある、card(カード)番号またはデバイス名、そのデバイス番号を使用します。
上述の例だと、UD-501は、hw:UD501,0またはhw:3,0となります。
ただし、このカード番号については、システムがサウンドデバイスを認識した順序よって変化するようです。
なお、サウンドデバイスの検出順序は、/etc/modprobe.d/alsa-base.confでコントロール可能ですが、USB接続された複数のDACの認識順序を変えるのは困難だと思います。
また、サウンドデバイスを検出させたくない場合は、/etc/modprobe.d/blacklist.confにそのデバイスを記述することで対処できるそうです。

mixer_typeは、ボリュームコントロールの設定です。noneとしておくと、mpd側でボリュームコントロールができなくなります。
テクニカルな話になりますが、mpcbridgeで使用しているPEARのNet_MPDのNet_MPD_Common::getStatus()を実行すると、mpdのステータスが戻ってきます。この中にvolumeというパラメーターがありますが、mpd側でボリュームをコントロールできない場合は-1が戻ってきます。mixer_typeをsoftwareとすると、mpd側でボリュームをコントロールできるようになり、volumeの値は現在のボリューム位置が0〜100の数値として戻ってきます。
mixer_typeにhardwareを指定した場合、上記volumeの値が0で戻ってきます。が、音量を変更することはできません。mpcbridge側は、音量制御可能と判断して、ボリュームコントロールの画面を表示することができますが、実際には音量を変えることはできません。
なお、複数のサウンドデバイスが使用可能な状況で、mixer_typeの値にnoneとsoftwareを混在させた場合に、Net_MPD_Common::getStatus()の戻り値がどうなるかは確認していません。

例えば、TEAC UD-501とKENWWOD R-K731を出力先に指定する場合、mpd.confには以下のように記述します。

audio_output {
    type        "alsa"
    name        "UD-501"
    device        "hw:UD501,0"
    mixer_type    "none"
}
audio_output {
    type        "alsa"
    name        "R-K731"
    device        "plughw:CODEC,0"
    mixer_type    "none"
}

上記設定を行った場合、mpcbridgeからはnameで指定したUD-501とR-K731が出力先として指定、選択できるようになります。

output.png

出力フォーマットの固定

ビットパーフェクトを無視して、常にリサンプリング(アップもダウンも)して、出力させることもできます。
その場合、libresampleというモジュールが必要になります。ubuntuもVortexBoxも、libresampleはパッケージに含まれているので、インストールは簡単に行えます。
libresampleの詳細は、https://ccrma.stanford.edu/~jos/resample/Free_Resampling_Software.htmlを参照してください。
mpd.confの設定は、audio_output_formatとsamplerate_converter(※)の2箇所です。
前者は出力フォーマットを、後者はリサンプルの精度を指定します。
出力フォーマットは、44100:16:2のように指定します。サンプリング周波数、量子化ビット、チャンネル数の順です。それぞれ、出力先が対応しているパラメーターを入れる必要があるのは言うまでもありません。それ以外の値を設定した場合にどうなるかは確認していません。
リサンプルの精度については、mpd.confのmanで確認できます。以下の値を設定できるようです。
設定値は、リサンプルの精度が高い順に、Best Sinc Interpolator、Medium Sinc Interpolator、Fastest Sinc Interpolator、ZOH Interpolator、Linear Interpolator、internalとなります。
デフォルトは、Fastest Sinc Interpolatorとなっています。
精度が高いと、当然ながらCPUの負荷も高くなります。

※ このパラメータはmpd 0.20で廃止になり、resamplerが新たに追加されています。

以下作成中...