FreeBSD on Panasonic CF-B5ER

知り合いがCF-B5ERを買ったので、 FreeBSDを入れたときの様子を解説しています。サウンドの話題が中心です。

早い話がドライバ入れて aRts入れましたということです。

不明な記述や不正確な記述などありましたら 是非ご指摘ください。

おっと、書き忘れましたがFreeBSDのversionは4.3-BETAです。

更新履歴

News

概要

CF-B5(E)RにはYMF743というチップが載っていて、これで録音/再生をするんですが、 このチップはAC'97 Rev 2.0準拠にもかかわらずVRA/VRM(録再レート可変)が サポートされておらず、録再は常に48KHzで行うという仕様になっているようです。

そのため、再生の場合は 「デバイスに渡る直前までのどこかに」やりとりするデータを 48KHzに変換する処理を入れておかないと、

といった症状に悩まされることになります。

対処法など

対処法1: 対象データを変換

WAVならSOX、MP3ならエンコード時に48KHzに変換しておけば 大抵のプレイヤは48KHzのデータをそのまま流しますので、これで 済む場面もあるでしょう。しかし対象データの個数が多いときなどは ちょっと大変かも。

対処法2: アプリケーションで変換

アプリケーションによっては再生周波数を変更できるものがあります (mpg123ならmpg123 -r 48000などとすれば48KHzで再生できる)ので、 試してみましょう。

オプションでサポートされていなくても、プログラムをちょっといじれば 48KHzで再生できるようなものも結構あります(ソフトウエア音源など)ので、 こちらも試してみる価値ありだと思います。

対処法3: ドライバレベルで変換

Windowsではこの手の問題がないところを見るとおそらくドライバが 変換しているんでしょう。FreeBSDだとソースを見た限りでは ハード側でレート変換がサポートされていないものは素通りみたいですので、 ここを実装すれば問題は解決でしょう。しかし...そういう実装はちと見あたらず。

対処法4: サーバで変換

サウンドサーバもアプリケーションのひとつですが、 みんなが/dev/dspとかを直接触りに行くのをやめて、サーバひとつたてて これ経由でサウンドをいじりましょうというものです。

みんながサーバを通すことによって

などを利用できるという利点があります。

反面、サーバが/dev/dspを掴んでしまうので、サーバに対応していない 普通のアプリケーションで音が出せないという問題もありますが、 サーバ側で「一定時間接続がなければ/dev/dspを手放す」という設定が できるものも多いですし、また、「/dev/dspをいじってるアプリケーションを 無理矢理サーバに対応させるためのライブラリ」というものが ありますので、事実上、サウンドはサーバに任せきりということも可能です。

さて、サーバはいろんなアプリケーションからのデータをうまく処理する 必要があるわけですが、アプリケーションごとに要求する 設定(サンプルレート、チャンネル、サンプルビットなど)が異なっていても 問題なく処理できるように、サーバ内にそれらを任意に変換するための 機能をそなえています。

なので、今回のようにサンプルレートを常に48KHzに固定したーい、という 場合は、サーバを48KHz、2ch、16bitで起動させておけば、 アプリケーション側は何も考えなくてもサーバが適切に変換してくれる ということになります。

サウンドサーバについて

サウンドサーバといってもいろいろありますから 簡単な紹介と私の使用感などを書いておきます。

EsounD

詳しくはこちら。 おそらく一番ポピュラーなものでしょう。対応アプリケーションも とても多いです。

EsounDに対応していない(/dev/dspを直接触りに行く)アプリケーションを 強引にEsounDに対応させる(ある意味ちょっとおっかない)esddspというソフトが あります(実体はopen/ioctlなどを上書きするためのライブラリをLD_PRELOADさせて アプリケーションを起動させるスクリプトです)

コンセプトはとても素晴しいものなのですが、 すでに長いこと開発が止まっているうえに、肝心のミキシング性能に 難があります。esd に44.KHz→48KHzに変換させると非常に耳障りなノイズが 乗ります。

xmms

