EN JA
SOUND(4)
SOUND(4) FreeBSD Kernel Interfaces Manual SOUND(4)

名称

sound, pcm, sndFreeBSD PCM オーディオデバイスインフラストラクチャ

書式

このドライバをカーネルにコンパイルするためには、次の行を利用者のカーネル設定ファイルに置きます:

device sound

解説

sound ドライバは、 FreeBSD サウンドシステムの主な構成要素です。それは、サポートされたデバイスでブリッジデバイスドライバと連動して動作し、いったんアタッチされると PCM オーディオ録音と再生を提供します。各ブリッジデバイスドライバは、特定のセットのオーディオチップセットをサポートし、 sound ドライバと共に有効にされる必要があります。 PCI と ISA PnP オーディオデバイスは、それら自体を識別するので、通常、ユーザは、 /boot/device.hints に何も追加する必要はありません。

sound ドライバの主な機能のいくつかは、次の通りです: 多重チャネルのオーディオ、アプリケーション毎のボリューム制御、仮想サウンドチャネルを通したダイナミックミキシング、真の全二重操作、ビット適合オーディオ、レート変換と低いレイテンシ。

sound ドライバは、いくつかのブリッジデバイスドライバと共にデフォルトで有効にされます。 kldload(8) で実行時の間に、または loader.conf(5) を通してブートの間に、デフォルトで有効にされなかったものをロードすることができます。次のブリッジデバイスドライバが利用可能です:

ドライバ特有の設定と情報については、それぞれのブリッジデバイスドライバのマニュアルページを参照してください。

古いハードウェア

古い ISA カードに関して、ドライバは、アドレス 0x5300x604 で MSS カードを探します。 /boot/device.hints で、これらの値を上書きすることができます。非 PnP サウンドカードは、 device.hints(5) で次の行を必要とします:

hint.pcm.0.at="isa" 
hint.pcm.0.irq="5" 
hint.pcm.0.drq="1" 
hint.pcm.0.flags="0x0"

通常のパラメータは、別として、フラグフィールドは、二次 DMA チャネル (一般的に、全二重カードでキャプチャのために使用される) を指定するために使用されます。フラグは、二次 DMA チャネルを使用しないカードのために 0、または、チャネル C を指定するために 0x10 + C に設定されます。

ブート変数

一般的に、モジュール snd_foo は、 device snd_foo に対応し、 loader.conf(5) を通してブート loader(8) によって、または kldload(8) /boot/loader.conf で指定できるオプションは、次の通りです:
snd_driver_load
(“ NO”) “ YES”に設定されるなら、このオプションは、すべての利用可能なドライバをロードします。
snd_hda_load
(“ NO”) “ YES”に設定されるなら、 Intel High Definition Audio ブリッジデバイスドライバと依存するモジュールだけがロードされます。
snd_foo_load
(“ NO”) “ YES”に設定されるなら、カード/チップセット foo のためのドライバをロードします。

異なったミキサチャネルのためのデフォルト値を定義するためには、ヒントを使用して好みの値にチャネルを設定します、例えば: hint.pcm.0.line=“ 0”。これは、デフォルトで入力チャネルをミュート (音を消) します。

多重チャネルのオーディオ

一般に“サラウンドサウンド” (surround sound) と呼ばれる、多重チャネルオーディオは、サポートされ、デフォルトで有効にされます。 FreeBSD の多重チャネルのマトリクスプロセッサは、最大 18 個のインタリーブされるチャネルをサポートしますが、制限は、現在、(7.1 サラウンドサウンドのために共通に使用されるように) 8 個のチャネルに設定されます。内部のマトリックスマッピングは、チャネルの減少、拡張または再ルーティング扱うことができます。これは、関連する多重チャネルの ioctl() サポートのための基本的なインタフェースを提供します。多重チャネルのオーディオは、 VCHAN ありとなしで動作します。

ほとんどのブリッジデバイスドライバは、まだ、多重チャネルのマトリクス化のサポートが不足していますが、ほとんどの場合、これは、実装するためには、ささいなものであるはずです。使用されるチャネルの数を調整するためには、 dev.pcm.%d.[play|rec].vchanformat sysctl(8) を使用します。現在の多重チャネルのインタリーブされた構造体と配列は、様々な一般の UNIX アプリケーションを調べるすることによって実装されました。単一の標準がないので、各アプリケーションには、それ自体の衝突の標準があるという事実にもかかわらず、各可能なシナリオを満たそうと試みるために、多くの注意が払われました。

