ALSA環境の構築して Linux上で音楽を鳴らす

Linuxの音声再生環境を整える

ALSA (Advanced Linux Sound Architechture) は Linux用のサウンドAPI群です

1999年頃 前身である OSS(Open Sound System)が普及するまでは
サウンドボード毎にドライバも異なり再生環境を構築するのは特殊な作業でした

アプリケーションが OSSに対応し始めると一気に Linuxのサウンド環境が改善し
今まで「無音状態」だった Linuxシステムにマルチメディアという魅力が付与されたのです

Linux-2.6では ALSAがカーネルに取り込まれ標準機能となると
Windowsと同じように「何も意識しなくても再生環境は整っている」状況までなりました
ALSAが一気に普及できたのは OSSよりも高機能な上
OSS互換APIを持っていたため アプリケーションの移行がスムーズに進んだためです

ここでは 下記の検証環境で ALSAの環境構築までをレポートします

検証環境
CPU AMD Turion-MT37 2GHz
メモリ DDR-400 1.5GB
サウンド SoundBlaster Live! Value
OS Linux-2.6.39
GCC gcc-4.6.2
alsa-lib alsa-lib-1.0.25
alsa-utils alsa-utils-1.0.25
awesfx awesfx-0.5.1d

ALSAパッケージ構成とインストール

ALSA関連のパッケージは複数に別れています
ALSA公式ページ で配布されている各パッケージの役割を整理すると

パッケージ

alsa-firmware

特定のサウンドボード向けファームウェア
alsa-driver

ドライバ本体 Linux-2.6以降は不要
alsa-oss

liboss ALSA自体が既にOSSエミュレーションするので通常不要
alsa-plugins

追加プラグイン 通常不要
alsa-lib

基本ライブラリ libasound 必要
alsa-utils

alsamixer や aplay などの基本アプリ

Linux-2.6以上であれば alsa-lib と alsa-utils のみで十分です

alsa-lib は下記のオプションでインストールしました

$ ./configure --prefix=/usr/local
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /bin/install -c

〜

config.status: creating include/config.h
config.status: executing depfiles commands
Creating asoundlib.h...
$ make
〜
$ su
〜
# make install
〜
#
 

aserverコマンドや libasoundライブラリがインストールされます

alsa-utils は下記オプションでインストールしました

$ ./configure --prefix=/usr/local --disable-xmlto --with-udev-rules-dir=/etc/udev/rules.d --with-asound-state-dir=/var/state
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p

〜

config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing depfiles commands
$ make
〜
$ su
〜
# make install
〜
#
 

こちらは基本ツールがメインで bin/ 以下に下記のツールがインストールされます

aconnect  alsamixer  amidi   aplay      arecord      aseqdump  iecset
alsaloop  alsaucm    amixer  aplaymidi  arecordmidi  aseqnet   speaker-test
 

音楽再生 MIDI再生 録音 設定ツール が一通り揃っています
speaker-test で音声が鳴るのを確認したら ALSA関連のインストールは完了です
後は mpg123など libasound対応のアプリを好きなだけインストールしましょう

$ speaker-test

speaker-test 1.0.25

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 128 to 32768
Period size range from 32 to 32768
Using max buffer size 32768
Periods = 4
was set period_size = 8192
was set buffer_size = 32768
 0 - Front Left
^C
$
 

もし SoundBlasterシリーズの音源カードを利用されているなら
MIDI再生の環境も整えてしまいましょう

ほとんどの SoundBlasterシリーズのカードは「サウンドフォント」をサポートしていて
ハードウェアでMIDIを鳴らすことができます
最近はゲーム等でも MIDIを鳴らす機会が減ってしまいましたが
SoundBlasterシリーズの魅力の一つとして このサウンドフォントサポートが挙げられます

ここでは サウンドフォントをシステムに読み込むための asfxloadをインストールして
実際にサンプルMIDIを演奏するところまでを紹介します
asfxloadは awesfxパッケージに含まれています
ソースコードを展開して configure 〜 make 〜 make install します

$ ./configure --prefix=/usr/local --with-sfpath=/usr/local/share/sounds/sf2
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p

〜

config.status: creating etc/Makefile
config.status: creating include/config.h
config.status: executing depfiles commands
$ make
Making all in awelib

〜

