知り合いがCF-B5ERを買ったので、 FreeBSDを入れたときの様子を解説しています。サウンドの話題が中心です。
不明な記述や不正確な記述などありましたら 是非ご指摘ください。
おっと、書き忘れましたがFreeBSDのversionは4.3-BETAです。
CF-B5(E)RにはYMF743というチップが載っていて、これで録音/再生をするんですが、 このチップはAC'97 Rev 2.0準拠にもかかわらずVRA/VRM(録再レート可変)が サポートされておらず、録再は常に48KHzで行うという仕様になっているようです。
そのため、再生の場合は 「デバイスに渡る直前までのどこかに」やりとりするデータを 48KHzに変換する処理を入れておかないと、
WAVならSOX、MP3ならエンコード時に48KHzに変換しておけば 大抵のプレイヤは48KHzのデータをそのまま流しますので、これで 済む場面もあるでしょう。しかし対象データの個数が多いときなどは ちょっと大変かも。
アプリケーションによっては再生周波数を変更できるものがあります (mpg123ならmpg123 -r 48000などとすれば48KHzで再生できる)ので、 試してみましょう。
オプションでサポートされていなくても、プログラムをちょっといじれば 48KHzで再生できるようなものも結構あります(ソフトウエア音源など)ので、 こちらも試してみる価値ありだと思います。
Windowsではこの手の問題がないところを見るとおそらくドライバが 変換しているんでしょう。FreeBSDだとソースを見た限りでは ハード側でレート変換がサポートされていないものは素通りみたいですので、 ここを実装すれば問題は解決でしょう。しかし...そういう実装はちと見あたらず。
サウンドサーバもアプリケーションのひとつですが、 みんなが/dev/dspとかを直接触りに行くのをやめて、サーバひとつたてて これ経由でサウンドをいじりましょうというものです。
みんながサーバを通すことによって
反面、サーバが/dev/dspを掴んでしまうので、サーバに対応していない 普通のアプリケーションで音が出せないという問題もありますが、 サーバ側で「一定時間接続がなければ/dev/dspを手放す」という設定が できるものも多いですし、また、「/dev/dspをいじってるアプリケーションを 無理矢理サーバに対応させるためのライブラリ」というものが ありますので、事実上、サウンドはサーバに任せきりということも可能です。
さて、サーバはいろんなアプリケーションからのデータをうまく処理する 必要があるわけですが、アプリケーションごとに要求する 設定(サンプルレート、チャンネル、サンプルビットなど)が異なっていても 問題なく処理できるように、サーバ内にそれらを任意に変換するための 機能をそなえています。
なので、今回のようにサンプルレートを常に48KHzに固定したーい、という 場合は、サーバを48KHz、2ch、16bitで起動させておけば、 アプリケーション側は何も考えなくてもサーバが適切に変換してくれる ということになります。
サウンドサーバといってもいろいろありますから 簡単な紹介と私の使用感などを書いておきます。
詳しくはこちら。 おそらく一番ポピュラーなものでしょう。対応アプリケーションも とても多いです。
EsounDに対応していない(/dev/dspを直接触りに行く)アプリケーションを 強引にEsounDに対応させる(ある意味ちょっとおっかない)esddspというソフトが あります(実体はopen/ioctlなどを上書きするためのライブラリをLD_PRELOADさせて アプリケーションを起動させるスクリプトです)
コンセプトはとても素晴しいものなのですが、 すでに長いこと開発が止まっているうえに、肝心のミキシング性能に 難があります。esd に44.KHz→48KHzに変換させると非常に耳障りなノイズが 乗ります。
詳しくはこちら。 サウンドサーバの定義からはちと外れるような気もしますが、 非常に多彩な入出力環境をサポートしています。 レート変換もサポートしていますので、「全てをxmms経由で鳴らす」ことで 比較的統一感のあるサウンド環境が作れるのではないかと思います。
詳しくはこちら。 かなり歴史のあるNetwork Audio Systemです。 対応アプリも多いのですが、(EsounDほどではないにしろ)レート変換時の 音質低下が気になります。
libaudioossという、esddspがやってるのと同様なライブラリがあります。
詳しくはこちら。 比較的新しいサーバです。非常に高機能高品質です。 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-snapshotを貰ってきます。 私は2001/03/11のsnapshotを貰ってきました。
build + installそのものは、./configure ; gmake ; gmake installでよいはずです。 古いsnapshotでKDEが入ってないときはconfigure時に--disable-kdeしないと 駄目かもしれません。
xmmsで統一できるものはこちらを使いたいということで 入れてみました。また、私は使っていませんが aRts output pluginが あります。
% artsd -r 48000でOkです。
この状態で、
% artsdsp xmmsとしても残念ながらaRts経由で音を鳴らすことはできません。 artsdsp -vすると分かりますが、
Loading the aRts backend "/usr/local/lib/libartscbackend.la" failedといったエラーが出ていると思います。
原因究明にけっこう時間かかりましたがばっさり省略。 ここからの threadをごらんください。
私はこれと(手元での実験結果など)を見て、 「CのアプリからC++のライブラリをdlopenしようとするとはまる」 と判断しました。また、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
libgcc.soをPRELOADすることで
% artsdsp xmmsなどがきちんと動くようになると思います。
なおlibgcc.soの置場ですが、PRELOADができればいいので 無理に/usr/libや/usr/local/libに置く必要はないと思います。 むしろlibgcc.soがあるおかげでコンパイルやconfigureに失敗するということが ないわけではないので、ご注意ください。
以上の設定によって
JEsdというソフトがあります。 これはJavaによるEsounDの実装です。実際に音を出す部分は Java Media APIに任せていますので、 JEsdをartsdsp経由で起動することによって
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