EQ

Parametric Software Equalizer (EQ) は、“トーン”制御 (低音部と高音部) の使用を有効にします。ハードウェアの品質における大きな違いのために、耳に心地よい音楽または周波数補償 (frequency compensation) のために一般的に使用されます。 EQ は、デフォルトで無効にされますが、 hint.pcm.%d.eq 調整変数で有効にすることができます。

VCHAN

各デバイスは、オプションで“仮想チャネル”または VCHAN を使用することによって提供される物理的なハードウェアより多くの再生と録音チャネルをサポートできます。 sysctl(8) インタフェースを通して VCHAN オプションを設定することができますが、デバイスがアクティブでない間だけ、操作することができます。

VPC

FreeBSD は、マスタ sound 音量に触らずに、各アクティブなアプリケーションのための独立していて個々の音量制御をサポートします。これは、時々 Volume Per Channel (VPC) と呼ばれます。 VPC の機能は、デフォルトで有効にされています。

ローダ調整変数

次のローダ調整変数は、カーネルをブートする前に loader(8) プロンプトでドライバを設定するために使用されるか、またはカーネルをブートする前に、自動的に設定するために、それらを /boot/loader.conf に格納することができます。また、 sound ドライバをロードする前に、これらの調整変数を変更するために kenv(1) を使用することも可能です。実行時に、 sysctl(8) を使用して、次の調整変数を変更することはできません。
hint.pcm.%d.eq
イコライザ (equalizer) を明白に有効にする (1) または無効にする (0) ために 1 または 0 に設定します。変更するなら、ドライバの再ロードを必要とします。これを有効にすると、低音部と高音部の制御がミキサアプリケーションに現れるようにします。この調整変数は、デフォルトで未定義です。イコライジング (equalizing) は、デフォルトで無効にされます。
hint.pcm.%d.vpc
VPC 機能を明白に有効にする (1) または無効にする (0) ために 1 または 0 に設定します。この調整変数は、デフォルトで未定義です。しかしながら、 VPC は、デフォルトで有効にされています。

実行時設定