gcc -g -O2 -o sfxtest sfxtest.o seq.o  awelib/libawe.a /usr/local/lib/libasound.so -lrt -lm -ldl -lpthread   -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib
make[1]: Leaving directory `/home/deer/admin/Alsa/awesfx-0.5.1d'
$ su
# make install
〜
#
 

configureではサウンドフォント配置先を /usr/local/share/sounds/sf2/ としました
インストールされるコマンドは 下記のとおりです

asfxload  aweset  gusload  setfx  sf2text  sfxload  sfxtest  text2sf
 

サウンドフォントは SoundBlasterのドライバCDなどに含まれている
8mbgmsfx.sf2 を使いました ファイル名の通りGM準拠で8MBの容量があります
サウンドフォントディレクトリに 8mbgmsfx.sf2 をコピーして asfxloadでシステムにロードします

# ls /usr/local/share/sounds/sf2/
8mbgmsfx.sf2  default-2m.bnk    test.bnk       xgmap.bnk
README-bank   emu8m.bnk         xgdefault.bnk  xgsfx.bnk
ch12msup.bnk  setfx-sample.cfg  xgdrum.bnk
# cat /proc/asound/Live/wavetableD1
Device: Emu10k1
Ports: 4
Addresses: 17:0 17:1 17:2 17:3
Use Counter: 0
Max Voices: 64
Allocated Voices: 0
Memory Size: 134217728
Memory Available: 134213632
Allocated Blocks: 1
SoundFonts: 0
Instruments: 0
Samples: 0
Locked Instruments: 0
Locked Samples: 0
# asfxload /usr/local/share/sounds/sf2/8mbgmsfx.sf2
# cat /proc/asound/Live/wavetableD1
Device: Emu10k1
Ports: 4
Addresses: 17:0 17:1 17:2 17:3
Use Counter: 0
Max Voices: 64
Allocated Voices: 0
Memory Size: 134217728
Memory Available: 126786844
Allocated Blocks: 527
SoundFonts: 1
Instruments: 1849
Samples: 526
Locked Instruments: 1849
Locked Samples: 526
#
 

SoundFontsの項がカウントアップされているのがわかります
(サウンドフォントはメモリの許す限り複数ロードできますが 検証環境では試してません)
また MIDI用のポートが 17:0 17:1 17:2 17:3 と 4つあることもわかります
ではサンプルとしてどこからか拾ってきた ワルキューレの伝説 を鳴らしましょう

$ aplaymidi -p 17:0 LEGENDofVALKYRIE.mid
$
 

サウンドが鳴れば 無事にMIDI環境が動作しています
asfload のロードはシステム起動時に実行する必要があるため 起動スクリプト等に組込んで完成です

8bit 16bit 時代では高価な MIDI専用機を購入しなければ手に入らなかった
MIDI再生環境が 今やLinux上で再現できてしまいます 感慨深いものです
MIDI Roland SD-20
一方 ハードウェア音源の例では 上記 Roland SD-20 のようなものが挙げられます
最近の MIDI再生機器も小型化され USB接続可能となるなどの進化を遂げており
(通常 MIDI機器は専用のMIDIインターフェースで音源ボードと接続する)
実際筆者はこの SD-20を所持していて クリアな発声などそれなりの魅力もありますが
やはり ハードウェア音源はお金持ち向けという印象がぬぐえません

ちなみに Windows+DirectXは ソフトウェア音源上で MIDIを演奏する動作になってます
従って安物のオンボードサウンドチップでも 何も考えずにMIDIが鳴ります
(MIDI再生に必要なリソースは CPUが負担しているため
SoundBlasterご利用なら MIDI出力をサウンドフォント用ポートに切り替えたほうがよいでしょう)


トラブル事例

筆者の検証環境のみの特殊事例かもしれませんが 当初下記エラーが出て困っていました

$ aplay -L
Segmentation fault
$
 

で全く音声が鳴らないという事象です
原因を調査した結果 「-lライブラリ にて実行時リンクするライブラリに対して 動的リンクも行い長いシンボル名を dlopen() dlsym() dlclose() 繰り返すと不正終了する」
といった 日本語で表現するのも難しいほど 理解不能な現象でした

下記検証プログラム t_main.c で Segmentation fault が再現されました

#include 
#include 

int main ()
{
  int i;
  void *handle = NULL;
  void *target = NULL;

  for ( i = 0; i != 10; i++ ) {
    handle = dlopen ( "libz.so", RTLD_NOW );
    if ( handle )
      target = dlsym ( handle, "long___________long" );
    else
      printf ( "failed dlopen()\n" );
    dlclose ( handle );
    printf ( "count=%d\n", i );
  }
  return ( 0 );
}
 

/usr/local/lib/libz.so を実行時リンクする下記のバイナリを作って実行すると

$ gcc -lz -ldl -o t_main t_main.c
$ ./t_main
count=0
count=1
Segmentation fault
$
 

カーネルの問題なのか glibcの問題なのか判りません 検証環境のみの現象かもしれません
alisa-lib が丁度この条件に引っかかったようでしたので
src/dlmisc.c の snd_dlopen() 関数部分を修正して対策しました

 51 void *snd_dlopen(const char *name, int mode)
 52 {
 53         return dlopen(name, mode);
 54 #ifndef PIC
 55         if (name == NULL)
 56                 return &snd_dlsym_start;
 57 #else
 58 #ifdef HAVE_LIBDL
 59         if (name == NULL) {
 60                 static const char * self = NULL;
 61                 if (self == NULL) {
 62                         Dl_info dlinfo;
 63                         if (dladdr(snd_dlopen, &dlinfo) > 0)
 64                                 self = dlinfo.dli_fname;
 65                 }
 66                 name = self;
 67         }
 68 #endif
 69 #endif
 70 #ifdef HAVE_LIBDL
 71         return dlopen(name, mode);
 72 #else
 73         return NULL;
 74 #endif
 75 }
 

53行目にあるように いきなり return dlopen(name, mode); で返るように修正しました
name= にあたる部分の /usr/local/lib/libasound.so.2 が長い名前だったことが
今回の不具合に該当してしまったようです

$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=Live
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    Default Audio Device
sysdefault:CARD=Live
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    Default Audio Device
front:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    Front speakers
rear:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    Rear speakers
center_lfe:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    Center and Subwoofer speakers
surround40:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Live,DEV=0
    SB Live! Value [CT4670], ADC Capture/Standard PCM Playback
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
iec958:CARD=Live,DEV=0
    SB Live! Value [CT4670], Multichannel Capture/PT Playback
    IEC958 (S/PDIF) Digital Audio Output
$
 

aplay -L も正しく結果を返すようになり 音楽も鳴りました

 

フレッツ光ネクスト + OCN 導入

NTTの フレッツ光ネクスト でトリプルプレイを導入した

2010-11-27 に申し込んで 2010-12-14 に開通したので
大体 3週間くらいかかったことになり このあたりは auひかりと同じでした

もともと auひかりのエリア範囲だったので ギガ得プランの継続と工事を申し込んでいたのですが
2週間ほどまたされた挙句 「光ファイバが通らない区間があるので開通できない」と断られたのです
同じ関東圏のサービスエリアであっても条件によって光ファイバが開通できないこともあり
NTTフレッツの方が若干サービスエリアが広いようです

フレッツ光での宅内構成は下記の通りです
フレッツ光ネクスト 構成
ほぼ auひかりと同じですが 光集線ボックスとホームゲートウェイの間にあった ONUがなくなって
ホームゲートウェイにONU機能が含まれています 従ってホームゲートウェイまでが光ファイバです

ひかりTV用の STBです
フレッツ光ネクスト STB 縦置き
手のひらよりひとまわり大きめのサイズです
フレッツ光ネクスト STB 裏面
左から電源入力 UTP入力 D端子出力 RCA出力 HDMI出力 光デジタル音声出力
HD画質が楽しむために HDMIを使える環境が欲しいところです
フレッツ光ネクスト STB リモコン
リモコンはこんな感じになっています

次にメインとなる ホームゲートウェイですが PR-S300SE というフレッツ光ネクスト専用ルータです
フレッツ光ネクスト HGW 表
STBと同じくらいの大きさです
IPv6対応 ONU内蔵 ファイアウォール機能,NAT機能,DHCP機能 を備える高機能ルータで
Webによる設定も可能です
さらに面白い機能としては VoIP内線子機を持てる点ですがこれは後述します
フレッツ光ネクスト HGW 裏
上から UTPポート(SW-HUB) 電話コード(契約により 2回線持てる?) 電源と 光ファイバです
フレッツ光ネクスト HGW 内部配線
使用済のポートの中をのぞいてみると UTPケーブルが配線されています
実はこのルータ 中身は ルータ装置とONU装置をくっつけた構成のようです
フレッツ光ネクスト HGW
製造シールも 2枚貼られているし ニコイチですかねやっぱり
フレッツ光ネクスト 光終端工事
工事は エアコンのダクトを流用して外の光ファイバを引き込む方式をとってもらいました
他の引き込み方法としては 電話回線の引き込み口を流用する方法も多いそうです
フレッツ光ネクスト 光集線装置
光終端部分の拡大図
外向けの光ファイバと内向けの光ファイバを接続している部分で 内外の責任分界点です
フレッツ光ネクスト 宅内ファイバ
内向け光ファイバの配線状況です
線のフレキシブル具合に注目です 最近の宅内ファイバはこんなに曲げても使えるのですね
フレッツ光ネクスト 利用状況
ルータ周りの配線後の状況です
左下にある小さいのは 100Mbps SW-HUBです ゲーム機等に分配しています

ルータの Gbpsポートは合計4ポートあります
1ポートをSTBとの接続に 1ポートをSW-HUBと接続したため 残り2ポートはパソコンに接続しました

ルータの設定

ルータへの各種設定は Web画面を通じて行います
パソコンを繋いだら ルータから IPアドレスが割り当てられているはずです
ブラウザを開いて http://192.168.1.1/ を開いてみます
アカウントパスワードが求められますが認証をパスすると下記画面となります
フレッツ光ネクストルータ 接続先
Webを使った GUIな操作で各種設定ができます
接続先設定の部分は PPPoEによる NTTとの接続設定となります
開通業者が初期設定してくれるので特にいじる必要はありません
フレッツ光ネクストルータ 電話設定
電話設定の項目です
画面では IP phone とありますが 実は 手持ちのVoIP端末を内線子機として利用できるのです
使いかたによっては 位置固定の原則を打ち破れるような使いかたも可能
ここ が参考になります
フレッツ光ネクストルータ 無線設定
無線カードがあれば 設定できます
フレッツ光ネクストルータ 詳細 DHCP
DHCPに関する設定です
特定のMACアドレスに 特定のIPアドレスを割り当てる設定ができないのが使いづらい部分です
フレッツ光ネクストルータ 詳細 セキュリティ
パケットフィルタに関する設定です
外部からの侵入を防ぐための基本的な設定がデフォルトで入っています
フレッツ光ネクストルータ 詳細 IPマスカレード
IPアドレス ポート番号 変換によるポート開放もできます
フレッツ光ネクストルータ 詳細 静的NAT
IPアドレス変換による サービス公開用の設定ができます
フレッツ光ネクストルータ 詳細 高度な設定
その他設定項目です
フレッツ光ネクストルータ メンテナンス
メンテナンスでは 機器の再起動や pingによる疎通チェックができます
UNIX系のOSが組み込まれているのでしょうか
フレッツ光ネクストルータ 情報
情報欄では 機器の動作ログが確認できます

auひかりのルータと比較すると 使い勝手はほぼ一緒ですが
USBポートがない分 VoIP機能が使えたりと 独自機能で個性が出ていて面白いと思います

ひかりTV

次は STBメインの話になります
リモコンでコントロールします
ひかりTV 初回起動
初回起動の画面です 初期設定が必要となります
ひかりTV 初回登録
お客様ID を登録します
ひかりTV お知らせ画面
ネットワーク上で認証後 初回設定は終了です
地デジのチャンネル設定はすぐ後で行います
ひかりTV メインメニュー
メインメニューです
HD画質対応のため フォントは見やすいです
配信終了間近 と書いてあるのは オンデマンド配信ビデオのことです
auひかりでもそうでしたが コンテンツをどんどん配信終了にされるとライブラリが充実しないのでは
ないかと思います ( コンテンツを持ちつづけることにライセンス料が発生するのでしょうか? )
ひかりTV プレミアム
プレミアム ではオプション有料チャンネル オンデマンドビデオ カラオケ などが選択できます
ひかりTV 番組表
番組表は HDの高解像度を利用した見やすい表示となっています
ひかりTV 地デジ設定前
地デジのチャンネル設定を行わないと 上記メッセージが出ます
早速チャンネル設定を済ませます
ひかりTV 地デジ設定前設定状況
設定メニューから
ひかりTV 地デジチャンネルスキャン
チャンネルスキャンすれば 地デジの番組一覧が自動認識されます
STBへは IP配信のはずなのにチャンネルスキャンの作業は必要なのでしょうか??
ひかりTV システム情報
システム情報表示です ほとんど伏字ですが
IPv6対応しているのは 大手キャリアならではといったところでしょうか
ひかりTV USBHDD情報
USB-HDDがあれば 録画も可能です
ひかりTVでは 1300円/月 で 500GBHDD内蔵STBのレンタルも可能ですが
自前でHDDを用意すれば 特にレンタルするまでもないかなと思います
(10ヵ月も待たずに元が取れる計算です)
ひかりTV リモート予約
なんと 外出先から iPhone Android端末を使って番組予約も可能
詳しくは ここを参照ください
ひかりTV リモート予約パスコード
リモート予約できる 端末を追加するためにはパスワードによる登録作業が必要です
ひかりTV お知らせ情報
お知らせから各種情報が入手できます
ひかりTV NHKオンデマンド
NHKオンデマンドも利用可能
昔見たアニメでもう1回見たいのがあったのですが ライブラリになかった
いまいち使い勝手がよろしくありません
ひかりTV 試聴可能ビデオ
オンデマンド購入したビデオは 一定期間ここから選択して見れる(はず)
ひかりTV ショッピング
オンラインショッピングもできます
品揃えとしては ひかりTV向け機器や ギフトセットなどのみでした
インターネット普通にできるのだから Amazon使ったほうがはるかに便利

将来的に期待したいのは 番組で放映された各種アイテムや関連商品が
リアルタイムで商品一覧に表示されて ボタン1つで買い物カゴに入るところ
ここまで出来たら神です Amazon越えられます
Google TV がそんなの目指してるのかも
ひかりTV カラオケ機能
カラオケも可能です 18000曲以上毎月更新されています
1日歌いたい放題で 500円プランあるので 自宅カラオケ大会やる分には安いでしょう
でもアパートでは無理 使ってません
ひかりTV オンデマンドビデオ
オンデマンドビデオ試聴も リモコンで選択できます
図のとおり 100円ビデオとかキャンペーンもやってます
配信終了の概念がなければ もっといいのですが

その他

その他付加サービスとしては 「フレッツウィルスクリアv6」というのがあります
ウィルスバスター相当の ウィルス対策ソフトが 3ライセンス 400円/月 で提供されます
フレッツウィルスクリアv6 申込み
ネットを経由して インストーラをダウンロードする形式です

月額420円(税込)だったら 年間5000円の計算なので市販のウィルスソフトとほぼ同じの価格です
しかも 3ライセンス分使えることを考えると 値段的には市販ウィルスソフトと比較すると安いです

当初は すぐに解約してやろうかと思ってましたが ずるずる利用中…
ただ本当に「ウィルスバスター」相当なら ウィルスバスターは他の市販ウィルスソフトと比較して
ウィルスの検出能力に弱いとのことなので ここは注意が必要です

最後に

ネット 電話 TV と光ファイバでまかなえるようになって かなり便利になったと思います
今は解約したけど 2008年に導入した auひかりの記事はこちら

Xine メディアプレーヤー

Xine インストールログ

Linuxでも 動画や DVDを見る環境がだいぶ充実しました
Xine(クシーン? ザイン?)を紹介します
これがあれば 動画再生は満ち足りるというほど充実してます
検証環境
CPU AMD Turion-MT37 2GHz
メモリ 1GB
グラフィック nVidia GeForce6600
DVD BenQ DVD DC DW1670
OS Linux 2.6.30.5
ウィンドウシステム Xorg-1.5.1 + fluxbox-1.1.1
OpenGL Mesa-7.5 + NVIDIA-Linux-x86-185.18.14
GCC gcc-4.1.2
Cライブラリ glibc-2.5
Firefox 3.5
Xineの特徴としては

  • DVD VCD AVIファイル Mpegファイル DivX Win32codec など幅広いフォーマットに対応
  • 入出力(ファイルやビデオ)をプラグイン化することで拡張性が高い
  • xine-lib(各種 コーデック プラグイン) と UIが分離している
  • さまざまな UIがある

従って 流れとしては

  1. コーデック 必要なライブラリ を別途入手して インストール
  2. xine-libをインストール
  3. UIをインストール

totemスクリーンショット
いろいろなインターフェースがあります 上の図は Ubuntuに採用されている totemです

コーデックのインストール

実は Xineは Windowsのコーデックを無理矢理 Linuxで使うというようなことをやってます
コーデックのパックが配布されているところがあるので 各種 .dll を拝借します

リンク元が分からないため 私が拾ってきたコーデックパックを ここに載せます
essential-20071007.tar.bz2 (MPlayer のサイトで配布されていたものだと思います)

$ su
# cd /usr/local/lib
# mkdir win32
# cd win32
# tar -xjf ~admin/essential-20071007.tar.bz2 --strip-path=1
# ls
AvidQTAVUICodec.qtx          cook.so.6.0   l3codeca.acm  qtmlClient.dll  vmnc.dll
BeHereiVideo.qtx             ctadp32.acm   l3codecx.ax   rt32dcmp.dll    voxmsdec.ax
CLRVIDDC.DLL                 ddnt.so.6.0   lhacm.acm     scg726.acm      vp31vfw.dll
CtWbJpg.DLL                  divx.dll      lsvxdec.dll   sipr.so.6.0     vp4vfw.dll
DECVW_32.DLL                 divx_c32.ax   m3jp2k32.dll  sp5x_32.dll     vp5vfw.dll
LCMW2.dll                    divxa32.acm   m3jpeg32.dll  tm20dec.ax      vp6vfw.dll
LCODCCMW2E.dll               divxc32.dll   m3jpegdec.ax  tokf.so.6.0     vp7vfw.dll
LCodcCMP.dll                 divxdec.ax    mcdvd_32.dll  tokr.so.6.0     vssh264.dll
QuickTime.qts                dnet.so.6.0   mcmjpg32.dll  tsccvid.dll     vssh264core.dll
QuickTimeEssentials.qtx      drv2.so.6.0   mi-sc4.acm    tsd32.dll       vssh264dec.dll
QuickTimeInternetExtras.qtx  drv3.so.6.0   mpg4c32.dll   tssoft32.acm    vsshdsd.dll
VDODEC32.dll                 drv4.so.6.0   mpg4ds32.ax   tvqdec.dll      vsslight.dll
ViVD2.dll                    drvc.so       msadp32.acm   ubv263d+.ax     vsswlt.dll
acelpdec.ax                  dspr.so.6.0   msg711.acm    ubvmp4d.dll     wma9dmod.dll
alf2cd.acm                   huffyuv.dll   msgsm32.acm   ultimo.dll      wmadmod.dll
aslcodec_dshow.dll           i263_32.drv   msh261.drv    vdowave.drv     wmsdmod.dll
aslcodec_vfw.dll             iac25_32.ax   msms001.vwp   vgpix32d.dll    wmspdmod.dll
asusasv2.dll                 iccvid.dll    msnaudio.acm  vid_3ivX.xa     wmv8ds32.ax
asusasvd.dll                 icmw_32.dll   msrle32.dll   vid_cvid.xa     wmv9dmod.dll
ativcr2.dll                  imaadp32.acm  msscds32.ax   vid_cyuv.xa     wmvadvd.dll
atrac3.acm                   imc32.acm     msvidc32.dll  vid_h261.xa     wmvdmod.dll
atrc.so.6.0                  ir32_32.dll   mvoiced.vwp   vid_h263.xa     wmvds32.ax
avimszh.dll                  ir41_32.dll   nsrt2432.acm  vid_iv32.xa     wnvplay1.dll
avizlib.dll                  ir50_32.dll   pclepim1.dll  vid_iv41.xa     wnvwinx.dll
clrviddd.dll                 ivvideo.dll   qdv.dll       vid_iv50.xa     wvc1dmod.dll
cook.so                      jp2avi.dll    qpeg32.dll    vivog723.acm    xanlib.dll
#

ライブラリのインストール

DVDを見るには libdvdcss が必要です
解凍後
./configure –prefix=/usr/local
make
su
make install
でインストールされます
これは DVDの画像に施されている 暗号化を解除するためのライブラリです

他にも libogg や libvorbis などの必要なライブラリを入れます
(詳細は 忘れてしまいましたが 後述の Xineのビルド時にチェックできます)

xine-libのインストール

いよいよ Xineの核となる xine-lib です
$ tar -xjf xine-lib-1.1.16.2.tar.bz2
$ cd xine-lib-1.1.16.2
$ $ ./configure --enable-directfb --enable-static --with-w32-path=/usr/loc
al/lib/win32 --prefix=/usr/local
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking build system type... i686-pc-linux-gnu
…
…
xine-lib summary:
----------------
 * input plugins:
   - file          - net
   - stdin_fifo    - rtp
   - http          - mms
   - pnm           - rtsp
   - dvb
   - dvd (internal libs)
   - vcd (internal libs)
   - vcdo
   - cdda
   - gnome-vfs
   - v4l

 * demultiplexer plugins:
   - avi           - mpeg
   - mpeg_block    - mpeg_audio
   - mpeg_elem     - mpeg_pes
   - mpeg_ts       - qt/mpeg-4
   - film          - roq
   - fli           - smjpeg
   - idcin         - wav
   - wc3 mve       - voc
   - vqa           - aiff
   - cdda          - snd/au
   - yuv4mpeg2     - real/realaudio
   - ea wve        - raw dv
   - interplay mve - psx str
   - ws aud        - pva
   - vox
   - nsv           - 4xm
   - FLAC          - aac
   - iff           - matroska
   - vmd           - flv
   - nsf
   - ogg
   - ac3 (internal library)

 * video decoder plugins:
   - MPEG 1,2         - Amiga Bitplane
   - Raw RGB          - Raw YUV
   - ffmpeg (internal library):
     - MPEG-4 (ISO, Microsoft, DivX*, XviD)
     - Creative YUV    - Motion JPEG
     - Cinepak         - MS Video-1
     - FLI/FLC         - MS RLE
     - Id RoQ          - Id Cin
     - Apple Graphics  - Apple Video
     - Apple Animation - Interplay Video
     - Westwood VQA    - Origin Xan
     - H.263           - Intel Indeo 3
     - SVQ1            - SVQ3
     - Real Video 1.0  - Real Video 2.0
     - 4X Video        - Sierra Video
     - Asus v1/v2      - HuffYUV
     - On2 VP3         - DV
     - 8BPS            - Duck TrueMotion v1
     - ATI VCR1        - Flash Video
     - ZLIB            - MSZH
   - dxr3_video
   - w32dll
   - gdk-pixbuf

 * audio decoder plugins:
   - GSM 06.10       - linear PCM
   - ffmpeg (internal library):
     - Windows Media Audio v1/v2
     - DV            - logarithmic PCM
     - 14k4          - 28k8
     - MS ADPCM      - IMA ADPCM
     - XA ADPCM      - Game DPCM/ADPCM
     - Mace 3:13     - Mace 6:1
     - FLAC
   - Nosefart (NSF)
   - vorbis
   - w32dll
   - MAD (MPG 1/2/3) (internal library)
   - DTS (internal library)
   - A52/ra-dnet (internal library)
   - MusePack (internal library)

 * subtitle decoder plugins:
   - spu             - spucc
   - spucmml         - sputext
   - spudvb
   - dxr3_spu

 * post effect plugins:
  * planar video effects:
   - invert          - expand
   - eq              - eq2
   - boxblur         - denoise3d
   - unsharp         - tvtime
  * SFX:
   - goom            - oscope
   - fftscope        - mosaico

 * video driver plugins:
   - XShm (X11 shared memory)
   - SyncFB (for Matrox G200/G400 cards)
   - Xv (XVideo *shared*)
   - OpenGL
   - xcb-shm (X shared memory using XCB)
   - xcb-xv (XVideo using XCB)
   - aa (Ascii ART)
   - fb (Linux framebuffer device)
   - sdl (Simple DirectMedia Layer)
   - dxr3 (Hollywood+ and Creative dxr3, mpeg video only)
   - vidix (X11 and framebuffer support)

 * audio driver plugins:
   - oss (Open Sound System)
   - alsa
---
最後にでる xine-lib summary というのが重要です
xine-libの ビルドで使えるようになると思われる プラグインが表示されます
上記のは 実際の今回検証環境のもので DVD avi mpg DivX あらかたのものが再生できます

上記を参考にいただいて 足りない環境があれば 個別にそろえてください

$ make
…
…
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../../../../include -I../../../../src/input/vcd/libcdio -I../../../../include -I../../../../lib -I../../../../lib -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DXINE_COMPILE -mtune=pentiumpro -O3 -pipe -fomit-frame-pointer -falign-functions=4 -falign-loops=4 -falign-jumps=4 -fexpensive-optimizations -fschedule-insns2 -ffast-math -finline-functions -Wpointer-arith -g -O2 -Wall -Wchar-subscripts -Wnested-externs -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wmissing-format-attribute -Wno-pointer-sign -Wformat=2 -Wno-format-zero-length -Wstrict-aliasing=2 -DNDEBUG -MT _cdio_linux.lo -MD -MP -MF .deps/_cdio_linux.Tpo -c _cdio_linux.c  -fPIC -DPIC -o .libs/_cdio_linux.o
In file included from _cdio_linux.c:66:
/usr/src/linux/include/scsi/scsi.h:145: error: expected specifier-qualifier-list before 'u8'
/usr/src/linux/include/scsi/scsi.h: In function 'scsi_varlen_cdb_length':
/usr/src/linux/include/scsi/scsi.h:156: error: 'struct scsi_varlen_cdb_hdr' has no member named 'additional_cdb_length'
_cdio_linux.c: In function '_read_mode2_sector_linux':
_cdio_linux.c:724: 警告: dereferencing type-punned pointer might break strict-aliasing rules
make[5]: *** [_cdio_linux.lo] エラー 1
make[5]: Leaving directory `/home/admin/xine-lib-1.1.16.2/src/input/vcd/libcdio'
make[4]: *** [all-recursive] エラー 1
make[4]: Leaving directory `/home/admin/xine-lib-1.1.16.2/src/input/vcd/libcdio'
make[3]: *** [all-recursive] エラー 1
make[3]: Leaving directory `/home/admin/xine-lib-1.1.16.2/src/input/vcd'
make[2]: *** [all-recursive] エラー 1
make[2]: Leaving directory `/home/admin/xine-lib-1.1.16.2/src/input'
make[1]: *** [all-recursive] エラー 1
make[1]: Leaving directory `/home/admin/xine-lib-1.1.16.2/src'
make: *** [all-recursive] エラー 1
$
私の環境では 「u8 が未定義」 だと怒られました
linux-kernel によると typedef unsigned char u8; は asm-generic/int-ll64.h で定義されていますが
gccに -D__KERNEL__ が必要になるため u8自体 そもそもカーネルモジュール用の型と思われます

