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

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

Wine上の音声をPulseAudioへ渡す

(2015/1/9)本記事の内容は古く、新しいディストリであればPulseAudioに関する特別な作業は必要なく使えるようになっている。

Wineのバージョン1.1.4の時点では、Wineはオーディオの出力にPulseAudio向けのドライバは用意していないものの、alsa-pluginsに含まれるPulseAudioプラグインを使用することで、ALSA経由でオーディオを出力することができることが分かった。*1
この方法の嬉しいところは、適切な準備と設定を行うことで、x86_64上でも簡単にWine上の音声出力を録音・加工*2などができるようになること。*3

  1. 必要なもの
  2. .asoundrcの設定
  3. Wineの設定
    1. オーディオ出力先
    2. レジストリ設定
  4. テスト
  5. ドライバについて

必要なもの

  • ALSAサポートが有効なWine
  • PulseAudio(x86_64上では、x86_64版の他、x86_32版のライブラリも必要)
  • x86_32版alsa-lib
  • PulseAudioサポートが有効なx86_32版alsa-plugins*4

.asoundrcの設定

「type pulse」なPCMプラグインの定義があればOKで、「!default」の上書きは必要ない。
pcm.pulse
{
  type pulse
}
ctl.pulse
{
  type pulse
}

Wineの設定

上で定義したALSAのPCMプラグインへ音声を出力するための設定を行う。

オーディオ出力先
winecfgなどを用いて、「ALSAへの出力」として設定する。

レジストリ設定
[ホームディレクトリ]/.asoundrcで「!default」の上書きをしない場合、レジストリの中で、先ほど定義した「type pulse」なプラグインを使用するように設定を行う。
下は、Wineのレジストリエディタ(regedit)向けのレジストリファイル。
REGEDIT4

[HKEY_CURRENT_USER\Software\Wine\ALSA Driver]
"AutoScanCards"="N"
"AutoScanDevices"="N"
"DeviceCount"="1"
"DevicePCM1"="pulse"

「DevicePCM1」の値の部分が[ホームディレクトリ]/.asoundrc側の「pcm.pulse」に対応している。

テスト

これで、普通にWine上のアプリケーションから音を出せば、音声はPulseAudioに流れることになる。
例として、以前Win32版DirectXを使用してMSGSの音を出すテストをしたときのDirectX診断ツール上のミュージックテストを再現したものをキャプチャしてみた。

recordMyDesktopの動画をそのままアップロードしたため、そのままでは音声がモノラルだが、高画質版ではステレオになる。

ドライバについて

(2009/6/5)
bugs.winehq.org/show_bug.cgi?id=10495
にWineでPulseAudioをサポートするドライバ(パッチの形)がある。Mandriva Linux 2009.1ではパッケージ「libwine1」に標準で含まれている。ファイルは/usr/lib/wine/winepulse.drv.so。
うまく動かないアプリケーションではwinecfg設定ツールでDirectSoundの「ハードウェアアクセラレーション」を「エミュレーション」にするとよいようだ。
なお、x86_64のディストリでも正常に動作している。

使用したバージョン:

  • Wine 1.1.4, 1.1.5
  • PulseAudio 0.9.12
  • alsa-lib 1.0.17a
  • alsa-plugins 1.0.17(1.0.17-r1)

*1:きちんとステレオ音声で出るのも嬉しい

*2:PulseAudioをJACK Audio Connection Kitと連携させて、音声付きスクリーンキャストの取り込みや、オーディオプレーヤの出力に対してJACK Rackでエフェクトをかけるなど

*3:Wineは32bitの実行ファイルのため、外部ライブラリなどは全てx86_32のものを使用し、x86_64のアプリケーションとの連携が難しかった

*4:2008/9/22現在、Gentooの公式な「emul-linux-x86-soundlibs」には含まれない