実行時に変更することできる利用可能な多くの sysctl(8) 変数があります。また、ブートプロセスの間に自動的にそれらを設定するために /etc/sysctl.conf に、これらの値を格納することができます。 hw.snd.* は、グローバルに設定され、 dev.pcm.* は、デバイス特有です。
hw.snd.compat_linux_mmap
Linux mmap(2) 互換性。次の値が、サポートされています (デフォルトは、0 です):
-1
強制的に PROT_EXEC mmap(2) 要求を無効にするか、拒否します。
0
自動 proc/ABI タイプを検出によって、 Linux アプリケーションのために mmap(2) を許可して、ほかのすべては、拒否します。
1
常に、PROT_EXEC ページマッピングを許可します。
hw.snd.default_auto
自動的に、デフォルトのサウンドユニットを割り当てます。次の値がサポートされています (デフォルトは、1 です):
0
デフォルトのサウンドユニットを自動的に割り当てません。
1
デバイスの再生と録音のケーパビリティに基づいた最良の利用可能なサウンドデバイスを使用します。
2
最も最近アタッチされたデバイスを使用します。
hw.snd.default_unit
複数のサウンドカードがあるシステムのためのデフォルトのサウンドカード。 devfs(5) を使用するとき、 /dev/dsp のためのデフォルトのデバイスです。 /dev/dsp から /dev/dsp ${hw.snd.default_unit} までのシンボリックリンクと同等です。
hw.snd.feeder_eq_exact_rate
特定のレート (速度) のみ、正確な処理のために許可されています。しかしながら、デフォルトの振る舞いは、サポートされないものでさえ、すべてのレートに対してずさんな処理を許可することです。この要件を切り替えるために有効にし、サポートされるレートに対してのみ処理することを許可します。
hw.snd.feeder_rate_max
最大の許容可能なサンプルレート。
hw.snd.feeder_rate_min
最小の許容可能なサンプルレート。
hw.snd.feeder_rate_polyphase_max
再サンプリングフィルタを構築するプロセスの間の許可された多相 (polyphase) エントリの最大数の設定を調整します。多相のリサンプリングを無効にすると、より遅くて低い品質の変換を犠牲にしてメモリ使用量を減少させるメリットがあります。 SINC 補間器 (interpolator) が使用されているときのみ、適応可能です。デフォルト値は、183040 です。多相再サンプリングを無効にするためには、0 に設定します。
hw.snd.feeder_rate_quality
サンプルレートコンバータ品質。デフォルト値は、1 で、直線的な補間 (interpolation) です。利用可能なオプションは、次の通りです:
0
Zero Order Hold、ZOH。非常に速いのですが、品質が劣ります。
1
直線的な補間。速く、品質は、個人的な好みに左右されます。しかしながら、技術的な品質は、アンチエイリアシング (anti-aliasing) フィルタリングの不足のために、劣っています。
2
帯域制限された SINC 補間器。変換精度を改良するために複数の高品質の多項式の補間器で、メモリ使用量の費用において、変換速度を引き上げるために多相バンキング (banking) を実装します。 100% 固定小数点、32 ビットの係数がある 64 ビットのアキュムレータ、と高い精度のサンプルバッファリング。品質の値は、100dB の阻止帯域 (stopband)、8 つのタップ (tap) と 85% の帯域幅です。
3
品質の値として 100dB の阻止帯域 (stopband)、36 つのタップ (tap) と 90% の帯域幅がある、帯域制限された SINC 補間器の継続。
4
品質の値として 100dB の阻止帯域 (stopband)、164 つのタップ (tap) と 97% の帯域幅がある、帯域制限された SINC 補間器の継続。
hw.snd.feeder_rate_round
正確度の費用で大きい主要な分割を避けるために敷居値を丸めるサンプルレート。すべての要求されたサンプルレートは、最も近い閾値に丸められます。指定できる値は、0 (無効にされる) と 500 の間の範囲です。デフォルトは、25 です。
hw.snd.latency
バッファリングレイテンシを設定します。ブロックサイズ / フラグメントを明白に要求しないアプリケーションのみ影響します。この調整変数は、 hw.snd.latency_profile 調整変数より細かい精度を提供します。指定できる値は、0 (最も低いレイテンシ) と 10 (最も高いレイテンシ) の間です。
hw.snd.latency_profile
hw.snd.latency 調整変数のためのバッファリングレイテンシ (待ち時間) 変換テーブルの設定を定義します。 0 の値は、アプリケーションが、特に高い負荷の間に急速な IRQ レートを保持できないなら、アンダランの可能性がある結果となるかもしれない、低くて攻撃的なレイテンシプロファイルを使用します。デフォルト値は、適度で安全なレイテンシプロファイルを考慮する、1 です。
hw.snd.maxautovchans
少なくとも 1 つの再生または録音チャネルが利用可能なデバイスのみに影響するグローバルな VCHAN 設定。サウンドシステムは、こんなに多くの VCHAN まで、動的に作成します。 VCHAN が要求されないなら、“0”に設定します。最大値は、256 です。
hw.snd.report_soft_formats
透過的にアプリケーションソフトウェアで利用可能かどうか、内部のフォーマット変換を制御します。無効または利用可能でないとき、アプリケーションは、デバイスが本来サポートする形式を選択することだけができます。
hw.snd.report_soft_matrix
たとえハードウェアがそれをサポートしなくても、シームレスなチャネルマトリクスを有効にします。簡単なステレオサウンドカードがあっても多重チャネルのストリームを演奏することを有効にします。
hw.snd.verbose
/dev/sndstat デバイスのための冗長レベル。より高い値は、より多くの出力を含みます、そして最高レベル、4 は、問題を報告するとき使用されるべきです。他のオプションは、次の通りです:
0
インストールされたデバイスとそれらの割り付けられたバスリソース。
1
デバイスごとの再生、録音、仮想チャネルとフラグの数。
2
チャネルの現在の形式、スピード (速度) とバッファオーバランとバッファアンダランのような疑似デバイス統計値を含むデバイス毎のチャネル情報。
3
現在のロードされたサウンドモジュールのファイル名とバージョン。
4
デバッグを対象とした様々なメッセージ。
hw.snd.vpc_0db
sound 音量のためのデフォルト値。減衰 (attenuation) 制御のためのより多くの余地を与えるために増加します。音のクリッピング (clipping) の考えられる費用で、より多くの増幅を減少します。
hw.snd.vpc_autoreset
チャネルがクローズされるとき、チャネルの音量は、0db にリセットされます。これは、音量への任意の変更が失われることを意味します。これを有効にすると、アプリケーションが同じデバイスを再オープンすることを試みるとき、考えられる混乱を犠牲にして、音量を保存します。
hw.snd.vpc_mixer_bypass
推奨される VPC 機能を使用する方法は、アプリケーションが次の正しい ioctl() を使用することを教えることです: SNDCTL_DSP_GETPLAYVOL, SNDCTL_DSP_SETPLAYVOL, SNDCTL_DSP_SETRECVOL, SNDCTL_DSP_SETRECVOL。しかしながら、これは、常に利用可能ではありません。これを有効にすることによって、アプリケーションは、それら自体のチャネル音量を制御するために、それら自体の既存のミキサロジックを使用できるます。
hw.snd.vpc_reset
すべてのチャネル音量を 0db のデフォルト値に戻すように復旧するために有効にします。
dev.pcm.%d.bitperfect
bitperfect モードを有効にするか、または無効にします。有効にされると、チャネルは、チャネルマトリクス化、レート変換と均等化ようなすべての dsp 処理をスキップします。純粋な sound ストリームは、直接ハードウェアにフィードされます。 VCHAN が有効にされるなら、bitperfect モードは、決定的な形式/レートターゲットとして VCHAN 形式/レートを使用します。推奨された bitperfect モードを使用する方法は、 VCHAN を無効にして、この sysctl を有効にすることです。デフォルトは、無効です。
dev.pcm.%d.[play|rec].vchans
デバイス毎に割り付けられた VCHAN の現在の番号。 VCHAN の特定の値を前もって割り付けるために、これを設定することができます。この値を“0”に設定すると、このデバイスのために VCHAN を無効にします。
dev.pcm.%d.[play|rec].vchanformat
VCHAN ミキシングのための形式。すべての再生パスは、ミキシングプロセスが始まる前に、この形式に変換されます。デフォルトで、2 つのチャネルだけが有効にされます。利用可能なオプションは、次の通りです:
s16le:1.0
モノラル。
s16le:2.0
ステレオ, 2 チャネル (左, 右)。
s16le:2.1
3 チャネル (左, 右, LFE)。
s16le:3.0
3 チャネル (左, 右, 背面中央)。
s16le:4.0
Quadraphonic, 4 チャネル (前面/背面左と右)。
s16le:4.1
5 チャネル (4.0 + LFE)。
s16le:5.0
5 チャネル (4.0 + 中央)。
s16le:5.1
6 チャネル (4.0 + 中央 + LFE)。
s16le:6.0
6 チャネル (4.0 + 前面/背面中央)。
s16le:6.1
7 チャネル (6.0 + LFE)。
s16le:7.1
8 チャネル (4.0 + 中央 + LFE + 左と右側)。
dev.pcm.%d.[play|rec].vchanmode
VCHAN 形式/レート選択。利用可能なオプションは、次の通りです:
fixed
チャネルミキシングは、固定形式/レートを使用して行われます。デジタルパススルーのような高度な操作は、動作しません。“legacy”モードであるとみなすことができます。これは、デジタル形式のサポートを欠いているハードウェアチャネルのためのデフォルトモードです。
passthrough
チャネルミキシングは、固定形式/レートを使用して行われますが、デジタルパススルーのような高度な操作も動作します。すべてのチャネルは、デジタル形式再生が要求されるまで、通常の通りの音を発生させます。これが起こるとき、他のすべてのチャネルは、音を消され、最新の着信デジタル形式は、乱されなくてパススルーすることができます。複数の並列デジタルストリームは、サポートされますが、最新のストリームは、優先して、他のすべてのストリームの音を消します。
adaptive
“passthrough”モードのように動作しますが、特に異なった形式/レートで複数の sound チャネルで、すこしスマートです。新しいチャネルがいまから始まるとき、仮想のチャネルの全体のリストは、スキャンされ、最適な形式/レート (通常、最も高い/最も大きい) があるチャネルが、選択されます。これは、最も良いチャネルによって決まるミキシング品質を確実にします。下側 (downside) は、厄介なポップまたはクリックを引き起こすかもしれない、再開される必要があるハードウェア DMA モードです。
dev.pcm.%d.[play|rec].vchanrate
VCHAN ミキシング (mixing) のためのサンプルレート速度。すべての再生パスは、ミキシングのプロセスが始まる前にこのサンプルレートに変換されます。
dev.pcm.%d.polling
実験的なポーリングモードは、 callout(9) メカニズムを使用してそれぞれのチック (tick) でデバイス状態について問い合わせることによってドライバが動作するところで、サポートします。デフォルトで無効にされ、現在いくつかのデバイスドライバでのみ利用可能です。

