デスクトップLinuxのサウンドをラズパイで再生する方法

デスクトップLinuxの音声出力を,Volumio のようなサウンドサーバーに転送&再生する方法です.

転送には pulseaudio を使います.たとえば

  • サウンドサーバとして, Volumioで動いている raspbery PI (つまり debianベースのLinux
  • デスクトップとして, debianベースのPC

という環境があるとして,デスクトップからLAN経由で音声データをラズパイ側に転送,ラズパイにつながったスピーカーで再生,ということができるようになります.

設定方法

  • volumio 側が pulseaudio のサーバ
  • デスクトップ側が pulseaudio のクライント

とします.

pulseaudio サーバ側の設定 (つまりVolumio側)

インストール

必要なパッケージをインストールします

$ sudo apt-get install pulseaudio pulseaudio-module-zeroconf avahi-daemon
pulseaudio の設定

設定ファイルは /etc/pulse/system.pa です

pulseaudio の認証方式は

  • 接続元IPで制限する方法
  • クッキーを使って認証を行う方法

などがあります


前者の接続元IPで制限する方法を使う場合は, /etc/pulse/system.pa の末尾に以下の2行を追加します.

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24
load-module module-zeroconf-publish

これで192.168.0.0/24 からの接続を無条件に許可します.言うまでもありませんが,IPアドレスは必要に応じて適宜変更してください

pulseaudio の自動起動

systemd を使います

まず pulseaudio の設定ファイル /etc/pulse/daemon.conf を確認します

local-server-type = user

の行があれば削除(コメントアウト)します




次に systemd 用の設定ファイルを作ります.

以下の内容を,/lib/systemd/system/pulseaudio.service というファイルに保存します.

[Unit]
Description=pulseaudio sound server
[Service]
Type=forking
PIDFile=/var/run/pulse/pid
ExecStart=/usr/bin/pulseaudio --system --daemonize
[Install]
WantedBy = multi-user.target

設定を有効にします

$ sudo systemctl enable pulseaudio.service
$ sudo systemctl start pulseaudio
確認
$ sudo systemctl status pulseaudio

で Active: active (running)
と出力されていればOKです

pulseaudio クライアント側の設定 (つまりデスクトップLinux側)

インストール

必要なパッケージをインストールします

$ sudo apt install pulseaudio-module-zeroconf avahi-utils pasystray
動作確認

まずラズパイ側の pulseaudio に接続できるか確認します

$  pactl -s <ラズパイのホスト名>  info

volumioを使っている場合は,デフォルト値としてラズパイのホスト名が volumio.local と設定されています.


うまく接続できると以下のような出力になります

$ pactl -s volumio.local info

Server String: volumio.local
Library Protocol Version: 33
Server Protocol Version: 29
Is Local: no
Client Index: 29
Tile Size: 65472
User Name: pulse
Host Name: volumio
Server Name: pulseaudio
Server Version: 5.0
Default Sample Specification: s32le 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-soc_audio.analog-stereo
Default Source: alsa_output.platform-soc_audio.analog-stereo.monitor
Cookie: xxxx:xxxx

次に avahi の名前空間を確認します.

$ avahi-browse -a

LAN内で稼働しているサービスの一覧が出力されます.

ラズパイ側が正常に動いている場合は以下の行があるはずです.

 eth0 IPv4 pulse@volumio                                 PulseAudio Sound Server local

このように "pulse@ホスト名" で pulseaudio のサーバーが見つかれば成功です

音を再生してみる

試しに mplayer コマンドを使って, test.mp3 を再生してみます.

$ mplayer -ao pulse:volumio.local   test.mp3

デスクトップの設定

GUIがあります.

$pasystray 

これでタスクトレイにスピーカーのアイコンが出てきます."default slink" がデフォルトの音声出力先デバイスになります.ここから volumio を選択します.

環境変数を使った pulseaudio サーバーの切り替え

pulseaudio は,環境変数 PULSE_SERVER, PULSE_SINK でpulseaudioのサーバーを選択しています.

ですから例えば

$ PULSE_SERVER=volumio.local mplayer -ao pulse test.mp3

という方法でサーバーを変更できます.


PULSE_SERVER環境変数の値は pax11publish でも変更できます

ハイレゾ化(?)

/etc/pulse/daemon.conf で,音声データを転送する際のサンプリングレート(≒ビットレート)が指定できます

デフォルト値は16bit @ 44.1KHz です

たとえば32bit @ 48KHz にあげるには /etc/pulse/daemon.conf の該当箇所を

default-sample-format = s32le
default-sample-rate = 48000

と書き換えます