2013-09-21

MPDをPulseAudio経由でWindowsで再生する

経緯

高級D/Aコンバータ(ESOTERIC D-07X)をヤフオクで落札しました。このDACはUSB入力をサポートしており、ハイレゾ音源の再生が可能です。しかしそのためにはWindowsに専用ドライバをインストールする必要があります。

私は音楽ファイルをNASに保存しており、MPD(Music Player Daemon)で再生する環境を構築しています。MPDはLinux上で動作しますが、Linux用のD-07Xドライバは提供されていません。

そこで、LinuxでMPDを動作させ、再生音をPulseAudioを利用し、Windowsを経由してD-07Xにつなげば、間接的にLinuxでD-07Xを鳴らすことができるのではないかと考え、試してみました。

構成

構成図を以下に示します。

端末(ユーザーが操作するもの)は何でも構いません。MPC(MPDクライアント)と呼ばれるソフトを使用します。GMPCというのが有名です。もしよかったら拙作のSkyMPCも使ってみてください(←宣伝)。http://mpd.wikia.com/wiki/Clientsに様々な機器/OSに対応したクライアントのリストがあります。iPhoneやAndroid用のものもあります。モバイル端末を使用する場合は、無線LAN環境を構築しましょう。

MPDは自宅サーバで動かします。常時通電なので低騒音省電力な機種が良いです。我が家ではEPSON ST160Eを使用しています。

PulseAudioサーバはファンレス無音省電力の小型PCです。HDDの代わりにSSDを搭載します。余っていたfit-PC2を採用しました。これも常時通電となります。Windowsを動かしてDACの専用ドライバを使う必要があるので、それなりの性能で、なおかつ無音で動作するよう、Atomプロセッサ搭載PCなどが良いでしょう。

Linux上でMPD環境を構築する

Raspberry PiをMPDサーバにする方法は既に紹介しました。

今回は、Raspberry Piではなく、自宅サーバとして使っているDebian GNU/Linuxを使用します。といっても、このLinux環境は単体のPCではなく、VMware ESXi上で動作する仮想マシンです。消費電力を増やさないために、新しいPCを使わず、既存の仮想マシンにMPDを同居させることにしました。ちなみにこのサーバは、このサイト www.soramimi.jp もホストしている、自宅サーバの要となっているものです。単独のLinuxマシンやRaspberry Piを使用する場合でも共通な点は多いので、参考にして頂けるかと思います。特にDebian系(Raspbianを含む)をお使いなら手順はほとんど同じです。

インストール

rootでログインするか、suでrootになります。

とりあえずOSを更新しておきます。

# aptitude update
# aptitude upgrade 

ALSAとPulseAudio、およびMPDをインストールします。また、必ずしも必要ありませんが、ついでに汎用プレーヤーとしてmplayerも入れます。

# aptitude install alsa-utils pulseaudio mpd mpc mplayer

楽曲ファイルを用意します。ドライブに余裕があるなら、/var/lib/mpd/musicに楽曲ファイルを格納しても構いません。筆者の場合、楽曲ファイルはNASに保存してありますので、これをマウントします。NFS以外のプロトコルでマウントしたい場合、ここでは説明しませんので、各自お調べください。

# aptitude install nfs-client rpcbind
# update-rc.d rpcbind defaults
# service rpcbind start
# mount 192.168.0.2:/share/pub/music /var/lib/mpd/music

dfコマンドでマウントされたことを確認したら、fstabの最後に1行追記します。

/etc/fstab
(略)
192.168.0.2:/share/pub/music /var/lib/mpd/music nfs defaults 0 0

ALSAの設定をします

asound.confを作成します。

/etc/asound.conf
pcm.pulse {
    type pulse
}

ctl.pulse {
    type pulse
}

pcm.!default {
    type pulse
}

ctl.!default {
    type pulse
} 

これは、ALSAからPulseAudioを利用するための設定だそうです。他のサイトの記事を参考にしました。私は詳しくありませんので、興味のある方は、他を当たってください。

PulseAudioの設定をします

ユーザmpdをPulseAudioのグループに追加します。

# usermod -G pulse mpd
# usermod -G pulse-access mpd
/etc/default/pulseaudio

確認するだけで編集はしません。

PULSEAUDIO_SYSTEM_START=0

という定義があると思います。PulseAudioをサーバーモードで使用する場合は1にしますが、今回はクライアントとして使用するので、0のままにしておきます。

/etc/pulse/default.pa

module-native-protocol-tcp の行を探して、先頭の#を取り除き、コメントを外します。

load-module module-native-protocol-tcp

module-suspend-on-idle の行を探して、先頭の#を取り除き、コメントを外します。

load-module module-suspend-on-idle

この設定は重要です。これを行わないと、mpdで再生を開始した瞬間、再生が停止してしまいます。

MPDの設定をします

/etc/mpd.conf

bind_to_address の行を探して、先頭に#を書き込み、コメントアウトします。