録音チャネル

1 つ以上の録音ソース (すなわち: マイクとライン) があるデバイスで、対応する /dev/dsp%d.r%d デバイスがあります。特定デバイスから録音を開始して停止するために、 mixer(8) ユーティリティを使用することができます。

統計値

チャネル統計値は、デバイスがオープンされている間のみ保存されています。したがって、オーバランとアンダランに伴って生じる状況で、出力を考慮しますが、誤ったアプリケーションは、オープンされ実行されます。

IOCTL サポート

ドライバは、 OSS ioctl() 関数の大部分をサポートします、そして、ほとんどのアプリケーションは、変更せずに動作します。メモリマップ再生は、FreeBSD と Linux エミュレーションでサポートされますが、いくつかの違いが存在しています。メモリマップ録音は、 VM システム設計のせいではありません。結果として、いくつかのアプリケーションは、わずかに変更されたオーディオモジュールで再コンパイルされる必要があるかもしれません。サポートしている ioctl() 関数の全リストについては、 < sys/soundcard.h> 参照してください。

関連ファイル

sound ドライバは、次のデバイスノードを作成します:

/dev/audio%d.%d
Sparc 互換オーディオデバイス。
/dev/dsp%d.%d
デジタル化した音声デバイス。
/dev/dspW%d.%d
/dev/dsp と同様ですが、サンプル毎り 16 ビットです。
/dev/dsp%d.p%d
再生チャネル。
/dev/dsp%d.r%d
録音チャネル。
/dev/dsp%d.vp%d
仮想再生チャネル。
/dev/dsp%d.vr%d
仮想録音チャネル。
/dev/sndstat
すべてのチャネルとドライバを含む現在の sound 状態。