以下のように src/input/vcd/libcdio/_cdio_linux.c へ定義を追加して 回避しました (64行目に typedef 文追加)

  55 
  56 #include 
  57 #include 
  58 #include 
  59 #include 
  60 #include 
  61 #include 
  62 #include 
  63 
  64 typedef unsigned char u8;
  65 #include 
  66 #include 
  67 #include 
  68 #include 
  69 #include 
  70 
$ make
…
…
Making all in win32
make[1]: Entering directory `/home/admin/xine-lib-1.1.16.2/win32'
Making all in include
make[2]: Entering directory `/home/admin/xine-lib-1.1.16.2/win32/include'
make[2]: `all' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/xine-lib-1.1.16.2/win32/include'
make[2]: Entering directory `/home/admin/xine-lib-1.1.16.2/win32'
make[2]: `all-am' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/xine-lib-1.1.16.2/win32'
make[1]: Leaving directory `/home/admin/xine-lib-1.1.16.2/win32'
make[1]: Entering directory `/home/admin/xine-lib-1.1.16.2'
make[1]: `all-am' に対して行うべき事はありません。
make[1]: Leaving directory `/home/admin/xine-lib-1.1.16.2'
$ su
# make install
…
…
find . -name \*.so | \
  xargs strings -a | \
  /bin/grep -E '^([-a-z]+/[-+.a-z0-9]+:[^:]+:[^;]+;[ \t]*)+' | \
  sed -e 's/:[^;]\+;/\n/g' | \
  sort -u | \
  sed -e '1 d' >/usr/local/lib/xine/plugins/1.25/mime.types
make[3]: Leaving directory `/home/admin/xine-lib-1.1.16.2'
test -z "/usr/local/share/doc/xine-lib" || /bin/mkdir -p "/usr/local/share/doc/xine-lib"
 /bin/install -c -m 644 'COPYING' '/usr/local/share/doc/xine-lib/COPYING'
 /bin/install -c -m 644 'NEWS' '/usr/local/share/doc/xine-lib/NEWS'
 /bin/install -c -m 644 'README' '/usr/local/share/doc/xine-lib/README'
 /bin/install -c -m 644 'TODO' '/usr/local/share/doc/xine-lib/TODO'
 /bin/install -c -m 644 'CREDITS' '/usr/local/share/doc/xine-lib/CREDITS'
 /bin/install -c -m 644 'ChangeLog' '/usr/local/share/doc/xine-lib/ChangeLog'
