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

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

x86_64上でのみ起きていた、TTAのGStreamerプラグインのノイズ問題に対処

GStreamerのプラグインにおいても、ttaencと同様の置換を行うことで、砂嵐状態だった再生だったのを、正常に再生できるようにできた。→「x86_64なGNU/LinuxにおけるTTA(The True Audio)対応の現状
以下、ディストリのパッケージとして修正済みのプラグインをインストールする手順をGentoo,Debian/Ubuntuに分けて紹介する。

Gentoo Linux x86_64版の場合の流れ

Gentoo Linuxの場合は基本的にソースからビルドしてパッケージを入れていく形なので、ビルド時に展開されるソースツリーに対して修正後のソースで上書きすれば、修正されたものをパッケージとしてインストールしてくれる。
(2007/11/14)「x86_64上で起きるTTA(The True Audio)のGStreamerプラグインのノイズ問題に対処するためのebuild修正と、メモリ使用量の問題について」において、ebuild上で修正を行うようにした。


下の例では、修正後のソースツリーが/tmp/以下にあるものとする。

$ su
# emerge -av gst-plugins-bad
(configureスクリプトが開始されたらCtrl+Zで一時停止)
# cd /var/tmp/portage/media-libs/gst-plugins-bad-0.10.4/work/gst-plugins-bad-0.10.4/gst/tta/
# sed -i -e 's/unsigned long long/u_int64_t/g' ttadec.h
# for i in *.[ch]; do sed -i -e 's/long/int/g' $i; done
# fg

(2007/7/2)sedコマンドの-iオプションを使用して直接ファイルを上書きしてフィルタするように修正・内容の重複により「ソース修正の手順」を削除

Debian,Ubuntu x86_64版の場合の流れ

Debian系ディストリでは、「apt-get source」で、ソースのダウンロードと展開、独自パッチの適用までを行ってくれる上、そのソースツリーで修正とビルドを行ってパッケージ作成までを行える。
今回、Ubuntu Feisty x86_64版で実験を行った。慣れないdebパッケージビルドで結構トラブったので、メモを兼ねて。
まずは、debソースパッケージをビルドするのに使用するパッケージ群が入っていなければ事前に入れておく。

$ sudo apt-get install dpkg-dev debian-keyring fakeroot

ソースを取ってきて

$ apt-get source gstreamer0.10-plugins-bad

修正を行い

$ cd gst-plugins-bad0.10-0.10.4/gst/tta
$ sed -i -e 's/unsigned long long/u_int64_t/g' ttadec.h
$ for i in *.[ch]; do sed -i -e 's/long/int/g' $i; done

ソースパッケージをビルドする。

$ cd ../..
$ dpkg-buildpackage -rfakeroot -us -uc -b

ビルドに必要なパッケージが足りていない場合、

dpkg-checkbuilddeps: Unmet build dependencies: libgstreamer0.10-dev (>= 0.10.10.1) libgstreamer-plugins-base0.10-dev (>= 0.10.10.1) gstreamer-tools (>= 0.10.11cvs20070110) autotools-dev cdbs (>= 0.4.32) check debhelper (>= 5) gtk-doc-tools liboil0.3-dev (>= 0.3.2) libbz2-dev libdts-dev libgl1-mesa-dev | libgl-dev libgsm1-dev libmms-dev (>= 0.2) libmpcdec-dev libsdl1.2-dev libwavpack-dev (>= 4.32-1) libswfdec0.3-dev (>= 0.3.6) libsoundtouch1-dev libneon25-dev (>= 0.25.5) libmusicbrainz4-dev (>= 2.1.0) libgtk2.0-dev (>= 2.2.0) libx11-dev libasound2-dev (>= 0.9.1) libcdaudio-dev libjack0.100.0-dev (>= 0.99.10) ladspa-sdk

のように言われるので、

$ sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer-tools autotools-dev cdbs check debhelper gtk-doc-tools liboil0.3-dev libbz2-dev libdts-dev libgl1-mesa-dev libgsm1-dev libmms-dev libmpcdec-dev libsdl1.2-dev libwavpack-dev libswfdec0.3-dev libsoundtouch1-dev libneon25-dev libmusicbrainz4-dev libgtk2.0-dev libx11-dev libasound2-dev libcdaudio-dev libjack0.100.0-dev ladspa-sdk

のように、必要なパッケージを入れていった後で再試行。
これでビルドが開始され、パッケージの作成まできたところでこんなエラーが出た。本来パッケージに含めるはずのファイルが足りていないようだ。

cp: cannot stat `./debian/tmp/usr/lib/gstreamer-0.10/libgstmodplug.so': No such file or directory
dh_install: command returned error code 256
make: *** [binary-install/gstreamer0.10-plugins-bad] エラー 1

configureスクリプトの出力をよく見ると

configure: *** Plug-ins without external dependencies that will NOT be built:
        modplug

というのを見つけた。何かの事情でビルドしない設定にされている。configureスクリプトの「もと」であるconfigure.ac*1を見ると

dnl see if we can build C++ plug-ins
if test "x$HAVE_CXX" != "xyes"; then
  AC_MSG_WARN([Not compiling plug-ins requiring C++ compiler])
  GST_PLUGINS_SELECTED=`echo $GST_PLUGINS_SELECTED | sed 's/modplug//g'`
fi
AC_SUBST(GST_PLUGINS_SELECTED)

という部分を見つけた。つまり、GCCに含まれるg++コマンドがまだ入っていなかったため、ビルドできないので無効にされていたようだ。

$ sudo apt-get install g++

これでlibgstmodplug.soがビルドされない問題は解決。

dh_gstscancodecs
GConf エラー: 設定サーバ (gconfd) との接続に失敗しました: いくつか発生する可能性として、ORBit の TCP/IP ネットワークを有効にしていない、あるいはお使いのシステムで古い NFS のロックがクラッシュを引き起こしたことが考えられます。これに関連する情報については http://www.gnome.org/projects/gconf/ を参照して下さい (詳細 -  2: IOR ファイル '/tmp/gconfd-root/lock/ior' のオープンに失敗しました。gconfd がありません: No such file or directory)
mapping method init - connect2: No such file or directory

最後に、上のエラーが延々と出て進まなくなる問題に悩んだが、結局は

$ sudo dpkg-buildpackage -us -uc -b

として実行することで通った。あとはdebパッケージを普通にインストール(-i)指定する。

$ sudo dpkg -i ../gstreamer0.10-plugins-bad_0.10.4-1ubuntu1_amd64.deb

動作確認

$ gst-launch-0.10 filesrc location=sample_44_2_16.tta ! ttaparse ! ttadec ! alsasink
$ gst-launch-0.10 filesrc location=sample_44_2_16_TTA.mka ! matroskademux ! ttadec ! alsasink

(TTA).tta、(TTA).mkaともに正常に再生されることを確認できた。GStreamer対応のプレーヤーからの再生もOK。

*1:configure.inというファイル名のこともあり、役割は全く同じ