English page is here.
その他のプログラム


xmms MMX最適化パッチ(等)

3DNow!パッチに続いて、mpg123のCVSツリーに取り込まれているMMXデコーダパッチもxmmsに移植してみました。 オリジナルのMMXパッチは、higwayさんという方が作成したもののようで、ソースの中に"this code comes under GPL"と書いてあるし、こんな実験してWebで公開しても良いんですよね? Linux歴が短い私には、ライセンス周りは良くわからないので、詳しい方のご意見求む。

と言ってたら、higwayさんから返事がきました(2001/04/14)。

OK> I attempt porting MMX mpeg audio decoder to xmms.
OK> Can I open this patch on my Web page?
Sure, you can do it.
In fact, my patch distributed under GPL license as part of mpg123, but
you can use it under any license, you want.

だそうです。ありがとうございます。

このページのMMXパッチ等を試してみた人はjacobi@sorryihatespamjcom.home.ne.jpnospamまで知らせてくれるとうれしいです。 というか、興味のある人(なくてもいいけど)はぜひ試して、結果をメールしてください。最近、リアクションが全然無くてさみしいっす(^^;といってたら、本家からリンクがはられて海外からメールがポツポツ来るようになってきました。

xmms MMX最適化パッチもXMMS-1.2.8から本体にマージされたようです。 というわけで、このパッチももう更新を行わない予定です。 ありがとうございました。

ダウンロード

テスト

古いバージョン

ベンチマーク・パッチ

それにしても最近のCPUは速すぎて効果がわかりづらいですね〜。 というわけで、XMMSのディスクライタープラグインを拡張して、/dev/nullに書き込むようにするパッチも置いておきます。 ディスクライタープラグインでは、フルスピードでMP3ファイルをデコードするので、ファイルを書き出さずに/dev/nullに出力すれば、ハードディスクの速度の制約を受けることなく、デコード性能が測れると思います。

さらに、ベンチマークパッチは、xmmsのコマンドライン・オプションに -bオプションも追加します。これはプレイリストの曲を演奏し終わったら、xmmsを終了させるモードです。 xmmsの設定ダイアログで、出力プラグインを「ディスクライター」にし、ベンチマークモード(/dev/nullへ出力)にした上で、一旦xmmsを終了し、コマンドラインから time xmms -b等とすれば、再生に要した時間が測れます(パッチがいい加減なんで面倒ですまぬ)。

コンパイル方法 :

現在、MMXパッチはxmms本体のソースにあてるパッチ形式でしか公開していません。 試してみたい方はこんな手順でどうぞ。

  1. xmmsのサイト等からソース(xmms-1.2.7.tar.gz)を入手する
  2. ソースを展開する (例: tar xfz xmms-1.2.7.tar.gz )
  3. MMXパッチをあてる
    (cd xmms-1.2.7; zcat xmms-1.2.7-mmx.patch.gz | patch -p1 )
  4. (あてたい人は)ベンチマークパッチをあてる
    (zcat xmms-1.2.6-dwbench.patch.gz | patch -p1 )
  5. configureを作り直す
    (例: aclocal; automake; autoconf )
    libxmmsディレクトリでも作り直す
    (例: cd libxmms; aclocal; automake; autoconf; cd .. )
  6. 改めてconfigureする。--enable-simdオプションを付けないとそもそもこのパッチをあてた意味がありません(^^;。その他のオプションはお好みで
    (例: ./configure --enable-simd )
  7. コンパイル (例: make )
  8. (必要ならsuでrootになってから)インストール (例: make install )
  9. 以上

ベンチマーク

xmmsの出力先を上のパッチを当てたディスクライタープラグインにし、/dev/nullに出力させて、timeを使って計測したuser timeを掲載します。 xmmsはMMXパッチ リリース2をあてた1.2.4です。 サンプル曲は宇多田ヒカルのCan you keep a secret?、For you、Time Limitの3曲(96kbps VBR, 合計13分38秒、7.2MB)としました。 秒数はtimeの出力のuser timeです。 分かりやすくするために、元曲の長さに対する比率、x倍速(比率の逆数)も載せておきます。

ちなみにDuronで3DNow!デコーダよりMMXデコーダの方が速いのは転記ミスではありません。

3DNow! MMX FPU
Duron 700@888, 256MB 9.61s1.2% 7.83s1.0% 10.18s1.2%
85X 104X 80X
K6-III/450@500, 128MB 20.19s2.5% 26.12s3.2% 39.17s4.8%
41X 31X 21X
PIII-500@515, 128MB NA 17.73s2.2% 21.68s2.7%
46X 38X

変更履歴

2002.9.7x86cpucapsの仕様変更に合わせて修正。その他少々
2002.8.24CPU判別ルーチンを書換え。拙作のx86cpucapsがインストールされていれば利用するよう変更
2002.3.9xmms-1.2.7向けにパッチを更新
2002.2.9xmms-1.2.6向けにパッチを更新
xmms側の仕様変更に合わせるのも面倒だし、従来のMMXパッチのaboutbox関係は削除しました。
2001.12.24decode_i386.cを筆頭に大幅に書き換え(エンバグしてないといいなぁ)。 これで第2版並みの速度を維持しつつモノラルフォーマットにも対応できた...と思いたい(^^;
設定ダイアログでチャンネルをいじれるように変更(3DNow!)。MMXデコーダ選択時、Resolution、ダウンサンプルの設定はいじれないよう変更。
2001.12.8MMXデコーダでモノラルフォーマットのMP3を再生すると音がめちゃくちゃになる不具合を修正(Waschkさんまたまたありがとうございます)
でも第2版より遅くなってしまったらしい(Hillyerdさん on MMX Pentium 200)
2001.11.17初期化時にmpg123_make_decode_tablesが実行されない場合があるバグを修正 (Waschkさん、 Jordanさんありがとうございます)
SSEの有無判定を無効化
2001.6.30xmms-1.2.5向けにパッチを更新
2001.5.19xmms-1.2.5-pre1向けにパッチを更新
aboutダイアログを一部変更
2001.4.14check_cpu.cをアセンブラに変換することでコンパイル問題を回避
3DNow!/FPUでまともに再生できないバグを修正(^^;
設定ダイアログのバグ修正
速度向上の為にコードを多少クリーンアップ
2001.4.7xmms-1.2.4用MMXパッチの1st リリース。mpg123のCVSに入っているhigwayさんのMMXデコーダをxmmsに移植。
オリジナルCPU判別ルーチンに差替え
私のページのURLを修正(^^;

xmms 3DNow!最適化パッチ

私はLinuxでもMP3をBGMとして再生してたりするわけなんですが、MP3プレイヤーとしてはコンソールアプリのmpg123、gtk+ベースのGUIを備えたxmmsあたりを使い分けてます。 ところが、xmmsのMP3読込みプラグインであるlibmpg123は、そもそもmpg123のソースを元に作られたものなんですね。 ただし、mpg123は3DNow!最適化デコーダを持っていますが、残念な事にxmms-0.9.1のlibmpg123には3DNow!ルーチンは組み込まれてません。 mpg123でベンチマークをとった結果3DNow!最適化デコーダの効果は大きいという結果が得られてるので、mpg123を元にxmmsのソースをいじって何とかしたいものです。

という経緯で作成したこのパッチは、「mpg123-0.59r + きむらさんのnew 3DNow!パッチの3DNow!最適化デコーダ」をxmmsに移植したものです。 CもIA-32アセンブラもろくに書けない私が場当たり的に移植したものなのでバグがあるかもしれませんがあしからず。

xmms 3DNow!最適化パッチはXMMS-1.2.4から本体にマージされました。 というわけで、私のプライベートな実験も役目を終えたようです(今後はパッチの更新は行わない予定です)。 ありがとうございました。
XMMS-1.2.4には3DNow!パッチがマージされましたが、私のパッチがコンパイル時のデフォルトを無効にしてあったせいか、XMMSのサイトにあるバイナリは3DNow!サポートが有効になっていません。 有効にしたい方はxmms-1.2.4で3DNow!サポートを有効にする方法をご覧下さい。

このパッチをあてることにより、XMMSのMP3入力プラグイン(libmpg123.so)は以下のような機能を持ちます。

さて、この3DNow!対応パッチの効果ですが、mpg123はプログラム自体にテストモードがあるのでかなり正確にデコーダ性能を測れるのですが、xmmsではそうはいきません。 しかたがないので、xmmsの出力先をハードディスクにして再生(Output PluginにDisk Writerを選択)した結果を掲載します。 サンプル曲はB'zのFIREBALL(4:12, 96kbps/44.1kHz, 2967KB)、表の左側は再生に要した時間(手動計時...)、右側の%は元曲の長さ(4:12)に対する比率です

ベンチマーク (xmms-0.9.5.1)
K6-2/336 + SB Live!FPU30 sec12 %
3DNow!14 sec6 %
K6-III/504 + SB Live!FPU17 sec7 %
3DNow!9 sec4 %

レベルメーター等をGUIで表示する部分、ハードディスクにwavファイルを書込む部分で負荷が掛かってる点は割り引いても、少なからず3DNow!最適化の効果があらわれているといって良いでしょう(実際、従来のFPUデコーダと3DNow!デコーダの差は体感できるほどあります)。


ダウンロード

(最新版のXMMS-1.2.4以降ではこのパッチは不要です)


xmms 3DNow!パッチの使用法

  1. ソース(xmms-1.2.3.tar.gz)をゲット (ex. http://www.xmms.org/ )
  2. ソースを展開する (tar xfz xmms-1.2.3.tar.gz)
  3. このパッチをあてる (cd xmms-1.2.3; bzcat xmms-1.2.3-3dnow-xxxxxxxx.patch.bz2 | patch -p1 )
  4. 後は 3DNow!を有効にするオプションをつけてコンパイル (./configure --enable-3dnow; make)
  5. suでスーパーユーザーになってインストール (make install)

トラブルシューティング

当然のことですが、XMMS本体がmakeできない環境では、そもそもパッチを当ててもmakeできません。 しかし、XMMSはmakeできるのに、3DNow!パッチを当てると ./configureは正常に終わるがmakeで下のようなエラーが出てコンパイルできない場合があるようです。 私は問題なくmakeできるので原因がつかめませんが、多分、GNU automakeやautoconfの仕組みを全然知らないくせに、場当たり的に使ってる私がいけないのでしょう。


# make
cd . && aclocal
aclocal: macro `MACRO-NAME' required but not defined
aclocal: configure.in: 41: macro `AM_PATH_GLIB' not found in library
aclocal: configure.in: 42: macro `AM_PATH_GTK' not found in library
aclocal: configure.in: 151: macro `AM_GNU_GETTEXT' not found in library
make: *** [aclocal.m4] Error 1
#

このようなエラーでmakeできない方は xmms-1.2.2-3dnow-20000729-noconfigure.patch.bz2 こちらののパッチを試してみてください。 パッチを当てるともはや3DNow!サポートを無効にできなくなりますが、無効にしたい人はそもそもこんなパッチをあてないよね(^^;。

このパッチでならイケたとメールをくれたのはドイツ等の海外の方でした。 試しにアクセスログをとってみたら、英語ページの方が6倍ぐらいアクセスが多いっすね。

3DNow!対応MPG123入力プラグイン

XMMSチームのOlleさんから、

「why don't fork the mpg123 input plugin so you don't need to care about the XMMS version? like call it lib3dnowmpg123.so or something and have it's own archive.. should be much better for all users.. my 2 cents anyway :)」

と言われてしまったので、独立したプラグインとして作成してみました。 中身は3DNow!パッチを当てたXMMS本体からlibmpg123のプラグイン部分を切り離しただけで特に手は加えていません。

もう3DNow!パッチはXMMS本体にマージされたし、このプラグインも役目を終えたと思いますので、公開をとりやめました(2000/12/27)。


xmms-1.2.4で3DNow!サポートを有効にする方法

バージョン1.2.4でようやく私のパッチがXMMS本体にマージされました。 これでようやく私の仕事が終わったかとおもいきや、XMMSのサイトにある1.2.4のバイナリでは3DNow!サポートが有効になっていません。 私のパッチがコンパイル時のデフォルトを無効にしてあったせいでしょうか。 とほほ。

というわけで、最新版のXMMSで3DNow!を有効にしたい方は、以下の手順でXMMSをリビルド&インストールして下さい。

  1. XMMSのWebサイトのDownloadページからXMMSのソース(xmms-1.2.4-1.src.rpm)を落とす。
    (以下、作業はスーパーユーザ権限があると想定)
  2. # rpm -ivh xmms-1.2.4-1.src.rpm
    でインストール。
  3. # cd /usr/src/redhat/SPECS
  4. xmms.specをエディットし、116行目の
    ./configure --prefix=%{prefix}; を
    ./configure --prefix=%{prefix} --enable-3dnow; に変更
  5. # rpm -ba xmms.spec
    でXMMSをリビルド
  6. # rpm -Uvh --force /usr/src/redhat/RPMS/i386/xmms*.rpm
    で作り直したXMMSをインストール

「うまくリビルドできないよ〜」という方の為に、私の環境でリビルドしたlibmpg123.soを置いておきます。 ダウンロードしたら、bzip2 -d で解凍して、XMMSのプラグインディレクトリ(ex. /usr/lib/xmms/Input)にあるファイルと入れ替えてください。


スクリーン・ショット

3DNow!に対応しているシステム(ex. K6-2/III)で動作させた場合の画面。 Decoder Selectの囲みが3DNow!パッチで追加した部分です。 自動選択を有効(デフォルト)にすると、3DNow!対応システムでは3DNow!デコーダ、非対応環境(ex. P-IIIなどIntel系チップ)ではFPUデコーダを使用します。 FPUデコーダでは、従来通りResolution, Down sample、Channelsのオプションは全て選択可能ですが、3DNow!デコーダでは16bit, Stereo, 1:1に固定です。 まぁこれらのオプションは音質を犠牲にしてCPU負荷を下げるオプションなので、最近のCPU、ましてや3DNow!対応CPUを使っている人には無縁でしょう。

running on 3DNow! supported system (Automatic CPU Detection)

自動選択を無効にすると、3DNow!対応環境でのFPUデコーダの使用、非3DNow!環境での3DNow!デコーダの選択が可能になります。 無論、当然の事ながら3DNow!命令をサポートしないIntel系CPUで3DNow!デコーダを選択してもIllegal Instructionで落ちるだけです。

disable Automatic Detection

変更履歴

2000.11(3DNow!パッチは本家XMMS-1.2.4にマージされました)
2000.9.9xmms-1.2.3-pre1
2000.7.29("noconfigure"版をxmms-1.2.2用に修正)
2000.6.20xmms-1.2.1
2000.6.17xmms-1.2.0用。日本語カタログにメッセージ追加。細かい修正
2000.3.10xmms-1.0.1用。Kondaraのi18n、jconvパッチとぶつからないよう修正(中身は1/29版とまったく同じ)
2000.1.29xmms-1.0.0用にパッチを修正。configure対応(--enable-3dnow)、細かいバグ修正等
1999.11.20aboutダイアログを新設
デコーダ選択ダイアログの変更
3DNow!デコーダ使用時は16bit, stereo, 1:1モードに固定
USE_3DNOWを指定しない場合にlayer3.cがコンパイルできないバグを修正(意味ないけど)
1999.10.2xmms-0.9.5.1用にパッチを修正
8/23の変更を廃止し、3DNow!対応CPUの判別状況はlibmpg123のオプション設定に表示
1999.9.27xmms-0.9.5用にパッチを修正
1999.9.23きむらさんパッチの更新(19990911版)に合わせて修正(binutils-2.9.5系でmakeできるよう修正?)
1999.9.11NEW_DCT9スイッチを定義(layer3.c)してみた。mpg123の実験ではややパフォーマンスがあがったが
1999.9.4libmpg123のオプション設定に、3DNow!最適化デコーダの選択を追加 (Auto / Force 3DNow! / Force FPU)
1999.8.28きむらさんパッチの更新(19990824版)に合わせて修正(ただしequalizer部分は未実装)
1999.8.233DNow!対応CPUの場合、xmmsのプリファレンスタブで "MPEG Layer 1/2/3 Player (3DNow!)" と表示 (thanks Dr.K!)。
1999.8.22きむらさんパッチのCPU自動判別部分を実装。3DNow!非対応CPUだと浮動小数点ルーチンを使って再生。
1999.8.21xmms-0.9.1用3DNow!パッチの1st リリース。きむらさんのmpg123-0.59r用3DNow!パッチを元に、xmmsのMP3読込みプラグインをネイティブ3DNow!化。
1999.8.xxxmmsのMP3読込みプラグインがmpg123ベースなことに気づき、mpg123-0.59rを元にテスト。
3DNow!ネイティブ対応レベルメーター表示プラグイン(音が出ねぇ)、宇宙からの電波受信プラグイン(怪しげな音が)等ができあがる...。

リンク

English Site Xmms Homepage
gtk+を用いたマルチメディア プレイヤー、xmmsのサイト。MP3、WAV等の各種フォーマット、OSSやALSA、eSoundなど様々な入出力にはプラグインで対応しています。
English Site mpg123 - An MP3 player for Linux and other UNIX systems
コンソールベースのMP3プレイヤー、mpg123のサイト。非常にポピュラーなソフトで、GUIを提供するフロントエンドも数多くあります。xmmsのMP3読込みプラグインはこのmpg123のコードを元に開発されたもののようです。
Japanese Site KIMURA Takuhiro's Web Page
mpg123用の3DNow!最適化パッチの作者、きむらさんのホームページ。私のxmms用3DNow!パッチは、きむらさんのmpg123用パッチをxmmsに移植したものです。きむらさんのパッチはmpg123のCVS版には既にマージされてるようです。

Return to Previous page一つ前のページに戻る / Return to topこのページのTOPに戻る