make  install-data-hook
make[3]: Entering directory `/home/admin/xine-lib-1.1.16.2'
make[3]: Leaving directory `/home/admin/xine-lib-1.1.16.2'
make[2]: Leaving directory `/home/admin/xine-lib-1.1.16.2'
make[1]: Leaving directory `/home/admin/xine-lib-1.1.16.2'
#
足りない環境に必要なライブラリを探して インストールする方にむしろ時間がかかると思います

UIのインストール

次に UIですが いくつか選択肢があります

  • xine-ui は標準で用意されてます これでも十分使えます
  • gxine も xine-uiと同じ場所で配布されています
  • totem も Ubuntuなどに採用されている人気のある UIです

xine-ui 不具合版

上の絵は 私の環境の古い xine-ui-0.99.4 ですが
Xorgを入れ替えたタイミングで コントロールパネルがバグって使いものになりません

xine-ui コントロールパネル

本来ならこんな感じのパネルが使えます
ファイルや DVDを開いたり 画像の拡大 アスペクト比変更 ほとんどできます

gxine では Mozilla(Firefox?)用プラグインがある
という話なので 今回こちらの使用感をレポートします
$ tar -xjf gxine-0.5.903.tar.bz2
$ cd gxine-0.5.903
$ ./configure
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
…
config.status: executing po-directories commands
config.status: creating misc/po/POTFILES
config.status: creating misc/po/Makefile
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing default commands
$ make
Makefile:764: 警告: ターゲット `dist' へのコマンドを置き換えます
Makefile:546: 警告: ターゲット `dist' への古いコマンドは無視されます
exec > gxine.desktop; cat gxine.desktop.in; /usr/local/bin/xine-list-1.1; echo
make  all-recursive
make[1]: Entering directory `/home/admin/gxine-0.5.903'
Makefile:764: 警告: ターゲット `dist' へのコマンドを置き換えます
Makefile:546: 警告: ターゲット `dist' への古いコマンドは無視されます
Making all in m4
mv -f .deps/console_output.Tpo .deps/console_output.Po
gcc -DHAVE_CONFIG_H -I. -I../include -I../include -I../include -I/usr/local/include -I../pixmaps    -std=gnu99 -I/usr/local/include   -I/usr/X11R7/include -I/usr/local/include/gtk-2.0 -I/usr/local/lib/gtk-2.0/include -I/usr/local/include/atk-1.0 -I/usr/local/include/cairo -I/usr/local/include/pango-1.0 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include -I/usr/local/include/freetype2 -I/usr/local/include/libpng12 -I/usr/X11R7/include   -pthread -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include   -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/local/include/hal -I/usr/local/include/dbus-1.0 -I/usr/local/lib/dbus-1.0/include    -DXP_UNIX -DJS_THREADSAFE -I/usr/local/include/xulrunner-1.9.1.3/stable   -DLOCALEDIR=\"/usr/local/share/locale\"  -MT desktop_integration.o -MD -MP -MF .deps/desktop_integration.Tpo -c -o desktop_integration.o desktop_integration.c
globals.h:39 から include されたファイル中,
                 desktop_integration.c:27 から:
script_engine.h:34:19: error: jsapi.h: そのようなファイルやディレクトリはありません
In file included from globals.h:39,
                 from desktop_integration.c:27:
script_engine.h:40: 警告: type defaults to 'int' in declaration of 'JSErrorReport'
script_engine.h:40: error: expected ';', ',' or ')' before '*' token
script_engine.h:59: error: expected specifier-qualifier-list before 'JSContext'
script_engine.h:75: error: expected specifier-qualifier-list before 'JSFunction'
script_engine.h:119: error: expected specifier-qualifier-list before 'JSObject'
script_engine.h:146: 警告: type defaults to 'int' in declaration of 'JSErrorReport'
script_engine.h:146: error: expected ';', ',' or ')' before '*' token
script_engine.h:151: error: expected declaration specifiers or '...' before 'se_error_cb_t'
script_engine.h:155: error: expected declaration specifiers or '...' before 'JSInt32'
script_engine.h:156: error: expected declaration specifiers or '...' before 'JSFloat64'
script_engine.h:157: error: expected declaration specifiers or '...' before 'JSBool'
script_engine.h:158: error: expected declaration specifiers or '...' before 'JSInt32'
script_engine.h:159: error: expected declaration specifiers or '...' before 'JSFloat64'
script_engine.h:179: error: expected specifier-qualifier-list before 'JSNative'
script_engine.h:186: error: expected declaration specifiers or '...' before 'JSNative'
script_engine.h:186: error: expected declaration specifiers or '...' before 'uintN'
script_engine.h:186: error: expected declaration specifiers or '...' before 'uintN'
script_engine.h:242: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'se_warn_initialisation'
make[2]: *** [desktop_integration.o] エラー 1
make[2]: Leaving directory `/home/admin/gxine-0.5.903/src'
make[1]: *** [all-recursive] エラー 1
make[1]: Leaving directory `/home/admin/gxine-0.5.903'
make: *** [all] エラー 2
$
という エラーに遭遇しました jsapi.h が見つからないというものです
これは Firefox(というより XULRunner)の問題のようです
jsapi.hは 実際は /usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h にあるのに
XULRunnerのビルドでインストールされた /usr/local/lib/pkgconfig/mozilla-js.pc を見ると
prefix=/usr/local
sdkdir=/usr/local/lib/xulrunner-devel-1.9.1.3
includedir=/usr/local/include/xulrunner-1.9.1.3

Name: JavaScript
Description: The Mozilla JavaScript Library
Version: 1.9.1.3
Requires: mozilla-nspr >= 4.8.0
Libs: -L${sdkdir}/lib -lmozjs
Cflags: -I${includedir}/stable -DXP_UNIX -DJS_THREADSAFE
/usr/local/include/xulrunner-1.9.1.3/stable にしか インクルードパスが張られていません
ここでは gxineソースディレクトリ側を修正して
Makefile
src/Makefile
の JS_LIBS の設定にインクルードパスを直接追加しました
JS_CFLAGS = -DXP_UNIX -DJS_THREADSAFE -I/usr/local/include/xulrunner-1.9.1.3/stable -I /usr/local/include/xulrunner-1.9.1.3/unstable
-I /usr/local/include/xulrunner-1.9.1.3/unstable が追加部分です
(unstable というディレクトリ名が引っかかるところです)
$ make
…
…
make[3]: Leaving directory `/home/deer/admin/Xine/gxine-0.5.903/include'
make[2]: Leaving directory `/home/deer/admin/Xine/gxine-0.5.903/include'
Making all in src
make[2]: Entering directory `/home/deer/admin/Xine/gxine-0.5.903/src'
gcc -DHAVE_CONFIG_H -I. -I../include -I../include -I../include -I/usr/local/include -I../pixmaps    -std=gnu99 -I/usr/local/include   -I/usr/X11R7/include -I/usr/local/include/gtk-2.0 -I/usr/local/lib/gtk-2.0/include -I/usr/local/include/atk-1.0 -I/usr/local/include/cairo -I/usr/local/include/pango-1.0 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include -I/usr/local/include/freetype2 -I/usr/local/include/libpng12 -I/usr/X11R7/include   -pthread -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include   -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/local/include/hal -I/usr/local/include/dbus-1.0 -I/usr/local/lib/dbus-1.0/include    -DXP_UNIX -DJS_THREADSAFE -I/usr/local/include/xulrunner-1.9.1.3/stable  -I/usr/local/include/xulrunner-1.9.1.3/unstable -DLOCALEDIR=\"/usr/local/share/locale\"  -MT desktop_integration.o -MD -MP -MF .deps/desktop_integration.Tpo -c -o desktop_integration.o desktop_integration.c
In file included from script_engine.h:34,
                 from globals.h:39,
                 from desktop_integration.c:27:
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:87: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:87: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:94: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:94: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:101: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:101: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:108: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:108: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:115: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:115: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:122: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:122: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:129: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:129: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:179: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:179: error: expected identifier or '(' before ')' token
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:186: error: expected ')' before '__attribute__'
/usr/local/include/xulrunner-1.9.1.3/unstable/jsapi.h:186: error: expected identifier or '(' before ')' token
make[2]: *** [desktop_integration.o] エラー 1
make[2]: Leaving directory `/home/deer/admin/Xine/gxine-0.5.903/src'
make[1]: *** [all-recursive] エラー 1
make[1]: Leaving directory `/home/deer/admin/Xine/gxine-0.5.903'
make: *** [all] エラー 2
$
なんと jsapi.h 自体がエラーとなりました (さすが unstable ディレクトリ…)
/usr/local/include/xulrunner-1.9.1.3/unstable/jstypes.h で定義されている
JS_ALWAYS_INLINE のエラーのようです
168 #ifndef JS_INLINE
169 # if defined __cplusplus
170 #  define JS_INLINE          inline
171 # elif defined _MSC_VER
172 #  define JS_INLINE          __inline
173 # elif defined __GNUC__
174 #  define JS_INLINE          __inline__ 
175 # else
176 #  define JS_INLINE          inline
177 # endif
178 #endif
179 
180 #ifndef JS_ALWAYS_INLINE
181 # if defined DEBUG
182 #  define JS_ALWAYS_INLINE   JS_INLINE
183 # elif defined _MSC_VER
184 #  define JS_ALWAYS_INLINE   __forceinline
185 # elif defined __GNUC__
186 #  define JS_ALWAYS_INLINE   __attribute__((always_inline)) JS_INLINE
187 # else
188 #  define JS_ALWAYS_INLINE   JS_INLINE
189 # endif
190 #endif
私の gcc 環境では __attribute__((always_inline)) がうまく使えません
(これは Cの関数定義をインライン化するためのコンパイラ指示のようですが)
inline なら認識されますので 以下のように jstypes.h を修正しました
168 #ifndef JS_INLINE
169 # if defined __cplusplus
170 #  define JS_INLINE          inline
171 # elif defined _MSC_VER
172 #  define JS_INLINE          __inline
173 # elif defined __GNUC__
174 //#  define JS_INLINE          __inline__ 
175 #  define JS_INLINE          inline
176 # else
177 #  define JS_INLINE          inline
178 # endif
179 #endif
180 
181 #ifndef JS_ALWAYS_INLINE
182 # if defined DEBUG
183 #  define JS_ALWAYS_INLINE   JS_INLINE
184 # elif defined _MSC_VER
185 #  define JS_ALWAYS_INLINE   __forceinline
186 # elif defined __GNUC__
187 //#  define JS_ALWAYS_INLINE   __attribute__((always_inline)) JS_INLINE
188 #  define JS_ALWAYS_INLINE   JS_INLINE
189 # else
190 #  define JS_ALWAYS_INLINE   JS_INLINE
191 # endif
192 #endif
強引ですがビルドを継続します
$ make
…
…
Making all in po
make[2]: Entering directory `/home/admin/gxine-0.5.903/po'
make[2]: `all' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/gxine-0.5.903/po'
make[2]: Entering directory `/home/admin/gxine-0.5.903'
Makefile:764: 警告: ターゲット `dist' へのコマンドを置き換えます
Makefile:546: 警告: ターゲット `dist' への古いコマンドは無視されます
make[2]: `all-am' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/gxine-0.5.903'
make[1]: Leaving directory `/home/admin/gxine-0.5.903'
$ su
# make install
Makefile:764: 警告: ターゲット `dist' へのコマンドを置き換えます
Makefile:546: 警告: ターゲット `dist' への古いコマンドは無視されます
make  install-recursive
make[1]: Entering directory `/home/admin/gxine-0.5.903'
Makefile:764: 警告: ターゲット `dist' へのコマンドを置き換えます
Makefile:546: 警告: ターゲット `dist' への古いコマンドは無視されます
Making install in m4
…
…
test -z "/usr/local/share/applications" || /bin/mkdir -p "/usr/local/share/applications"
 /bin/install -c -m 644 'gxine.desktop' '/usr/local/share/applications/gxine.desktop'
