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

スポンサーリンク
スポンサーリンク

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

コメント

タイトルとURLをコピーしました