詳しくはこちら。 サウンドサーバの定義からはちと外れるような気もしますが、 非常に多彩な入出力環境をサポートしています。 レート変換もサポートしていますので、「全てをxmms経由で鳴らす」ことで 比較的統一感のあるサウンド環境が作れるのではないかと思います。

NAS

詳しくはこちら。 かなり歴史のあるNetwork Audio Systemです。 対応アプリも多いのですが、(EsounDほどではないにしろ)レート変換時の 音質低下が気になります。

libaudioossという、esddspがやってるのと同様なライブラリがあります。

aRts

詳しくはこちら。 比較的新しいサーバです。非常に高機能高品質です。 KDEとともに使うと非常に素晴しいコンソールが使えるようです(が 私は使っていません)。artsdspというesddspと同様なソフトがあります。

残念ながらEsounDやNASとの互換性はありません(artsdspならぬartsesdが 欲しいですなあ)。また、 対応アプリケーションもそれほど多くありません。

しかしEsounDとよく似たAPIのライブラリがありますので、EsounD対応の アプリケーションをaRts対応にするのは比較的容易です。 同様に、/dev/dspを直接叩くアプリケーションも (PRELOADすれば解決するライブラリがあることからも分かるように) ほぼ機械的な変更のみで対応できます。

インストールなど

ドライバ + カーネル

桂島さんのページから ドライバを貰ってきて入れてください。記述の通りにやれば問題ないはずですので ここでは略。

このとき、BIOS設定(リセット後 F2押下)で 詳細→プラグ&プレイ を「使用しない」にしておかないと、

pcm0: unable to map IO port space
device_probe_and_attach: pcm0 attach returned 6
というエラーが出て使えないのでご注意ください。

aRts

こちらで arts-snapshotを貰ってきます。 私は2001/03/11のsnapshotを貰ってきました。

build + installそのものは、./configure ; gmake ; gmake installでよいはずです。 古いsnapshotでKDEが入ってないときはconfigure時に--disable-kdeしないと 駄目かもしれません。

xmms

xmmsで統一できるものはこちらを使いたいということで 入れてみました。また、私は使っていませんが aRts output pluginが あります。

artsdの起動

% artsd -r 48000
でOkです。

artsdsp

この状態で、

% artsdsp xmms
としても残念ながらaRts経由で音を鳴らすことはできません。 artsdsp -vすると分かりますが、
Loading the aRts backend "/usr/local/lib/libartscbackend.la" failed
といったエラーが出ていると思います。

原因究明にけっこう時間かかりましたがばっさり省略。 ここからの threadをごらんください。

私はこれと(手元での実験結果など)を見て、 「CのアプリからC++のライブラリをdlopenしようとするとはまる」 と判断しました。また、libgcc.soがあればひとまず解決するだろうと 判断しました。

libgcc.so

(2001/07/03追記) 4.3-RELEASEではlibgcc_pic.aが入らないようです。 1.34の変更で、 INSTALL_PIC_ARCHIVE=yesが.if内に入ったのが原因のようです。 これを外してmakeすればいいのでしょうが... 私は面倒だったので4.1-RELEASEのときに作ったlibgcc.soを持ってきてそのまま使ってます (いいのか) いずれにしても↓の注意に変わりはありませんので よろしくおねがいします。

以下の作業は筆者が有効であると判断して行っているものです。 これによって私の触った環境でartsdspが動くようになったのは確かですが、 その有効性と安全性を筆者が保証するものではありません。あくまでも ここからの threadを読んでこの作業の有効性とリスクを確認した上で、 行うようにしてください。at your own riskでおねがいします。

libgcc.soを作ります。