make[3]: Leaving directory `/home/admin/gxine-0.5.903'
make[2]: Leaving directory `/home/admin/gxine-0.5.903'
make[1]: Leaving directory `/home/admin/gxine-0.5.903'
#
多少の工夫が必要でしたが インストールは可能です

使い勝手の検証

gxine を使ってみて xine-ui と使い勝手を比較してみました

gxine初期画面

初回起動すると ~/.config/gxine/ が作成されコンフィグを初期設定してくれます
検証の環境では CD/DVD を /dev/cdroms/cdrom0 となるように udevをカスタマイズしているため
gxineが見つけてくれず CD と DVD デバイスが認識されませんでした

通常のディストリビューションを使って入れば問題ないでしょう

gxine起動時

gxine起動時の画面です
画像のズームや ウィンドウサイズの変更など 基本的な設定はメニュー化されています

ただし 検証の環境では 再生ウィンドウをドラッグして任意倍ズームするのが
思ったとおりのサイズにズームされず使い勝手がよろしくなかったです (fluxboxのせい?)

gxine aviファイル再生

あらかたの動画形式は視聴できます

インターネット配信(.asx)も
.asxファイルを一旦ローカルディスクにダウンロードして gxineから開く ことで再生できました

ただし Mozillaプラグイン導入の指定をしたのにも関わらず
Firefoxでクリックして再生ウィンドウが開く とう期待通りの設定はされませんでした
また ファイル名 動画タイトル などが文字化けしています
これは 検証のシステムが EUC-JP系だからかもしれません (UTF-8なら問題なし?)

gxine DVD再生

CD DVD デバイスを認識させるために ~/.config/gxine/config を編集して
以下の各行を適切に設定すれば CD DVD の視聴が可能です

media.audio_cd.device:/dev/cdroms/cdrom0
media.dvd.device:/dev/cdroms/cdrom0
media.vcd.device:/dev/cdroms/cdrom0

↑で再生されている 某メイドアニメDVD を見て分かるとおり
DVDのメニューについてもマウスで操作可能で 完璧な仕上りぶり

と思われましたが
コントロールパネルに チャプタージャンプ や タイトルジャンプ などのジャンプメニューありません
(xine-ui にはあります)

gxine xine-ui 比較結果

gxineの優位な点 メニューが日本語 (ただし EUC-JP環境では苦しい表示も)
ファイル選択画面が使い易い (EUC-JPも問題なし)
CD DVD 環境の自動設定 (初回起動時)
早送り機能がある (ただし 動画形式によっては不具合も)
Mozillaプラグイン (ただし 検証の環境では確認できず)
xine-uiの優位な点 再生ウィンドウをマウスドラッグで任意倍拡大ができる (gxineは 使い心地が悪い)
ファイル選択画面は一応日本語可能 (gxineに比べると使い勝手は悪い)
DVD のジャンプメニューがある (ただしチャプター番号指定してジャンプする部分が反応しないことあり)
早送り 巻戻し 機能がある (ただし 動画形式によっては不具合も)


結局 xine-ui使うことにしました
(期待していた Mozillaプラグインが空振りしたのと DVDでタイトル画面が呼べないのが痛い)

xine-ui DVD再生

xine-ui の DVD観賞はこんな感じです
「メニュー切り替え」とか「ルート」を選択すると 一発でタイトルに飛びます
マウスによる メニュー選択もばっちりOK

ただし 番号を押してそのチャプターに飛ぼうとしたとき
うまく 飛んでくれる場合と反応がない場合があり いまいち使い勝手が悪い

あと
xine-uiをビルドするときに注意点があります
ソースコードをそのままビルドすると 日本語が文字化けしてしまいます

xine-uiは フォントのXLFD名をソースコード内にハードコードしているので
-*-*-*-*-*-*-14-*-*-*-*-*-jisx0208.1983-* のように日本語フォントに全置換してあげます
xine-ui-0.99.5用のパッチ を作ってみました参考にしてださい

$ tar -xzf xine-ui-0.99.5.tar.gz
$ cd xine-ui-0.99.5
$ zcat ../xine-ui-0.99.5-japanese.patch.gz | patch -p1
patching file src/xitk/event_sender.c
patching file src/xitk/file_browser.c
patching file src/xitk/help.c
patching file src/xitk/kbindings.c
patching file src/xitk/mediamark.c
patching file src/xitk/post.c
patching file src/xitk/setup.c
patching file src/xitk/skins/xinetic/skinconfig
patching file src/xitk/skins.c
patching file src/xitk/stream_infos.c
patching file src/xitk/tvset.c
patching file src/xitk/viewlog.c
patching file src/xitk/xine-toolkit/font.h
patching file src/xitk/xine-toolkit/test.c
$ ./configure --prefix=/usr/local --disable-xft
…
…
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing default-1 commands
config.status: creating src/xitk/xine-toolkit/po/POTFILES
config.status: creating src/xitk/xine-toolkit/po/Makefile
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing default commands
$ make
…
…
make[3]: Leaving directory `/home/admin/xine-ui-0.99.5/src/fb'
make[3]: Entering directory `/home/admin/xine-ui-0.99.5/src'
make[3]: `all-am' に対して行うべき事はありません。
make[3]: Leaving directory `/home/admin/xine-ui-0.99.5/src'
make[2]: Leaving directory `/home/admin/xine-ui-0.99.5/src'
make[2]: Entering directory `/home/admin/xine-ui-0.99.5'
make[2]: Leaving directory `/home/admin/xine-ui-0.99.5'
make[1]: Leaving directory `/home/admin/xine-ui-0.99.5'
$ su
# make install
…
…
make[2]: `install-exec-am' に対して行うべき事はありません。
make[2]: `install-data-am' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/xine-ui-0.99.5'
make[1]: Leaving directory `/home/admin//xine-ui-0.99.5'
#
検証の環境では –disable-xft もしないと日本語が表示されませんでした

