PCM(4)

名称
pcm - FreeBSD オーディオデバイスドライバ

書式
device pcm0 at isa? port? tty irq 5 drq 1 flags 0x15

解説
pcm ドライバは WSS/MSS 仕様または SBPro や SB16 と互換性のある 様々な ISA サウンドカードをサポートしています。 音声入力/再生のみをサポートしており、また、ほとんどのカードで 疑似でない本当の全二重動作が可能です。

通常のパラメータの他に flags フィールドをセカンダリ DMA のチャネルを 指定するのに使用します (一般的には全二重カードで音声入力するために使用します)。 flags には、セカンダリ DMA チャネルを使用しないカードでは 0 を、 使用する場合にはチャネル C を指定するのに 0x10 + C をセットします。

PnP オーディオカードも FreeBSD リリース 2.2.6 から利用できるようになった pnp ドライバを用いることでサポートしています。 詳しい情報は pnp(4) のマニュアルページを参照して下さい。 特に (認識された) PnP カードに割り当てられるユニット番号はレガシ ISA デバイスの後になること、実際にドライバで使用するリソース (port および irq と drq) は "device pcm0" の行からではなく PnP の設定が用いられることは覚えておいてください。 ですから、カーネルコンフィグファイルに

device pcm0 ...

のように書いたとすると、最初に見つかる PnP オーディオカードの ユニット番号は 1 となり、/dev/audio1、/dev/dsp1 等として アクセスすることができます。 アプリケーションの多くは暗黙のうちに /dev/audio を使用するようになっているので、 以下のように /dev/audio から正しいデバイスのエントリにシンボリックリンクを 作るのがよいでしょう。

cd /dev rm audio dsp dspW mixer ./MAKEDEV snd1 ln -s audio1 audio ln -s dsp1 dsp ln -s dspW1 dspW ln -s mixer1 mixer

本ドライバは WSS/MSS カードで最大能力を発揮します。 WSS/MSS はすっきりした構造をしており、 それぞれ独立した機能の集合になっています。 偶然にもこれらのカードは市場で一番安いオーディオカードでもあります。 SB や ESS などといった他のカードは内部構造が複雑で、 また資料が手に入らないことも稀ではありません。 結果、これらのカードのサポートはそれほど良くありません。

ドライバは装備されているハードウェアを認識し、 正しく動作させるために出来る限りのことをします。 したがってカーネルのコンフィグファイルに それほど詳細な設定をする必要はありません。 PnP カードについては自動的に識別するので実に簡単です。 PnP でない ISA のカードについては (カーネルコンフィグファイルで明示的にアドレスを指定して 優先させない限りは) まずアドレス 0x530 と 0x604 で MSS カードを探し、 その後に 0x220 と 0x240 で SB カードを探します。

IOCTL
本ドライバは Voxware の ioctl() のほとんどをサポートしており、 (広く使われている mpeg プレイヤや Linux のバイナリを含めて) ほとんどのアプリケーションは修正することなしに動作します。 違いはいくつかはあります (その中でも重要なひとつはオーディオ バッファをメモリマップしてアクセスする能力の違いです)。 このためにアプリケーションの中にはオーディオモジュールに ちょっとした変更をして再コンパイルする必要があるものもあるでしょう。 サポートしている ioctl の完全なリストについては /usr/include/machine/soundcard.h を参照して下さい。

サポートしているカード

サポートしているコーデック (訳注: 音声の入出力を行う回路)/カードのリストを、 PnP 設定が可能なものについては適用可能な PnP の設定情報も含めて、 以下に示します (デフォルトのパラメータを示しますが、 実際のあなたのリソースはこれと違っているかもしれません。)

CS4237, CS4236, CS4232, CS4231
    pnp 1 0 os enable port0 0x534 port2 0x220 irq0 5 drq0 1 drq1 3

    これらのカードはすべて MSS モードで全二重で完璧に動作します。 このチップセットは、他にもありますが、A/Open の AW35 および AW32、 Intel のマザーボードのいくつか、 および (CS4231は) 非 PnP のカードに使用されています。

    Voxware の資料によれば CS4232 はバグ持ちとの報告がありますが、 本当かどうか定かではありません。 私の Intel 製マザーボードの 1 つでは音声入力が動作しませんが、 これは単に音声入力の DMA チャネルが ISA の DMA コントローラに 接続されていないためです。

