Ubuntu 17.04系Live版でのPulseAudioネットワーククライアント環境の構築とxrdp用PulseAudioモジュールのビルド

Ubuntu 17.04系Live版(Xubuntu 17.04, Ubuntu 17.04)でのPulseAudioネットワーククライアント環境の構築とxrdp用PulseAudioモジュールのビルドについて簡単に紹介致します。


  1. Xubuntu 17.04 Live(64ビット版)実行環境でのxrdpの導入
  2. Ubuntu 17.04 日本語 Remix Live(64ビット版)実行環境でのPulseAudioネットワーククライアント環境の構築とxrdpの導入


  3. QEMU仮想マシンでのxrdp用オーディオリダイレクト用PulseAudioモジュールの利用例
    実機上のUbuntu 17.04 Live環境上に更なるUbuntu 17.04 Live版をQEMU仮想マシンとして実行させてxrdp用オーディオリダイレクト用PulseAudioモジュールも組み込んでRDP接続によるオーディオリダイレクトの動作検証をしてみました。
    尚、母艦となるUbuntu 17.04 Live環境にはブリッジネットワークを構築してあります。
    ※Ubuntu 17.04 Live環境でのブリッジネットワークの構築手順及びQEMU仮想マシンの実行手順例は「QEMUブリッジネットワーク接続環境(Ubuntu 17.04 Live編)」をご参照下さい。


  4. ご参考:Ubuntu 16.10 日本語 Remix Live(64ビット版)実行環境でのxrdp用オーディオリダイレクト用PulseAudioモジュールのビルド
    以前Ubuntu 06.10 Live環境でもpulseaudio-9.0をビルドしてsesman-xorgxrdpRDP接続(Mateセッション使用)してみましたが最初はサウンド再生(オーディオリダイレクト)ができていませんでした。
    時期的に以下の組み合わせでのバージョン不整合が原因でした。
    ・xrdpのバージョン:0.9.0~20160601+git703fedd-3
    ・PulseAudioソースのバージョン:9.0(apt-get source xrdpで取得)
    ・xrdpソースのバージョン:10.0(module-xrdp-sink.soとmodule-xrdp-source.soを作成するためにgit clone --branch devel --recursive https://github.com/neutrinolabs/xrdp.gitで取得):これが不整合の原因です
    make(警告メッセージなし)で作成されたmodule-xrdp-sink.soは25,152バイトでmodule-xrdp-source.soは24,760バイトでした。
    RDP接続セッションでのParoleでmp3ファイルを再生してみた時の/var/log/syslogの内容は以下の通りです(タイムスタンプは省略)。
    ※正常動作する場合にはsyslogに「[xrdp-sink] module-xrdp-sink.c: Connected ok...」が出力されますが...。
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: 1 block_usec 30000
    ubuntu pulseaudio[10836]: message repeated 5 times: [ [xrdp-sink] module-xrdp-sink.c: 1 block_usec 30000]
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: 1 block_usec 30000
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: 1 block_usec 30000
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: not running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: close_send:
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: not running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: close_send:
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: not running
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: close_send:
    ubuntu pulseaudio[10836]: [xrdp-sink] module-xrdp-sink.c: sink_process_msg: running
    [対策]
    xrdpのソースをgit clone --branch devel --recursive https://github.com/neutrinolabs/xrdp.gitで取得するのではなくapt-get sourceとapt-get build-depを使用してxrdp 9.0のソースを取得します。
    具体的には以下のコマンドで取得します。
    ※取得したソースのバージョンは当然ながらxrdpバイナリパッケージと同じxrdp_0.9.0~20160601+git703fedd-3です。
    cd
    mkdir xrdp-9.0
    cd xrdp-9.0
    apt-get source -y xrdp ※本コマンドはディレクトリを変えて何度でも実行できます
    sudo apt-get build-dep -y xrdp ※当然ですが本コマンドではsudoが必須で、「apt-get source -y xrdp」を実行する毎に本コマンドを実行する必要はありません
    ls
    lsコマンドの表示内容;
    xrdp-0.9.0~20160601+git703fedd                  xrdp_0.9.0~20160601+git703fedd-3.dsc
    xrdp_0.9.0~20160601+git703fedd-3.debian.tar.xz  xrdp_0.9.0~20160601+git703fedd.orig.tar.xz
    
    ~/xrdp-9.0/xrdp-0.9.0~20160601+git703fedd/sesman/chansrv/pulse中にあるMakefileの「PULSE_DIR = /home/lk/pulseaudio-1.1」を「/tmp/pulsaudio-9.0」に書き換えてmake(警告メッセージあり)してみました。
    本makeで作成されたmodule-xrdp-sink.soはpulseaudio 10.0の場合と同じ25,152バイトでmodule-xrdp-source.soも同じく24,760バイトでした。
    ※module-xrdp-sink.cのpulseaudio 10.0とpulseaudio 9.0の差分はこちらです。
    make後は以下のコマンドでモジュールを入れ替えます。
    sudo cp module-xrdp-sink.so module-xrdp-source.so /usr/lib/pulse-9.0/modules
    cd
    ※xrdpのrestartは不要です。
    これによってRDP接続セッションでのParoleによるmp3再生音がRDP接続元Windows PCから聞こえるようになります(mpgファイル再生時の再生音も同様)。
    ※syslog中には「ubuntu pulseaudio[17794]: [xrdp-sink] module-xrdp-sink.c: Connected ok fd 35」というような行が無事出力されています。
    モジュール入れ替え前(オーディオリダイレクト失敗)
    ・モジュール入れ替え後(オーディオリダイレクト成功)



    xrdp sinkでのオーディオリダイレクト成功後の実機でのParoleによるmp3再生やmpg再生では通常のライン出力から音声が聞こえてきます。

    [補足]
    (1)「音量調節」パネルの「出力装置」タブで表示される「xrdp sink」は「音響吸い込み口」というような意味のようです(ライン出力音響の横取りみたいな感じです)。
    (2)Ubuntu 16.10にRDP接続したマシンからPuTTY等でそのUbuntu 16.10にssh接続して「mplayer xxx.mp3」や「mplayer -playlist プレイリストファイル」を実行するとssh接続元PCから再生音が聞こえます。
    ※mplayer起動直後に出される「mplayer: could not connect to socket」警告は~/.mplayer/configにlirc=noを指定すれば表示抑止できます。
    (3)Windows側のリモートデスクトップ接続のオプションでリモートコンピュータのサウンドが[このコンピュータで聞く]ではなくて[リモートコンピュータで再生する]になっている場合はRDP接続元にはオーディオリダイレクトされずどこからもサウンドは聞こえてきません。
    但し、サウンドが聞こえてなくてもsyslog中には「ubuntu pulseaudio[xxxxx]: [xrdp-sink] module-xrdp-sink.c: Connected ok fd xx」というような行は出力されます。
    (4)iPhoneでのVPN環境でもオーディオリダイレクトが機能します。
    (5)実機にログインした場合「音量調節」パネルでのサウンド出力装置が「xrdp sink」になってしまってサウンド再生ができない状態になるケースがあります。
    (5-1)その場合は一旦ログアウトしてrootでログインして以下のコマンドを実行すればubuntuユーザで再ログインして「音量調節」パネルを見ると「ライン出力」に戻るようです。
    killall -u ubuntu
    (5-2)ライン出力に戻った後は、例えば「PulseAudio Preferences」でPulseAudioネットワーククライアントの設定をすれば「pulseaudio --k」をしなくても「音量調節」パネルには「on xubuntu@xubuntu」という出力装置が自動追加されます。
    「サウンド」パネルで「on xubuntu@xubuntu」を選択して<テスト>ボタンを押せばテスト再生音がPulseAudioネットワークサーバ側から聞こえてきます。
    (5-3)Ubuntu 16.10 LiveにRDP接続すれば「PulseAudio Preferences」にはPulseAudioネットワーククライアントの設定がそのまま残っていますが「xrdp sink」によるオーディオリダイレクト機能は正常に動作します。
    (5-4)しかしRDP接続セッションからログアウトして実機に再ログインすると「音量調節」パネルでのサウンド出力装置が再度「xrdp sink」になってしまいます。
    (5-5)そこで上記(5-1)を再度実行すると「ライン出力」に表示が戻り、「PulseAudio Preferences」にはPulseAudioネットワーククライアントの設定がそのまま残っていて「on xubuntu@xubuntu」という出力装置も追加表示されます。
    (5-6)「sudo systemctl restart lightdm」(ssh接続して実行)や「pulseaudio --k」なども併用していると実機とは逆にRDP接続セッションの中で「音量調節」パネルでのサウンド出力装置が「ライン出力」になってしまってサウンド再生ができない状態になるケースがあります。
    その場合もrootで「killall -u ubuntu」を実行して再度RDP接続すると「音量調節」パネルでのサウンド出力装置が「xrdp sink」に戻り、オーディオリダイレクト機能は正常に動作します。
    (5-7)オーディオリダイレクト用PulseAudioモジュールを導入した場合はPulseAudioネットワーククライアントの設定は避けた方が無難かも知れません。
    (6)Xubuntu 17.04 LiveやUbuntu 17.04 Liveではgit clone --branch devel --recursive https://github.com/neutrinolabs/xrdp.gitで取得したソースがバージョン10.0で整合性が取れているはずなのでapt-get sourceとapt-get build-depを使用したxrdp 10.0のソース取得及びpulseビルドは行っていませんが、念のためapt-get sourceとapt-get build-depを使用したxrdp 10.0のソース取得及びpulseビルドをしてみればUbuntu 16.10 Liveと同様に正常動作するのかも知れません。

    (7)Ubuntu 16.10 Liveでのオーディオリダイレクト成功版(aptでのxrdpソース取得版)でのPulseAudioモジュール群は以下のコマンドでバックアップしておくとリブート時にビルドの手間が省けて便利です。
    cp /usr/lib/pulse-9.0/modules/module-xrdp-sink.so /media/ubuntu/.../module-xrdp-sink.so.v9.0
    cp /usr/lib/pulse-9.0/modules/module-xrdp-source.so /media/ubuntu/.../module-xrdp-source.so.v9.0

    尚、リブート後の/usr/lib/pulse-9.0/modulesへのモジュールコピーは以下の通りです。
    sudo /media/ubuntu/.../module-xrdp-sink.so.v9.0 /usr/lib/pulse-9.0/modules/module-xrdp-sink.so
    sudo /media/ubuntu/.../module-xrdp-source.so.v9.0 /usr/lib/pulse-9.0/modules/module-xrdp-source.so

    (8)PulseAudioネットワークサーバからのRDP接続例
    Xubuntu 17.04 Live(32ビット版)環境で構築したPulseAudioネットワークサーバから上記のUbuntu 16.10 LiveにRDP接続してオーディオリダイレクト機能を利用してみました。

  5. ご参考:QEMU仮想ディスクへのUbuntu 17.04 日本語 Remix(64ビット版)のインストールとその利用例
    UbuntuのLive版にQEMU環境を構築してその仮想ディスクにUbuntu 17.04 日本語 Remix(64ビット版)をインストールし、更にxrdp環境も導入してWindows側からRDP接続してみました。
    Ubuntu 17.04 日本語 Remix(64ビット版)+xrdp環境を導入したQEMU仮想ディスクを作成してUSBディスクに保存しておくといろいろなOSのQEMU実行環境でそのQEMU仮想ディスクが利用できるようになります。
    特に後述の手順に従えばUbuntuのLive環境のDVDブートから20分もかからずにそのQEMU仮想マシンへのRDP接続テストも可能となります。



  6. ご参考:QEMU仮想マシンのネスト実行例
    Ubuntu 17.04系で最も動作が軽いのはUbuntu MATE 17.04です。
    母艦をUbuntu MATE 17.04 Live(64ビット版) としてそのQEMU仮想マシン上でUbuntu MATE 17.04 Live(64ビット版)を実行させるとそのQEMU仮想マシンは軽快に動作します。
    そのQEMU仮想マシン上で更にQEMU仮想マシンとしてUbuntu MATE 17.04 Live(64ビット版)を実行してみました。
    デスクトップ表示には至りませんでしたがUbuntu MATEのロゴ表示までは動作します。