Linuxで WLI2-PCI-G54S WLI-UC-G (無縁LAN)

突然 パソコンと NintendoDS をつなぎたくなった

(注) 結局 DSとの接続は確認できませんでした…
検証環境
CPU AMD Turion(tm) 64 Mobile Technology MT-37
OS Linux kernel 2.6.24
GCC 4.1.2 i686
glibc 2.5
ndiswrapper 1.52
DHCP ISC-DHCP 4.1.0a1
無線LAN 接続機器 PC-MV1-C1W(SHARP製ノート)
WILLCOM03(PHS端末)
NintendoDS(ゲーム) Wii(ゲーム)
(NintedoDSだけが目的ではありませんが…) 導入までの流れは以下のとおりです
  • インターフェースユニットの選定
  • ドライバの導入
  • Linux側の MACフィルタリング DHCPの設定
  • 無線LANの設定
  • 他の無線LAN機器との接続

インターフェースユニットの選定

ます インターフェースカードの選定に苦労しました
PCIでパソコン内部に設置できることと
802.11bよりも速い通信方式をサポートしていること
Linuxでの動作実績があること

デスクトップパソコン (PCI)で利用できる 無線LANカードは数が少ないようです (2008年購入)
今回は WLI2-PCI-G54S を購入しました

WLI2-PCI-G54Sイメージ

2009年初には結局 USB接続の無線機も購入しました
DS接続(802.11b + 2Mbpsレート + WEP128bit方式)をサポートしていること
Linux動作実績があるもの

なんだかんだと 安さで衝動購入してしまった WLI-UC-G も結果報告します

WLI-UC-Gイメージ

WLI2-PCI-G54Sドライバの導入

まず カーネルに必要なオプションを設定します

カーネルコンフィグ

Wireless extensionsは必須です (net_device構造体に 無線LAN系の拡張がなされます)
Improved wireless configuration API はもしかしたら不要かもしれません
(いろいろ試して 少なくとも動いたのがこのオプションです)
また iptables により MACフィルタを行うので Networking Options を次のようにします

カーネルコンフィグ

次に ドライバですが Linuxネイティブのドライバが存在せず
NDISwrapper という Windowsのドライバを利用するドライバラッパをかませます

上記サイトから ndiswrapper ソースコードを取得し展開します
インストールされるファイルは数としてはそんなにありません
$ tar -tzvf ndiswrapper-1.52.tar.gz
$ cd ndiswrapper-1.52
$ make
make -C driver
make[1]: Entering directory `/home/admin/ndiswrapper-1.52/driver'
make -C /usr/src/linux-2.6.24 SUBDIRS=/home/admin/ndiswrapper-1.52/driver
make[2]: Entering directory `/usr/src/linux-2.6.24'
  LD      /home/admin/ndiswrapper-1.52/driver/built-in.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/crt.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/hal.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/iw_ndis.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/loader.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/ndis.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/ntoskernel.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/ntoskernel_io.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/pe_linker.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/pnp.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/proc.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/rtl.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/wrapmem.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/wrapndis.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/wrapper.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/usb.o
  CC [M]  /home/admin/ndiswrapper-1.52/driver/divdi3.o
  LD [M]  /home/admin/ndiswrapper-1.52/driver/ndiswrapper.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/admin/ndiswrapper-1.52/driver/ndiswrapper.mod.o
  LD [M]  /home/admin/ndiswrapper-1.52/driver/ndiswrapper.ko
make[2]: Leaving directory `/usr/src/linux-2.6.24'
make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/driver'
make -C utils
make[1]: Entering directory `/home/admin/ndiswrapper-1.52/utils'
gcc -g -Wall -I../driver -o loadndisdriver loadndisdriver.c
make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/utils'

$ su
# make install
make -C driver install
make[1]: Entering directory `/home/admin/ndiswrapper-1.52/driver'
make -C /usr/src/linux-2.6.24 SUBDIRS=/home/admin/ndiswrapper-1.52/driver
make[2]: Entering directory `/usr/src/linux-2.6.24'
  Building modules, stage 2.
  MODPOST 1 modules
make[2]: Leaving directory `/usr/src/linux-2.6.24'
echo /lib/modules/2.6.24/misc
/lib/modules/2.6.24/misc
mkdir -p /lib/modules/2.6.24/misc
install -m 0644 ndiswrapper.ko /lib/modules/2.6.24/misc
/sbin/depmod -a 2.6.24 -b /
make[1]: /sbin/depmod: コマンドが見つかりませんでした
make[1]: [install] エラー 127 (無視されました)
make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/driver'
make -C utils install
make[1]: Entering directory `/home/admin/ndiswrapper-1.52/utils'
install -D -m 755 loadndisdriver /sbin/loadndisdriver
install -D -m 755 ndiswrapper /usr/sbin/ndiswrapper
install -D -m 755 ndiswrapper-buginfo /usr/sbin/ndiswrapper-buginfo