GUSPnP
    pnp 1 0 os enable port0 0x220 port1 0x320 port2 0x32c irq0 5 drq0 7 drq1 5

    MSS モードで全二重をサポートしています。 GUSPnP は、本物の CS4231 を使用しておらず、 また mu-law 形式を扱うときのエミュレーションにバグがあると疑っています。 このカードはもう生産されていませんので、 わざわざカードを (mu-law で動作することがわかっている) "Mode3" に セットする特別なコードを採り入れることはしないで 内部的に U8 形式を用いてドライバ内部でソフトウェアで形式の変換をしています。 このことによって分解能が失われますので、 このカードでは可能な限り 16 ビットモードを使用して下さい。

Yamaha OPL-SAx
    pnp 1 0 os enable port0 0x220 port1 0x530 port2 0x388 port3 0x370 irq0 5 drq0 1 drq1 3

    すべてのモードで完全に動作します。 このチップは様々な PnP カードで使用されているのみならず、 (非 PnP モードで) マザーボードやラップトップマシンで用いられています (たとえば東芝の Libretto)。

OPTi931
    pnp 1 1 os enable port0 0x534 port2 0x220 port3 0xe0d irq0 10 drq0 1 drq1 6

    このチップはバグ持ちですが、これらのチップ以外に全二重で動作するカードを 見付けることが出来なかった時期もあったので、ドライバでたくさんの回避策を とって全二重で動作するようにしました。チップのバグのため、u-law 形式は 内部では U8 形式を用いています。

SB16, Vibra16C, および古い SB16/AWExx カード
    pnp 1 0 os enable port0 0x220 irq0 5 drq0 1 drq1 5

    これらのコーデックは、 片方向を 8 ビットで、もう一方を 16 ビットで使用することで、 制限付きの全二重動作可能です。 ドライバはこのモードでの動作をサポートしていますが、 このモードでの動作は CreativeLabs ではサポートされていないことを 覚えておいて下さい。

Vibra16X および新しめの SB16/AWExx カード
    pnp 1 0 os enable port0 0x220 irq0 5 drq0 1 drq1 3

    最近になって CreativeLabs はコーデック (DSP) を変更しましたが、 新しい回路は古い物と若干異なっています。 最も顕著な違いは 2 つの 8 ビット DMA チャネルの使用法です。 これによって本ドライバの全二重動作サポートが動作しなくなったようです。 ウェーブテーブルを使用することによって全二重動作は可能になるかもしれませんが、 本ドライバではウェーブテーブルをサポートしていないので 半二重で我慢してください。

SBPro とそのクローン
    その他のほとんどのカードの既定動作がこのモードです。 それらのカードに対しては限定的な (そしてバグがあるかもしれない) サポート、8 ビット半二重しかありません。 (ESS チップの場合のように)時としてハードウェアがそれ以上の能力を もっている場合でも、です。

診断と問題解決

This is XXX but LDN Y is disabled

    これは bios が PnP デバイスを使用不可のままにしており、 手動で "-c" つきでブートして上記の pnp 設定を行わなければならないことを 示しています。

pcmX: unit not configured, perhaps you want pcmY ?
    これは正しくないユニットを用いていることを示しています。 一般に、正しいユニットへのシンボリックリンクを作らずに PnP カードを使用しているときに起こります。 /dev ディレクトリで正しいユニットを指すようにシンボリックリンクを (場合によってはデバイスエントリも) 作り直して下さい。

timeout flushing dbuf_out ...
    これはカードの設定に問題 (具体的には、DMA チャネル) があるか あるいは (滅多にないことですが) ドライバに問題があるかによって、 カードが正しく認識されていないことを示します。音声入力に使用する DMA チャネルを確認して下さい。

capture does not work
    これは入力 DMA チャネルが正しく設定されないときによく起こります。

バグ
資料がないため、SB16 のサポート状態は十分ではありません。 同様に、ミキサのサポートは不完全であり、 またあなたのカードの機能 (たとえば全体の音量の制御など) の中には すべてのデバイスについて サポートされていないものがあるかもしれません。

歴史
pcm デバイスドライバは FreeBSD 2.2.6 で初めて登場しました。

作者
pcm デバイスドライバおよびこのマニュアルページは Luigi Rizzo (luigi@iet.unipi.it) が書きました。