デバイスノードの最初の番号は、 sound デバイスのユニット番号を表します。すべての sound デバイスは、 /dev/sndstat にリストされています。追加メッセージは、デバイスをプローブしアタッチするとき、時々記録され、これらのメッセージは、 dmesg(8) ユーティリティで見ることができます。

上記のデバイスノードは、動的な devfs(5) クローンハンドラを通してオンデマンドでのみ作成されます。ユーザは、それらを直接アクセスしないようにすことを強く勧めます。特定のサウンドカードアクセスについては、代わりに /dev/dsp または /dev/dsp%d を使用してください。

使用例

(例えば、使用する正しいドライバが明確でないなら) すぐに、すべての sound ブリッジデバイスドライバをロードするためには、サウンドメタドライバ (metadriver) を使用します:

kldload snd_driver

特定のブリッジデバイスドライバをロードします、この場合 Intel High Definition Audio ドライバ:

kldload snd_hda

すべての検出された sound デバイスの状態をチェックします:

cat /dev/sndstat

デフォルトのサウンドデバイスを変更します、この場合 2 番目のデバイスに変更。利用可能な複数の sound デバイスがあるなら、これは、便利です:

sysctl hw.snd.default_unit=1

診断

pcm%d:play:%d:dsp%d.p%d: play interrupt timeout, channel dead
ハードウェアは、入って来る (再生) または出て行く (録音) データに役に立つ割り込みを発生させません。
unsupported subdevice XX
デバイスノードが、適切に作成されていません。

歴史

sound デバイスドライバは、 Luigi Rizzo によって書かれた pcm として FreeBSD 2.2.6 ではじめて登場しました。それは、後に Cameron Grant によって FreeBSD 4.0 で書き直されました。 API は、後に OSS 規格になった VOXWARE 規格から発展しました。

作者

Luigi Rizzo <luigi@iet.unipi.it>は、最初に pcm デバイスドライバとこのマニュアルページを書きました。 Cameron Grant <gandalf@vilnya.demon.co.uk>は、後に FreeBSD 4.0 のためにデバイスドライバを改訂しました。 Seigo Tanimura <tanimura@r.dl.itc.u-tokyo.ac.jp>は、このマニュアルページを改訂しました。次に、それは、 FreeBSD 5.2 のために書き直されました。

バグ

利用者のサウンドカードのいくつかの機能 (例えば、全体の音量の制御) は、すべてのデバイスでサポートされないかもしれません。
March 22, 2012 FreeBSD