試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

WineのJACK Audio Connection Kitへのオーディオ出力に関しての覚え書きと実験

Wineでオーディオの出力をJACK Audio Connection Kitに指定すると、音声がモノラル(?)*1で聞こえる。
ここでは、JACKへのオーディオ出力の状態をより詳しく把握するとともに、代わりにALSA JACKプラグインを使用した場合の挙動についても触れる。
(2009/11/13)バージョン1.1.32のWine(Mandriva Linux 2010.0上)の時点ではステレオで正常に出力され、モノラルになる問題は起こっていない。しかし、アプリケーションが落ちることがあり、安定はしていないようだ。
(2014/10/3)WineのJACKドライバはその後のバージョンで廃止されている。PulseAudio経由でJACKを用いるか、PulseAudioを用いる。

  1. 準備
  2. x86_32版JACK + x86_32版ALSA JACKプラグイン + x86_32版aplayでの再生
  3. x86_32版JACK + Wine + foobar2000での再生
  4. x86_32版JACK + x86_32版ALSA JACKプラグイン + foobar2000での再生

準備

左右の音の振れがはっきりと分かるオーディオデータに関しては
http://cid-3f9be5b1cd4a806c.skydrive.live.com/browse.aspx/%e5%85%ac%e9%96%8b/%e3%83%86%e3%82%b9%e3%83%88%e7%94%a8%e7%b4%a0%e6%9d%90/Panpot%20test
に素材を用意した。サイズを縮めるためにTTA形式にしたが、これをデコードしたwavファイルを使用する。

$ ttaenc -d panpottest.tta

ttaencがパッケージになっていないディストリではTTAの本家からx86_32版実行ファイル(「Linux x86」と書いてあるもの)*2を落として中のttaenc/usr/local/bin/などにコピーするか、同ページよりソースを落としてビルドし、インストールする。下はインストール例。

$ tar zxf [ttaenc-3.4.1-src.tgzの場所]
$ cd ttaenc-3.4.1-src/
$ make
$ sudo install -s ttaenc /usr/local/bin/

x86_32版JACK + x86_32版ALSA JACKプラグイン + x86_32版aplayでの再生

Wineと関係ないが、正常な例として、alsa-utilsのaplayalsa-pluginsのALSA JACKプラグイン経由で使用して、JACKからwavファイルを再生する。

  1. x86_32なjackdを起動
  2. aplay-D pjackオプションを付けて*3wavファイルを再生

結果:音は左右に振れている(正常)

x86_32版JACK + Wine + foobar2000での再生

モノラルのように聞こえるが、仮にそうだとして、左右のどちらの音が(両方のチャンネルから)鳴っているのか、あるいは左右の出力を合成して両方のチャンネルから出しているのか、を確認する。

  1. x86_32なjackdを起動
  2. WineのオーディオドライバをJACKに設定
  3. foobar2000でwavファイルを再生

結果:左チャンネルの音声が左右両方から出力された
JACKのポートの接続が変なのかとも思ったのだが、接続状況としては、

$ jack_lsp32 -c
(中略)
system:playback_1
   wine_jack_out_0:out_l
system:playback_2
   wine_jack_out_0:out_r
(中略)
wine_jack_out_0:out_l
   system:playback_1
wine_jack_out_0:out_r
   system:playback_2

このように、Wine側の左右それぞれのチャンネルの出力が、システムのplaybackポートの左右に「正しく」接続されていて、ポートの接続がおかしいということはない。にも関わらず、オーディオ出力は左の音だけが出ている。
JACKドライバ部分のソース(dlls/winejack.drv/audio.c)では、左右のチャンネルを分けて処理しているようにも見えるのだが...

x86_32版JACK + x86_32版ALSA JACKプラグイン + foobar2000での再生

WineのオーディオドライバをALSAにするとステレオで音声が出るので、ALSA JACKプラグインを経由してJACKで音を出すとどうなるかを確認する。

  1. x86_32なjackdを起動
  2. WineのオーディオドライバをALSAに設定
  3. ALSA JACKプラグインを使用するようにALSAのPCM名を変更
  4. foobar2000でwavファイルを再生

ALSA JACKプラグインを使用するためのレジストリ設定の該当セクション(無関係な設定も含んでいる)は下のようになっている。
ファイル名: ${WINEPREFIX}/user.reg

[Software\\Wine\\ALSA Driver]
"AutoScanCards"="N"
"AutoScanDevices"="N"
"DeviceCount"="1"
"DeviceCTL1"="hw:0"
"DevicePCM1"="pjack"
"UseDirectHW"="N"

結果:音は左右に振れているが、別のオーディオファイルを再生すると、途中(0:09)で止まって(音が切れる)、Winejackdとともに落ちてしまった。
jackd側のエラーは以下。

subgraph starting at alsa-jack.pcm.jackP.18848.3 timed out (subgraph_wait_fd=10, status = 0, state = Running)


**** alsa_pcm: xrun of at least 1205147153727.488 msecs



**** alsa_pcm: xrun of at least 1205147153727.488 msecs



**** alsa_pcm: xrun of at least 1205147153727.488 msecs

(以下、同様のxrunメッセージが大量に表示)

**** alsa_pcm: xrun of at least 1205147153727.488 msecs

jackd watchdog: timeout - killing jackd

Wine側の出力は下のようになった。

cannot lock down memory for RT thread (メモリを確保できません)
Killed

memlockに関しては下の設定だったが
ファイル名: /etc/security/limits.conf

@audio - memlock 2000000

値を「unlimited」にしても、違いは「Killed」とだけ出て落ちるようになっただけだった。

使用したバージョン(ALSAドライバ以外は全てx86_32):

  • Wine 0.9.57
  • foobar2000 0.9.5.1
  • JACK Audio Connection Kit 0.109.2
  • alsa-drivers 1.0.16
  • alsa-lib 1.0.16
  • alsa-plugins 1.0.16
  • alsa-utils 1.0.16
  • pam 0.99.9.0

*1:実際には片方のチャンネルの音のみが左右の両方から出る形であることが分かった

*2:この実行ファイルはx86_32かx86_64上でのみ動作する

*3:ALSA JACKプラグインを使用するためのALSAのPCM名を指定・ここでは「pjack」という名前