2018年4月7日土曜日

PulseAudioを使った音の転送

はじめに


ネットワーク経由で音の再生・録音をしてみます。OSはLinuxです。遠いところに置いた省電力のデバイスから簡単に音を出せます。無線でつなげば、どこでも音楽が聴けるようになりますね。

構成


ここでは、音の再生・録音の操作をする計算機をクライアント、実際にスピーカやマイクがつながっている計算機をサーバとします。

クライアントは、VirualBox内で稼動しているDebian 8.1です。
サーバは、Raspberry Pi 3 Model Bです。こちらのOSはDebian 8.0です。

音の転送には、PulseAudio 5.0を用います。ALSAのひとつ上の層で動くサウンドサーバです。音をファイルから再生する場合は、

[クライアント]→[サーバ]→[スピーカ]→音
というふうにデータが流れ、録音する場合は、
音→[マイク]→[サーバ]→[クライアント]
のように流れます。

サーバの設定


まず、設定ファイルをコピーします。
cp /etc/pulse/default.pa ~/.config/pulse/
この中から、コメントアウトされているmodule-native-protocol-tcpの項目を見つけてきて、コメントをはずし、次のようにオプションを追記します。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24
auth-ip-acl=の右側はアクセスを許可するクライアントのIPアドレスです。複数指定する場合は、;で区切ります。マスクも使えます。

設定を反映するために、PulseAudioを再起動します。

$ pulseaudio --kill
$ pulseaudio --start
これで、サーバ側の準備は終わりました。

クライアントから操作


動作テストに使うwavファイルを適当に入手します。例えば、
$ wget https://freewavesamples.com/files/1980s-Casio-Piano-C5.wav

毎回サーバを指定


環境変数PULSE_SERVERを指定するだけで、サーバのスピーカから音を出力することができます。 サーバ(Raspberry Pi)のアドレスが192.168.1.2であれば、
PULSE_SERVER=192.168.1.2 aplay 1980s-Casio-Piano-C5.wav
とすると、サーバにつなげたスピーカから音が出ます。

同じように、録音もできます。

PULSE_SERVER=192.168.1.2 arecord test.wav

デフォルトサーバの指定


環境変数を毎回指定するのが手間な場合は、
export PULSE_SERVER=192.168.1.2
とします。または、client.confを設定します。具体的には、
cp /etc/pulse/client.conf ~/.config/pulse/
のように、クライアント用の設定ファイルをコピーし、コメントアウトされているdefault-serverを
default-server = 192.168.1.2
のように有効化します。

なお、これらの設定をするとクライアントにしている計算機でPulseAudioのサーバを起動できなくなります。例えば、

$ pulseaudio --start
N: [pulseaudio] main.c: ユーザーが設定したサーバー 192.168.1.2 は start/autospawn を拒否しています。
というエラーが出るようになります。

参考


[1] http://nishio.hateblo.jp/entry/20111215/1323962652
[2] https://wiki.archlinux.jp/index.php/PulseAudio/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB
[3] https://qiita.com/tukiyo3/items/d39c90f91d782001e7d7
[4] http://d.hatena.ne.jp/kakurasan/20081212/p2

0 件のコメント :