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
コメント