% cd /somewhere
% mkdir tmp
% cd tmp
% ar x /usr/lib/libgcc_pic.a
% cd ..
% gcc -shared -fno-shared-data -o libgcc.so tmp/*.So
これでできたlibgcc.soをartsdspからPRELOADさせるように 変更すればOkです。
(変更場所: $PREFIX/bin/artsdspの下の方)
変更前:
LD_PRELOAD=${libdir}/libartsdsp.so:${libdir}/libartsc.so
変更後:
LD_PRELOAD=/somewhere/libgcc.so:${libdir}/libartsdsp.so:${libdir}/libartsc.so

ふたたびartsdsp

libgcc.soをPRELOADすることで

% artsdsp xmms
などがきちんと動くようになると思います。

なおlibgcc.soの置場ですが、PRELOADができればいいので 無理に/usr/libや/usr/local/libに置く必要はないと思います。 むしろlibgcc.soがあるおかげでコンパイルやconfigureに失敗するということが ないわけではないので、ご注意ください。

結論

以上の設定によって

とすることでほとんどのアプリケーションは問題なく使えるように なるはずです。EsounDしか対応してないアプリケーションは aRts対応にチャレンジしてみるといいかもしれません。けっこう 簡単ですよ。

番外編

JEsdというソフトがあります。 これはJavaによるEsounDの実装です。実際に音を出す部分は Java Media APIに任せていますので、 JEsdをartsdsp経由で起動することによって

というふうに対応APIの幅を広げることができます。 しかしJDK1.3 for FreeBSDは出ていないので、動かすまでには 余計な苦労がいろいろあるような気もします(ので私はアイディアのみで ひきあげてきました)

EsounDのふりをして、実はartsdに丸投げするProxy(というのかな)は 兼ねてから作ろうかなと思っていたんですが、artsdspがわりと 便利だし別にいいかなーと思いだしたり。SDLも aRtsに対応したしねえ...

その他

pcicをdisabledにしとかないとprobe? attach?時にハングアップしてしまうようです。 おかげでインストーラも動かない。

→ pollingモードに関係あり? こちらからのthreadを参照。 緊急度低かったので試していません。ひょっとして PnPをOffにすれば解決するのかな?試してみなくては。

(2001/07/03) どうもそうみたい。自分のCF-B5Rで4.3-RELEASEを入れたときは、 pcicをdisableにしないとsysinstallまで到達しませんでした。 カーネル再構築時にirqを指定するようにしたところ きちんと使えるようになりました。

XはXFree86 4.0.2を使ったところ安直に1024x768x16bppできました。

(2001/07/02追記) HDDが不調のため換装する羽目に。先頭に0xa0の 領域を作ったんですがハイバネーションができなくなりました。

******* Working on device /dev/ad0 *******
parameters extracted from in-core disklabel are:
cylinders=38760 heads=16 sectors/track=63 (1008 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=38760 heads=16 sectors/track=63 (1008 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 160,(Suspend to Disk)
    start 63, size 419265 (204 Meg), flag 0
        beg: cyl 0/ sector 1/ head 1;
        end: cyl 415/ sector 63/ head 15
The data for partition 2 is:
sysid 165,(FreeBSD/NetBSD/386BSD)
    start 419328, size 38650752 (18872 Meg), flag 80 (active)
        beg: cyl 416/ sector 1/ head 0;
        end: cyl 1023/ sector 63/ head 15
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
なのが原因なのかなあ...換装前は
The data for partition 1 is:
sysid 160,(unknown)
    start 63, size 417627 (203 Meg), flag 0
        beg: cyl 0/ sector 1/ head 1;
        end: cyl 25/ sector 63/ head 254
でした。

おまけ

考えをまとめるために書いたmgpファイルがあります。 よろしければどうぞ。mgp / ps

なお、artsdsp経由でpcmtestしますと

% artsdsp ./pcmtest
**** Play ****
  8 bit I/O: Ok
 16 bit I/O: Ok
Monoral I/O: Ok
 Stereo I/O: Ok
Sample rate:
 48000
 44100
 37800
 33075
 32000
 27429
 22050
 18900
 16000
 11025
 9600
 8000
 6615
 5512

**** Record ****
  8 bit I/O: Ok
 16 bit I/O: Ok
Monoral I/O: Ok
 Stereo I/O: Ok
Sample rate:
 48000
 44100
 37800
 33075
 32000
 27429
 22050
 18900
 16000
 11025
 9600
 8000
 6615
 5512
となります(^^)v


Zinnia (zinnia@risky-safety.org)
このWebコンテンツ(ここから辿れるもの)に対する コメントのメールは許可なく公開することがあります。 (最近多い無礼なメール対策であって穏当なメールをいきなり公開したり することはありません)