LinuxのサウンドをリモートのWindowsマシンで鳴らす

ALL
スポンサーリンク

LinuxのサウンドをリモートのWindowsマシンで鳴らす方法です。
PulseAudio を使用します。

RaspberryPi で再生したサウンドも Windowsマシンから鳴らせます。
例えば下記記事での mp3再生もWindows でできます。

RaspberryPiでひかり電話の着信音をmp3で鳴らす パソコン鳥のブログ

スポンサーリンク

Windows側での作業

PulseAudio ダウンロード

PulseAudioを次のいずれかで用意します。

    • freedesktop.orgから入手する

PulseAudio のバージョンは 1.1 です。
https://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Support/
「zipfile containing preview binaries」のリンクからダウンロード・展開します。

    • ThinLincのバンドル版を入手する

PulseAudio のバージョンは 6.0 です。
ThinLinc という Linuxのリモートデスクトップ製品で PulseAudio は使用されています。
https://www.cendio.com/thinlinc/download の 「Client Bundle」のリンクからダウンロード・展開します。

PulseAudio の設定

次の内容の default.pa を作成します。

default.pa

load-module module-waveout sink_name=output source_name=input record=0
load-module module-native-protocol-tcp auth-anonymous=1

作成する場所は、次の個所です。

    • freedesktop.orgから入手した場合

etcディレクトリの中の default.pa を上記のもので置きかえます。

    • ThinLincのバンドル版を入手する

PulseAudio をダウンロード・展開したディレクトリをたどっていき、ファイル pulseaudio と同じディレクトリに置きます。

default.pa で load-module module-waveout~ の行の末尾の record=0 が無いと、pulseaudio 実行時に次のエラーが出て起動できないので、忘れないようにして下さい。

E: [(null)] modules/module-waveout.c: Failed to open WaveIn.
E: [(null)] pulsecore/log.c: Invalid UTF-8 string following below:
E: [(null)] modules/module-waveout.c: Error: システムにとって範囲外のデバイス ID を使用しました。
E: [(null)] pulsecore/module.c: Failed to load module "module-waveout" (argument: "sink_name=output source_name=input"): initialization failed.

2020.6.28追記
続けて、次の設定をします。
デフォルトでは pulseaudio は音を鳴らした後、アイドル状態が20秒続くと、実行を終了しますが、終了しないようにします。
(参考:https://poniti.hatenablog.com/entry/2020/01/08/002536

    • freedesktop.orgから入手した場合

etcディレクトリの中の daemon.conf に、追記します。

exit-idle-time = -1
    • ThinLincのバンドル版を入手した場合

次のファイルを作成します。XXXXX の部分は、各自のユーザー名に置き換えてください。

“C:\Users\XXXXX\.pulse\daemon.conf”

内容は次のようにします。

exit-idle-time = -1

ファイアウォールの設定

PulseAudio は TCP の 4713番ポートを使用します。
外部から 4713番へ接続できるように、ファイアウォールのルールを設定します。

次のコマンドを管理者権限のコマンドプロンプトから実行すると、ルールが追加されます、

netsh advfirewall firewall add rule name="PulseAudio" dir=in action=allow protocol=TCP localport=4713

なお、この設定が不要になった場合は、次のコマンドでルールを削除します。

netsh advfirewall firewall delete rule name="PulseAudio"

PulseAudio の実行

次のコマンドを実行します。
いくつか Warning が出ますが、問題無いので、気にしないでください。

2020.6.28修正

pulseaudio.exe -F .\default.pa
    • freedesktop.orgから入手した場合
pulseaudio.exe -F ..\etc\pulse\default.pa
    • ThinLincのバンドル版を入手した場合
pulseaudio.exe -F .\default.pa

この状態で、リモートの Linuxマシンで再生した音が、Windowsマシンで鳴ります。
(リモートの Linuxマシンで必要な設定は、後述の「Linux側での作業」を見てください)

2020.6.28削除

なお、pulseaudio は音を鳴らした後、アイドル状態がデフォルトで20秒続くと、実行を終了します。
この時間を延ばす場合は、–exit-idle-time オプションで秒単位で時間を指定します。
次の例では、600秒間アイドルで終了します。

pulseaudio.exe -F .\default.pa --exit-idle-time=600

または、バッチファイルで次のようにしておくと、終了してもすぐ pulseaudio を再実行します。
この場合は、–exit-idle-time を短くしても問題ありません。

exec.bat

:loop
pulseaudio.exe -F .\default.pa --exit-idle-time=600
goto loop

Linux側での作業

PulseAudio の設定

PulseAudio をインストールします。

apt-get install pulseaudio

次のいずれかを実施します。
ここでリモートのWindowsのIPアドレスを指定しています。

      • client.confで設定する

設定ファイルをコピーします。

mkdir ~/.pulse
cp /etc/pulse/client.conf ~/.pulse/

~/.pulse/client.conf に次の行を追加します。
xx.xx.xx.xx は、リモートのWindowsのIPアドレスを指定します。

default-server = xx.xx.xx.xx
      • 環境変数 PULSE_SERVER で設定する

次の行を実行します。
xx.xx.xx.xx は、リモートのWindowsのIPアドレスを指定します。

export PULSE_SERVER="xx.xx.xx.xx"

もし現在実行中の pulseaudioデーモンがあれば終了しておきます。

pulseaudio -k

実行中の pulseaudioデーモンが無い場合は、次のような表示が出ます。

E: [pulseaudio] main.c: デーモンのキルに失敗しました: そのようなプロセスはありません

これでサウンドを鳴らす準備は整いました。

サウンドの再生

これまでの設定で、Linux でサウンドを再生すると、リモートの Windows のスピーカから再生されます。

例えば次のコマンドを実行してみて下さい。
「フロント」「レフト」「フロント」「レフト」・・・と英語音声が流れます。

speaker-test -t wav

mp3 もリモートで再生できます。(apt-get install mpg321 でインストールしておいてください)

mpg321 test.mp3

その他

リモートのWindowsで音が途切れ途切れになる場合は、ネットワークが不安定で無いか確認して下さい。
無線LANでつないでいた場合は、有線LANで試してみて下さい。

mpg321 では -o オプションが指定できますが、下記のように pulse を指定しても音が雑音まみれになります。
mpg321 は本記事中のように使用して下さい。

mpg321 hoge.mp3 -o pulse

参考

Windows-Ubuntu間でスピーカーを共有する方法 – nishio-dens’s diary
読む価値があるのかどうか… : PulseaudioでUbuntuのサウンドをWindowsで出力する話
Windows Pulseaudio failure · Issue #8 · aseering/wsl_gui_autoinstall · GitHub
Windows用 pulseaudio 6.0のバイナリと設定 | hellokitty68
PulseAudioで他の端末から音を出す – Qiita
PulseAudio/サンプル – ArchWiki

コメント