NOTE: Windows driver configuration file format has changed since 1.5. You must re-install Windows drivers if they were installed before.
make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/utils'
mkdir -p -m 0755 /usr/man/man8
install -m 644 ndiswrapper.8 /usr/man/man8
install -m 644 loadndisdriver.8 /usr/man/man8

#

続いて Linuxの設定 MACフィルタの設定を行います
Linuxの ファイアウォール機能である iptablesを用いて セキュリティを確保します
ファイアウォールポリシーとしては 以下のとおりです
「3台(Mebius WILLCOM03 NintendoDS)の MACアドレス以外から通信を受けない」
# iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:**
# iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:**
# iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:**
3台の MACアドレスの部分は伏字にしてます 実際は MACアドレスを調べて登録します
デフォルトポリシーを iptables -P INPUT DROP としているので
上記ポリシー追加により 指定の MACアドレスからの通信のみ許可されることになります

参考のために 自環境の iptables設定を紹介します
# iptables -L -v
Chain INPUT (policy DROP 5920 packets, 1818K bytes)
 pkts bytes target     prot opt in     out     source               destination         
60335 4298K ACCEPT     all  --  lo     any     anywhere             anywhere            
60846   78M ACCEPT     all  --  eth1   any     anywhere             anywhere            
 9122 1621K ACCEPT     all  --  wlan0  any     anywhere             anywhere            MAC **:**:**:**:**:** 
    0     0 ACCEPT     all  --  wlan0  any     anywhere             anywhere            MAC **:**:**:**:**:** 
   14  2472 ACCEPT     all  --  wlan0  any     anywhere             anywhere            MAC **:**:**:**:**:** 
57978   37M ACCEPT    !icmp --  eth0   any     anywhere             anywhere            ctstate RELATED,ESTABLISHED 
    0     0 ACCEPT     icmp --  eth0   any     anywhere             anywhere            icmp echo-reply 
    0     0 ACCEPT     icmp --  eth0   any     anywhere             anywhere            icmp echo-request 
    3   200 ACCEPT     icmp --  eth0   any     anywhere             anywhere            icmp destination-unreachable 
    1    63 ACCEPT     udp  --  eth0   any     anywhere             anywhere            udp spt:domain 

Chain FORWARD (policy ACCEPT 261K packets, 225M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 197K packets, 18M bytes)
 pkts bytes target     prot opt in     out     source               destination         
