試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PulseAudioをネットワーク経由で使用する

PulseAudioにも別のマシンで音声を出力するための機能があり、ここではその機能を使用する上でのメモをする。
本記事において、実際に音を出すマシンをローカル、出さないほうをリモートとして扱う。

  1. 準備
    1. PulseAudio Device Chooser(padevchooser)
    2. Zeroconfサポート
    3. iptablesを手動で使用している場合のファイアウォール設定
  2. PulseAudioの設定
    1. ローカル
    2. リモート
  3. テスト

準備

PulseAudio Device Chooser(padevchooser)
PulseAudio Device Chooser(padevchooser)を使用すると扱いが楽になるため、本記事ではこれを使用する。入っていなければ「padevchooser」というパッケージ名を探してインストールしておく。

Zeroconfサポート
リモート側においてローカルで動いているサーバ(デーモン)を見つけるためには、PulseAudioのZeroconfサポートが必要で

  • PulseAudioがavahiのZeroconfサポートを有効にしてビルドされている
  • PulseAudioデーモンの起動時(ログイン時もしくは手動で開始したとき)にavahi(avahi-daemon)のデーモン(サービス)が動作している

の両方を満たしている必要がある。PulseAudioが標準で入っているディストリであれば恐らくは問題はないと思われる。

iptablesを手動で使用している場合のファイアウォール設定
以下の設定はローカル、リモートの両方で

  • INPUTをDROP
  • OUTPUTをACCEPT

のポリシーで運用している前提となる。
リモート上ではZeroconfサポートによりローカルのサーバが見つけられるようにするため、以下の設定*1を行う。

## PulseAudio(リモート用)
# ローカルのサーバが見つけられるようにする
iptables -A INPUT -p udp -m udp --sport 5353 -j ACCEPT
# 接続が確立した後にやりとりされるパケットはポート番号に関係なく許可
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

ローカル上ではPulseAudioのオーディオストリームを受け取るために以下の設定を行う。

## PulseAudio(ローカル用)
# ローカル上のpadevchooserでローカルのサーバが見えない場合に記述
iptables -A INPUT -p udp -m udp --sport 5353 -j ACCEPT
# オーディオストリームを受け取る
iptables -A INPUT -p tcp -m tcp --dport 4713 -j ACCEPT

Mandriva Linuxファイアウォール設定ツール(drakfirewall)では「インターネットに接続を許可するサービスを選んでください。」のところで「詳細」を押し

5353/udp 4713/tcp

を「その他のポート」に書く。「RELATED,ESTABLISHED」に関してはルールが既に存在するため、特に何かを書く必要はない。

PulseAudioの設定

ローカル
設定ファイル[ホームディレクトリ]/.pulse/default.paがなければ/etc/pulse/default.paをコピペして、「module-native-protocol-tcp」について書かれているところを探して、auth-ip-aclにアクセス可能ホストの設定を記述する。
下は例なので、使用しているネットワーク環境に応じて変更する。
ファイル名: ~/.pulse/default.pa

(ローカルの他に192.168.1.0/24のネットワーク全体を許可する場合)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24
(ローカルの他に192.168.1.101のみを許可する場合)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.101

(2014/10/13)その後のバージョンでは設定ディレクトリの場所は、新しく作られる場合に

  • XDG_CONFIG_HOMEが未定義: [ホームディレクトリ]/.config/pulse/
  • XDG_CONFIG_HOMEが定義済み: ${XDG_CONFIG_HOME}/pulse/

となっており、この中にファイルを配置する。

リモート
リモート側でサウンドカードが使用できない場合でも自動的にダミーの出力先であるmodule-null-sinkが使用されるようなので、そうでない場合も含めて特に何かを記述する必要はない。

テスト

  1. 設定後ローカル上でPulseAudioを再起動(ログイン時に自動的に起動する場合はログアウト後再ログインでもOK)
  2. リモートでPulseAudioが自動的に起動しない場合は起動する
  3. リモート上でPulseAudio Device Chooser(padevchooser)から「Default Server」をローカルの「[ユーザ名]@[ローカルマシン名]」に設定*2、もしくはリモートの環境変数PULSE_SERVERにローカルのIPアドレスを指定
  4. リモート上でPulseAudioに対応したアプリケーションを使用

これでローカル上で音が鳴ればOK。

使用したバージョン:

  • PulseAudio 0.9.10-11.1mdv2009.0

*1:手動で端末からiptablesコマンドを実行する形の記述で、どこかの設定ファイルの内容ではない

*2:この方法では、Zeroconfの仕組みによりローカルのIPアドレスを意識せずに扱える