#bind_to_address "localhost"

auto_update の行を探して、先頭の#を取り除き、コメントを外します。

auto_update    "yes"

audio_output の行がいくつかありますが、alsaに関する設定を編集します。

audio_output {
    type           "alsa"
    name           "My ALSA Device"
    device         "pulse"
    mixer_control  "Master"
}

その下の方に、pulseに関する定義がありますが、これは編集しません。コメントアウトされたままにしておきます。
#audio_output {
# type "pulse"
# name "My Pulse Output"
# server "remote_server" # optional
# sink "remote_server_sink" # optional
#}

既に asound.conf でALSAの設定が済んでいるので、ALSAがPulseAudioに中継してくれるため、この定義は不要です。

/etc/init.d/mpd

環境変数 PULSE_SERVER に、PulseAudioサーバのIPアドレスを定義します。

(前略)
PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME=mpd
DESC="Music Player Daemon"
DAEMON=/usr/bin/mpd
MPDCONF=/etc/mpd.conf
START_MPD=true

export PULSE_SERVER=192.168.0.80

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
(後略)

ここでサーバーのアドレスを定義するのが正しいのかちょっと疑問です。
/etc/mpd.conf で設定するのが正しい気がするのですが、そうするとうまく動作しませんでした。
正統な設定方法をご存じの方がいらっしゃったら教えてください。

再起動

以上の設定が終わったら、再起動します。

# reboot

PulseAudioサーバの設定をします

Windows用のPulseAudioサーバを構築します。Atomプロセッサ搭載で、あまり高性能なPCではないので、OSはWindows XPにしました。

まず、固定のIPアドレスを割り当てます。他と重複しない余っているアドレス、筆者の場合 192.168.0.80 としました。

エソテリック株式会社のD-07Xのページの右メニューにあるドライバーダウンロードから、USB HS Audioドライバをダウンロード、ZIPファイルを展開し、ESOTERICUSBHSAudioSetup.exeを実行してインストールします。

D-07Xは3種類のUSB接続モードがあります。NORMALモードとHIGH SPEED 1モードとHIGH SPEED 2モードです。PCとD-07Xを接続し、各モードに切り替える度に、それぞれのドライバがインストールされます。

ウチの構成の場合、NORMALモードだけノイズだらけで使い物にならず、HS1モードとHS2モードは正常に鳴りました。接続するPCによっては相性問題により、正常動作するモードが異なる場合があります。

規定のデバイスを設定します。

PulseAudioをインストールします

http://www.cendio.com/pulseaudio/ から pulseaudio-x.x.x-x.win32.zipを ダウンロードし、C:\に展開します。

default.pa を作成します

C:\pulseaudio-0.9.6\default.pa
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-waveout

pulseaudio.exeを起動します。

ALSA、PulseAudioクライアント(Linux)、MPD、PulseAudioサーバ(Windows)の全ての設定が正しければ、MPDクライアントソフトでMPDサーバに再生操作を行うことで、D-07X経由で音が鳴るはずです。

運用問題

以上で、間接的にですが、LinuxでD-07Xを鳴らすことができました。

ただし、実際の運用には問題があります。

D-07Xのマニュアルには以下のような注意書きがあります。

MPDもPulseAudioもサーバーですから、基本的に常時通電で動かしっぱなしになります。その状態でD-07Xの電源を落とすと、Windows上のPulseAudioサーバがエラーとなり、その結果MPDも再生が止まります。PulseAudioサーバを起動し直して、MPDの再生を再開するのは面倒です。環境問題や消費電力に関心がなく、音響機器(パワーアンプでさえ)は付けっぱなし主義だという一部のマニアの方は、DACの電源も落とさないかもしれません。D-07Xの消費電力は5~6Wですので、付けっぱなしでもそれほど問題ではないという考え方もできますが、このご時世ですので、何でも付けっぱなしを推奨するわけにはいきません。

とはいえ、私自身、冷蔵庫は仕方ないとしても、自宅サーバーが常時150Wを消費していますので、これが10W増えたところで大した差ではないのですが、そのくせ貧乏性なのか、心情的に、使わないものを付けっぱなしにするのは気が引けます。

それで、最終的には、今まで通り、Raspberry Pi上でMPDを動かし、そのRaspberry PiからUSB-DDC経由でD-07XにS/PDIF入力とし、Linuxでのハイレゾ再生は妥協してあきらめるととします。個人的にはあまり高性能な「オーディオ耳」を持っていませんので、CDクォリティの音質で不満はありません。Raspberry Piなら3~4Wですし、別途PulseAudioサーバを用意する必要もなく、消費電力の点でも有利です。

というわけで、以上長々と解説してきましたが、自宅オーディオセットで、この構成を採用するのは止めることにしました。Linuxで(間接的に)D-07Xが鳴ったことを実証できただけで、この実験には意味があったと思います。何よりPulseAudioの使い方を学ぶことができましたので、それも良かったです。