#
# iptables -L -v -t nat
Chain PREROUTING (policy ACCEPT 8397 packets, 2224K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 7665 packets, 592K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  173  8316 MASQUERADE  all  --  any    any     192.168.0.0/23      !192.168.0.0/23      

Chain OUTPUT (policy ACCEPT 7660 packets, 592K bytes)
 pkts bytes target     prot opt in     out     source               destination         
#
自マシンが LAN/無縁LAN/インターネット のGWを兼ねていて NIC構成は以下の通りです
(eth0) インターネット向け
(eth1) LAN (192.168.0/24)
(wlan0) 無線LAN (192.168.1/24)

ファイアウォールの設定はなるべく簡素にしています (不要な通信が外に抜けないか警戒する必要があります)
  • INPUTチェインのみ デフォルト DROP とし 必要な通信のみ許可設定を入れる
  • FORWARDING OUTPUT チェインは設定しない デフォルト ACCEPT
  • 外部(192.168.0.0/23以外)への通信は NATするように設定
では 次の設定です DHCP です 無線LAN用に dhcpd.wlan0.conf を用意しました
option domain-name "local";
option domain-name-servers 192.168.1.1;

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;
authoritative;

log-facility daemon;

subnet 192.168.1.0 netmask 255.255.255.0 {
  option routers 192.168.1.1;
  option broadcast-address 192.168.1.255;
  host mebius {
    hardware ethernet **:**:**:**:**:**;
    fixed-address 192.168.1.2;
  }
  host ds {
    hardware ethernet **:**:**:**:**:**;
    fixed-address 192.168.1.3;
  }
  host w03 {
    hardware ethernet **:**:**:**:**:**;
    fixed-address 192.168.1.4;
  }
}
MACアドレスは伏字です
各自 無線LANのネットワーク環境にあわせて設定します
以降に紹介する手順では省略しますが 無線LANのインターフェースである wlan0 が有効化したときに
# dhcpd -q -pf /var/run/dhcpd.wlan0.pid -cf /usr/local/etc/dhcpd.wlan0.conf wlan0
のコマンドをいれて wlan0 用の dhcpd を常駐させるようにしましょう

WLI2-PCI-G54S の Windowsドライバが動作するか検証します
手順としては
1. Windowsドライバをダウンロードして一時的なディレクトリの中に展開
2. 適切な .infファイルを ndiswrapperに読み込ませる

ftp.dell.com にある network/R81433.EXE (unzipで解凍可能)での動作実績が
他のホームページでも紹介されていましたが 私の環境では動作しませんでした

同じ dell.com の ドライバダウンロードサイトから
R140747.EXE を使いました 以下の手順で .infファイルを ndiswrapperに読み込ませます
$ mkdir r140747
$ cd r140747
$ unzip R140747.EXE
Archive:  /home/admin/WLI2-PCI-G54S/r140747.exe
  inflating: msvcr71.DLL             
  inflating: preflib.dll             
  inflating: README.rtf              
  inflating: setup.exe               
  inflating: setup.inx               
  inflating: Setup.ini               
  inflating: setup.iss               
  inflating: WLBCGCBPRO731.DLL       
  inflating: wltray.exe              
〜
〜
  inflating: is.exe                  
 extracting: launcher.ini            
  inflating: layout.bin              
  inflating: MFC71.DLL               
  inflating: msvcp71.DLL             
  inflating: Version.txt
$ cd DRIVER
$ ls
bcm43xx.cat  bcm43xx64.cat  bcmwl5.inf  bcmwl5.sys  bcmwl564.sys

$ ndiswrapper -i bcmwl5.inf
installing bcmwl5 ...

$ ndiswrapper -l
bcmwl5 : driver installed
最後の ndiswrapper -l でドライバの一覧を確認しています
一般ユーザ権限でドライバを導入できることに ある意味ビックリしましたが
モジュールのロードには root権限が必要です
$ su
# modprobe ndiswrapper
# lsmod
Module                  Size  Used by
ndiswrapper           145084  0 
nvidia               4702512  22 

# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr **:**:**:**:**:**  
          unspec addr:[NONE SET]  Bcast:[NONE SET]  Mask:[NONE SET]
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          Interrupt:21 Memory:ef010000-ef012000
HWaddr の部分は伏字としてますが 16進数の MACアドレスが見えてればOKです
dmesgの出力は
ndiswrapper version 1.52 loaded (smp=no, preempt=no)
ndiswrapper: driver bcmwl5 (Broadcom,10/12/2006, 4.100.15.5) loaded
ACPI: PCI Interrupt 0000:00:08.0[A] -> GSI 16 (level, low) -> IRQ 21
ndiswrapper: using IRQ 21
wlan0: ethernet device **:**:**:**:**:** using NDIS driver: bcmwl5, version: 0x4
640f05, NDIS version: 0x501, vendor: 'NDIS Network Adapter', 14E4:4318.5.conf
wlan0: encryption modes supported: WEP; TKIP with WPA, WPA2, WPA2PSK; AES/CCMP with WPA, WPA2, WPA2PSK
usbcore: registered new interface driver ndiswrapper
ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 21
最後に iwconfig でのインターフェース設定を行います
# iwconfig wlan0 mode ad-hoc essid '****' key s:'*****' commit
# iwconfig wlan0
wlan0     IEEE 802.11b  ESSID:"****"  
          Mode:Ad-Hoc  Frequency:2.462 GHz  Cell: **:**:**:**:**:**   
          Bit Rate=11 Mb/s   Tx-Power:32 dBm   
          RTS thr:2347 B   Fragment thr:2346 B   
          Encryption key:7368-696B-61   Security mode:restricted
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
まず essid ですが任意のアクセスポイント名(英数字)を決めて設定します(一応伏字)
key ですがこれは WEPキー(暗号化)を表します s: に続けて文字列で設定します
WEPキーは 5文字(40/64bit) もしくは 13文字(128bit) で指定します

設定は完了ですが iwconfig の画面で疑問点があります IEEE802.11b(11Mbps)の規格なのです
ハードウェアとしては もっと速い IEEE802.11g(54Mbps)に対応してるはずなのですが

では Mebiusノートの接続から 検証開始します
PC-MV1-C1W
(↑の写真は SHARP の製品ページ からのパクリものです)
PC-MV1-C1W ランプ
まず 内蔵無線LAN を使用開始にします タッチパッド左手前の無線LANランプが点灯していることを確認します
(ランプが消灯していれば Fnキー + F1キー で無線LANを有効にします)
PC-MV1-C1W 無線LAN設定
無線LAN設定ツールを開いて設定します 設定箇所は 赤枠の2箇所です
まず ESSIDを 先ほど Linux側で設定した ESSIDに合わせます
(もしくは スキャンボタンを押して アクセスポイントとして検出されることを確認します)
次に WEPキーを入力します これも先ほどアクセスポイントで設定した 5文字/13文字 です

ノートパソコンと Linux側で DHCPの設定が正しければ ノートパソコンでインターネットが見れるようになります
私の環境では動作OKでした

WILLCOM03の設定です
WILLCOM03 TOP画面
赤↑の箇所をタッチして 無線デバイスの設定を呼び出します
WILLCOM03 無線デバイス設定
無線LANデバイスを有効にします 赤↑の箇所をタッチするとデバイスが有効になり MACアドレスが表示されます
WILLCOM03 設定
無線LANの設定を行います 左上のスタートメニューから「設定」を開いて
「接続」タブを選択します 「ネットワークカード」が設定ツールです
WILLCOM03 ネットワーク
アクセスポイントが検出されると 絵のように ESSIDが見えます
これに対して必要な登録を行います
WILLCOM03 アクセスポイント設定1
まず ネットワーク名 として ESSIDが表示されているので正しいことを確認して「次へ」
WILLCOM03 アクセスポイント設定2
次が設定のキモの部分です 「データ暗号化」に WEP を指定して
「ネットワークキー」の部分に WEPキー を入力します
WILLCOM03 アクセスポイント設定3
IEEE802.1xというのは 端末とアクセスポイントの認証方式で
WILLCOM03 はこの機構をサポートしているようです
WLI2-PCI-G54Sは この機構をサポートしてないためか何も設定できません
最後に「完了」を押して設定完了です
WILLCOM03 ネットワーク
DHCPの設定等が正しければ そのうち「接続済」のステータスとなり
めでたくインターネットにつながります WILLCOM03 もうまく接続できました

次に NintendoDS の検証です
ちょうど ファイナルファンタジー3 のソフトに Wi-Fi の設定ツールが付属しているので
それを使ってみます
DS Wi-Fi設定
Wi-Fi設定のトップ画面です 青いパネルをタッチして設定開始します
DS アクセスポイント設定
3箇所まで設定できます 1箇所目の設定をタッチして
「アクセスポイントの検索」をタッチします
DS アクセスポイント選択
ESSID名が表示されアクセスポイントが認識されました これを選択します
続いて WEPキーの入力画面に移りますので WEPキー を入力します
そのまま 接続テスト の画面に移行した後…
DS アクセスポイント設定
こんな画面で 接続失敗となってしまいます
接続確認でエラー 51300 について ネットを検索してみましたが解決には至りませんでした

wlan0 に対して tcpdump を実施しましたが 通信自体が流れていないことが分かりました
無線LAN物理層の設定が悪いのか 任天堂独自プロトコル?? WEPキーの設定のミスでしょうか

後から調べて分かった話ですが
DSでは WEP 128bit/40bit 802.11b 2Mbps で接続しているようです
今回の WLI2-PCI-G54S は 11Mbps(固定?) だったので通信速度が合わなかったと思われます

ちなみに Buffalo社の AOSSという接続の規格がありますが
これは IPで言うところの DHCP に近い機能で WEPの ESSID と キー を自動設定するものです
今回の失敗の件とは直接関係がないと思われます

別の WLI2-PCI-G54S のドライバを試してみます
いろいろ検索して 他のドライバもあたってみましたが 次に紹介するものが私の環境で動作しました
bcmwl5a.inf
bcmwl5.sys
直リンクです(ごめんなさい) 2つのファイルを同じディレクトリにダウンロードして
# rmmod ndiswrapper
# ndiswrapper -r bcmwl5
# ndiswrapper -i bcmwl5a.inf
installing bcmwl5a ...
forcing parameter IBSSGMode from 0 to 2
forcing parameter IBSSGMode from 0 to 2
#
一旦古いドライバを ndiswrapper -r で削除して入れ直しました
# modprobe ndiswrapper
# dmesg
〜
usbcore: deregistering interface driver ndiswrapper
ndiswrapper version 1.52 loaded (smp=no, preempt=no)
ndiswrapper: driver bcmwl5a (Broadcom,12/22/2004, 3.100.46.0) loaded
ACPI: PCI Interrupt 0000:00:08.0[A] -> GSI 16 (level, low) -> IRQ 21
ndiswrapper: using IRQ 21
wlan0: ethernet device **:**:**:**:**:** using NDIS driver: bcmwl5a, version: 0x3642e00, NDIS version: 0x501, vendor: 'NDIS Network Adapter', 14E4:4318.5.conf
wlan0: encryption modes supported: WEP; TKIP with WPA, WPA2, WPA2PSK; AES/CCMP with WPA, WPA2, WPA2PSK
usbcore: registered new interface driver ndiswrapper
とりあえず ドライバはロードできたみたいです
# ifconfig wlan0 192.168.1.1 netmask 255.255.255.0 up
# iwconfig wlan0 mode ad-hoc essid '*******' key s:'*****' commit
# iwconfig wlan0
wlan0     IEEE 802.11g  ESSID:"*******"  
          Mode:Ad-Hoc  Frequency:2.462 GHz  Cell: **:**:**:**:**:**
          Bit Rate=54 Mb/s   Tx-Power:25 dBm   
          RTS thr:2347 B   Fragment thr:2346 B   
          Encryption key:****-****-****-****-****-****-**   Security mode:restricted
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
#
お IEEE802.11gで認識されているではありませんか
ドライバを入れ換えることで 通信規格が選択できるかも(面倒くさいが)
で これは期待できます NitendoDS と通信できるかも で試した結果
Mebius(PC-MV1-C1W) 通信OK
WILLCOM03 つながらない
NintendoDS つながらない アクセスポイントは発見できる
で WILLCOM03 がつながらなかった分さっきよりも結果は悪くなってしまいました
でも確か WILLCOM03は IEEE802.11g サポートされてるはず… ??
結果的に NintendoDS が相変わらず無反応でしたが
とりあえず Linuxで無線LANが使える環境になりました

WILLCOM03の無線機能を ONにしていると明らかに端末が熱をおび
バッテリーを消費してるんだなぁ と分かります 使わない場合は無線機能は OFF にしましょう

WLI-UC-Gドライバの導入

ものの情報によれば
この USBデバイスは Linuxの rt2x00 rt73 ドライバで動作するとのこと
まず Linuxのソースツリーに このドライバがあるか確認してみました
$ cd /usr/src/linux 
$ find . -name '*rt73*'
./drivers/net/wireless/rt2x00/rt73usb.c
./drivers/net/wireless/rt2x00/rt73usb.h
$
$ less drivers/net/wireless/rt2x00/Kconfig

config RT2X00
        tristate "Ralink driver support"
        depends on MAC80211 && WLAN_80211 && EXPERIMENTAL
        ---help---
          This will enable the experimental support for the Ralink drivers,
          developed in the rt2x00 project  http://rt2x00.serialmonkey.com.

          These drivers will make use of the Devicescape ieee80211 stack.

          When building one of the individual drivers, the rt2x00 library
          will also be created. That library (when the driver is built as
          a module) will be called "rt2x00lib.ko".

〜

config RT73USB
        tristate "Ralink rt73 usb support"
        depends on RT2X00 && USB
        select RT2X00_LIB_USB
        select RT2X00_LIB_FIRMWARE
        ---help---
          This is an experimental driver for the Ralink rt73 wireless chip.

          When compiled as a module, this driver will be called "rt73usb.ko".

〜
$
以下の内容が読み取れます
rt73 は rt2x00 に依存している
rt2x00 は MAC80211 と WLAN_80211 と EXPERIMENTAL に依存している

従って カーネルのコンフィグ設定画面では
“Prompt for development and/or incomplete code/drivers” を有効にした上で

カーネルコンフィグ

WLAN_80211 は WLI2-PCI-G54Sの作業のときに有効にしていたので
次は rt73 を有効にします

カーネルコンフィグ

今回の WLI-UC-G の USB上での ベンダID, 製品ID はそれぞれ 0x0411, 0x0137 でした
rt73ドライバが この IDを認識するように追加する必要があります
カーネルソースの drivers/net/wireless/rt2x00/rt73usb.c を書き換えます
2033         /* Billionton */
2034         { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },
2035         /* Buffalo */
2036         { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
2037         { USB_DEVICE(0x0411, 0x0137), USB_DEVICE_DATA(&rt73usb_ops) },
2038         /* CNet */
2039         { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
2040         { USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },
2041         /* Conceptronic */
2042         { USB_DEVICE(0x14b2, 0x3c22), USB_DEVICE_DATA(&rt73usb_ops) },
2037行目が今回追加した行です
結果ですが これをビルドしたカーネルで再起動しても 無線LANデバイスは動作しませんでした
(wlan1 として認識はされましたが iwconfig や ifconfig を一切受け付けない)
rt73がうまくいってないのか Linuxカーネルバージョンが古いのが原因なのか
結局 Linuxネイティブ動作はしませんでした
結局 ndiswrapper + Windowsドライバ でまずデバイスが動作するかどうかを試してみます
ドライバCD上 DRIVER/U2SG54HP/Win2000/ にて
# ndiswrapper -i netsg54.inf
# ndiswrapper -l
bcmwl5 : driver installed
netsg54 : driver installed
# 
では もう一度ドライバを読み込みます
# modprobe ndiswrapper
# iwconfig wlan1
wlan1     IEEE 802.11g  ESSID:"WARPSTAR-075A43"  
          Mode:Managed  Frequency:2.432 GHz  Access Point: **:**:**:**:**:**
          Bit Rate=11 Mb/s   Tx-Power:20 dBm   Sensitivity=-121 dBm  
          RTS thr=2347 B   Fragment thr=2346 B   
          Encryption key:off
          Power Management:off
          Link Quality:21/100  Signal level:-82 dBm  Noise level:-96 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
#