FreeBSD snd_hdaマニュアル邦訳
- 公開日: 2009/05/09(土) 18:43[JST]
FreeBSDをアップグレード(ちょうど7.2-release登場の前日だったので7.2-PRERELEASE)したら、ヘッドホンが使えなくなっていたので、何とかしなきゃと思い、ググってみたのだがよくわからん。たぶん、manにいろいろ書いてあるんじゃないかと思うのだが、英語なのでぱっと見じゃよくわからん。
てことで、訳してみます。
名称
snd-hda -- Intel High Definition Audio ブリッジデバイスドライバ
書式
このドライバをコンパイルしてカーネルに組み込むには、以下の行をカーネル設定ファイルに追加する。
device sound device snd_hda
あるいは、以下の行をloader.conf(5)に追加して、ブート時にモジュールとしてこのドライバをロードする。
snd_hda_load="YES"
解説
High Definition (HD) Audioは、AC'97の後継規格としてIntelによって定められたものであり、より多くのチャンネルやより詳細なフォーマットを実現するための広い帯域、複数のロジカルなオーディオデバイスのサポート、汎用DMAチャンネルといった、様々なアドバンテージを有している。
snd_hdaドライバは、HDAバスコントローラドライバとHDAコーデックオーディオファンクションブリッジドライバを含み、汎用オーディオドライバーであるsound(4)がこのハードウェアを扱えるようにする。snd_hdaがサポートするのはオーディオ機能のみである。モデム、HDMIや他の機能はサポートされていない。
snd_hdaドライバは、Intel High Definition Audio規格のリビジョン1.0に従うハードウェアをサポートし、オーディオデバイスを操作するためにMicrosoft Universal Audio Architecture (UAA)ドラフトであるかのように振る舞おうとする。
HDA及びUAA規格によれば、システム内にあるHDAバス及びコーデックの数、オーディオの機能及びBIOSが提供する設定に応じて、snd_hdaドライバは通常複数のPCMオーディオデバイスを扱う。例えば、あるデバイスはPC背面の7.1チャンネルの出力とオーディオ入力であり、別のデバイスはPC前面の独立したヘッドセットようコネクタであり、また別のデバイスはSPDIFやHDMIオーディオの入出力である。オーディオの入出力のアサインは、device.hint(5)によって調整可能である。このドライバのverboseなブートメッセージからは、ドライバの動作及び現在のオーディオ設定に関する多くの情報が得られる。
標準のオーディオデバイスは、sound(4)に記載されているように、hw.snd.default_unit sysctlにて調整可能であり、あるいは、アプリケーションでの設定にて明示的に指定される。
起動時の設定
device.hints(5)ファイルを介して、以下の変数をブート時に設定することが可能である。
- hint.hdac.%d.config
これは、多様なオプションを設定するものである。使用可能な値は以下のとおり。 “dmapos”, “eapdinv”, “gpio0”, “gpio1”, “gpio2”,“gpio3”, “gpio4”, “gpio5”, “gpio6”, “gpio7”, “gpioflush”, “ivref”, “ivref50”, “ivref80”, “ivref100”, “fixedrate”, “forcestereo”, “ovref”, “ovref50”, “ovref80”, “ovref100”, “senseinv”, “softpcmvol”, 及び “vref”。 "nofixedrate"のように、オプションの頭に"no"をつけたものは、反対の処理をするものであり、優先的に処理される。複数のオプションはホワイトスペースとカンマにて区切られる。"GPIOs"は、システム・インテグレータが外部ミュータやアンプ等を制御するためにしばしば使用する、コーデック汎用のI/Oピンである。音が出ない、或いは音量ボリュームがうまく動かないのであれば、GPIOの設定に付いて少々学び、システムに最適な設定を見つける必要がある。"ivrefX"及び"ovrefX"オプションは、外部のマイクを動作させるために使用する電圧を制御するためのものである。
- hint.hdac.%d.msi
これは、MSI(Message Signaled Interrupts)サポートを制御するためのものである。
- hint.hdac.%d.cad%d.nid%d.config
これは、BIOSによるコーデックピン設定を上書きする。これは、'0x'で始まる32ビットの16進数値にて設定されるか、スペースで区切られた"option=value"の組み合わせにて設定される。
ピン設定は、コーデックの文法に関する、UAAドライバの主要な情報ソースである。この情報は通常、コーデックの製造業者から提供され、各システムに応じてシステム・インテグレータによって調整される。snd_hdaドライバは、ユーザがピン設定を上書きしてインテグレータのミスを修正したり、別の方法(例えば、5.1出力の代わりにステレオ出力と2つの入力を得る)でコーデックを使用できるようにする。
以下のオプションがサポートされている。
- as
アソシエーション(結合)番号。アソシエーションは、複数の独立したピンをグループ化して複合化したマルチピンデバイスを形成するために使用される。例えば、7.1出力の4つのコネクタをグループ化する、あるいは複数の入力コネクタ同一の入力デバイスの音源として扱うことができる。アソシエーション番号は0から15の間の数字である。値0は使用されないピンを意味する。値15は、独立した結合されていないピンを示す。各アソシエーションは、同一方向(in/out)のピンのみを含み、atomicallyに検出される(全てのピンが検出されるか全く検出されない)。別のPCMオーディオデバイスは、入力と出力のアソシエーションの組のそれぞれに対して生成される。
- seq
シーケンス番号。アソシエーション毎に定められた、特定のアソシエーション内のピンの順番を定めるためのユニークな番号である。シーケンス番号は、0から15の間の数字を値として設定可能である。
シーケンス番号15は、出力アソシエーションにとって特別な意味を持つ。この番号を持ち"Headphones"デバイスタイプを持つ出力ピンは、そのアソシエーションの最初のピンと同じ信号が出力される(そして、ジャック検出がサポートされていれば自動的にミュートされる)。
- device
デバイスタイプ。0から15の間の数字か、名称"Line-out"、"Speaker"、"Headphones"、"CD"、"SPDIF-out"、"Digital-out"、"Modem-line"、"Modem-handset"、"Line-in"、"AUX"、"Mic"、"Telephony"、"SPDIF-in"、"Digital-in"、"Res.E"又は"Other"を設定可能である。また、デバイスタイプによって、ピンの方向(in/out)が指定される。例えば、"CD"は入力ピンを示し、"Headphone"は出力を示す。
- conn
接続タイプ。0から3の間の数字を設定可能である。特定の名前である"Jack"、"None"、"Fixed"又は"Both"によって接続タイプを指定することもできる。接続タイプ"None"のピンは使用できない。
- ctype
コネクタ物理タイプ。0から15の間の数字を設定可能である。これは参考値であり、snd_hdaドライバはこれを無視する。
- color
コネクタの色。0から15の間の数字又は名前"Unknown"、"Black"、 "Grey"、"Blue"、"Green"、"Red"、"Orange"、 "Yellow"、"Purple"、"Pink"、"Res.A"、"Res.B"、 "Res.C"、"Res.D"、"White"、"Other"が設定可能である。 これは参考値であり、snd_hdaドライバはこれを無視する。
- loc
コネクタの実際の位置。0から63の間の数値を設定可能である。 これは参考値であり、snd_hdaドライバはこれを無視する。
- misc
様々なビット。0から15の数値を設定可能である。ビット0は特別な意味を持つ。 これは、ハードウェアにジャック検出機能が無いことを意味する。
ランタイムでの設定
上記の設定項目に加え、全てのsound(4)デバイスに対して以下のsysctl(8)変数を設定可能である。
- dev.hdac.%d.polling
この変数は、ポーリングモードを設定するものである。このモードでは、割り込みの代わりにcallout(9)によってデバイスの状態を定期的に問い合わせることによって、ドライバが動作する。ポーリングはデフォルトでは使用しないようになっている。異常な割り込み問題が発生しない限り、あるいは、デバイスが割り込みを生成しないのであれば、これを設定してはいけない。
- dev.hdac.%d.polling_interval
コントローラ/ジャックのポーリング間隔(1-1000ミリ秒)
- dev.hdac.%d.pindump
この変数を0以外の値に設定すると、現在のピン設定、主ジャック検出状態がコンソールとsyslogに出力される。
例
Realtek ALC888 HDAコーデックが実装されたHP Compaq DX2300の場合の設定例を示す。このシステムは前面に2つのオーディオコネクタが、背面に3つのオーディオコネクタがあり、スピーカを1つ内蔵している。verboseドライバ出力とコーデックのデータシートによれば、このコーデックは5つのステレオDACと2つのステレオADCを有し、これら全ては任意のコーデックピン(外部コネクタ)に割り当て可能となっている。全てのコーデックピンは、リバーシブル(入力と出力のどちらも可能)である。
したがって、この極めて一様で柔軟なコーデックにより、ピン設定に応じてドライバを様々な方法で設定可能である。ドライバは、verboseメッセージがオンになっているときは、デフォルトのピン設定を出力する。
hdac0: nid 20 0x01014020 as 2 seq 0 Line-out Jack jack 1 loc 1 color Green misc 0 hdac0: nid 21 0x99130110 as 1 seq 0 Speaker Fixed jack 3 loc 25 color Unknown misc 1 hdac0: nid 22 0x411111f0 as 15 seq 0 Speaker None jack 1 loc 1 color Black misc 1 hdac0: nid 23 0x411111f0 as 15 seq 0 Speaker None jack 1 loc 1 color Black misc 1 hdac0: nid 24 0x01a19830 as 3 seq 0 Mic Jack jack 1 loc 1 color Pink misc 8 hdac0: nid 25 0x02a1983f as 3 seq 15 Mic Jack jack 1 loc 2 color Pink misc 8 hdac0: nid 26 0x01813031 as 3 seq 1 Line-in Jack jack 1 loc 1 color Blue misc 0 hdac0: nid 27 0x0221401f as 1 seq 15 Headphones Jack jack 1 loc 2 color Green misc 0 hdac0: nid 28 0x411111f0 as 15 seq 0 Speaker None jack 1 loc 1 color Black misc 1 hdac0: nid 30 0x411111f0 as 15 seq 0 Speaker None jack 1 loc 1 color Black misc 1 hdac0: nid 31 0x411111f0 as 15 seq 0 Speaker None jack 1 loc 1 color Black misc 1
上記の出力から、ID(nid)25と27のノードがフロントパネルのコネクタ(Jack, loc 2)であり、nid 20、24、26がリアパネルのコネクタ(Jack, loc 25)であり、nid 21が内蔵スピーカ(Fixed, loc 25)であることが分かる。nid 22、23、28、30、31は接続タイプが"None"となっており、ドライバによって使用不可状態にされている。この様に、ピンの数とその内容は実際のコネクタに合致する。
アソシエーション(as)及びシーケンス(seq)フィールドの値から、ピンが3つのアソシエーションにグループ化されていることが分かる。
hdac0: Association 0 (1) out: hdac0: Pin nid=21 seq=0 hdac0: Pin nid=27 seq=15 hdac0: Association 1 (2) out: hdac0: Pin nid=20 seq=0 hdac0: Association 2 (3) in: hdac0: Pin nid=24 seq=0 hdac0: Pin nid=26 seq=1 hdac0: Pin nid=25 seq=15
pcm(4)デバイスの各々は、2つのアソシエーションを使用する。1つは再生用であり、もう一つが録音用である。処理されpcm(4)デバイスにアサインされたアソシエーションは数字の昇順で表示されている。この場合は、アソシエーション#0(1)は、pcm0デバイスの再生であり、内蔵スピーカとヘッドホンジャックが使用され、ヘッドホンジャックが使用される時はスピーカが自動的に消音となる。アソシエーション#1(2)は、pcm1の再生であり、ラインアウトジャックが使用される。アソシエーション#2(3)は、pcm0の録音であり、外部のマイクとラインインジャックが使用される。
snd_hdaドライバは、その動作ロジックを診断し又現在のコーデックの設定を表示するための拡張verboseメッセージを提供する。
device.hints(5)を使用して、既存のピンの設定を変更することができ、これにより広範囲に亙るオーディオ設定を行うことができる。以下に、この特定のハードウェアで可能ないくつかの設定例を示す。
例1
device.hintのオプションを以下のように設定する。
hint.hdac.0.cad0.nid20.config="as=1" hint.hdac.0.cad0.nid21.config="as=2"
そうすると、ラインアウトとスピーカの機能が入れ替わる。つまり、pcm0デバイスはラインアウトジャックとヘッドホンジャックから再生を行う。ラインアウトはヘッドホンジャックに接続があると消音される。pcm0での録音は2本の外部のマイクとラインインジャックから行われる。pcm1の再生は内蔵スピーカから行われる。
例2
device.hint(5)のオプションを以下のように設定する。
hint.hdac.0.cad0.nid20.config="as=1 seq=15 device=Headphones" hint.hdac.0.cad0.nid27.config="as=2 seq=0" hint.hdac.0.cad0.nid25.config="as=4 seq=0"
そうすると、ヘッドホンと一方のマイクが独立したデバイスとなる。pcm0デバイスは内蔵スピーカとラインアウトジャックから再生を行い、ラインアウトジャックに接続があるとスピーカは自動的に消音される。pcm0の録音は外部のマイクの一方とラインインジャックから行われる。pcm1デバイスは、前面のコネクタに接続されたヘッドセット(ヘッドホンとマイク)用に使用される。
例3
device.hints(5)のオプションを以下のように設定する。
hint.hdac.0.cad0.nid20.config="as=1 seq=0" hint.hdac.0.cad0.nid26.config="as=2 seq=0" hint.hdac.0.cad0.nid27.config="as=3 seq=0" hint.hdac.0.cad0.nid25.config="as=4 seq=0" hint.hdac.0.cad0.nid24.config="as=5 seq=0 device=Line-out" hint.hdac.0.cad0.nid21.config="as=6 seq=0"
そうすると、pcm0(ラインアウトとラインイン)、pcm1(ヘッドホンとマイク)、pcm2(後部のマイクジャックに割り当てられた追加のラインアウト)、pcm3(内蔵スピーカ)の4つの独立したデバイスが利用される。
例4
device.hint(5)のオプションを以下のように設定する。
hint.hdac.0.cad0.nid20.config="as=1 seq=0" hint.hdac.0.cad0.nid24.config="as=1 seq=1 device=Line-out" hint.hdac.0.cad0.nid26.config="as=1 seq=2 device=Line-out" hint.hdac.0.cad0.nid21.config="as=2 seq=0"
そうすると、3つの後部コネクタ(ラインアウトと、再割り当てされたマイクとラインイン)からの5.1再生とヘッドセット用のpcm0と、内蔵スピーカの再生用のpcm1の2つのデバイスを使用する。ヘッドホンが後部コネクタに接続されると消音される。
ハードウェア
snd_hdaドライバは、以下のIntel HDA互換のオーディオチップセットをサポートする。
ATI SB450
ATI SB600
Intel 631x/632xESB
Intel 82801F (ICH6)
Intel 82801G (ICH7)
Intel 82801H (ICH8)
Intel 82801I (ICH9)
Intel 82801J (ICH10)
Intel US15W (SCH)
nVidia MCP51
nVidia MCP55
nVidia MCP61A
nVidia MCP61B
nVidia MCP63
nVidia MCP65A
nVidia MCP65B
nVidia MCP67A
nVidia MCP67B
nVidia MCP68
nVidia MCP69
SiS 966
VIA VT8251/8237A
以下のものと、他の多くのコーデックが動作確認されている。
Analog Devices AD1981HD
Analog Devices AD1983
Analog Devices AD1984
Analog Devices AD1986A
Analog Devices AD1988
Analog Devices AD1988B
CMedia CMI9880
Conexant CX20549 (Venice)
Conexant CX20551 (Waikiki)
Conexant CX20561 (Hermosa)
Realtek ALC260
Realtek ALC262
Realtek ALC268
Realtek ALC660
Realtek ALC861
Realtek ALC861VD
Realtek ALC880
Realtek ALC882
Realtek ALC883
Realtek ALC885
Realtek ALC888
Realtek ALC889
Sigmatel STAC9205
Sigmatel STAC9220
Sigmatel STAC9220D / 9223D
Sigmatel STAC9221
Sigmatel STAC9221D
Sigmatel STAC9227D
Sigmatel STAC9227X
Sigmatel STAC9228D
Sigmatel STAC9228X
Sigmatel STAC9229D
Sigmatel STAC9229X
Sigmatel STAC9230D
Sigmatel STAC9230X
Sigmatel STAC9271D
Sigmatel STAC9872AK
VIA VT1708
VIA VT1708B
VIA VT1709
関連項目
sound(4), snd_ich(4), device.hints(5), loader.conf(5), sysctl(8)
歴史
snd_hdaデバイスドライバはFreeBSD 6.3に初めて登場した。
作者
snd_hdaデバイスドライバは、Stephane E. Potvin<sepotvin@videotron.ca>、Ariff Abdullah <ariff@FreeBSD.org>、Alexander Motin <mav@FreeBSD.org>によって開発された。このマニュアルページは、Joel Dahl<joel@FreeBSD.org>、Alexander Motin <mav@FreeBSD.org>、Giorgos Keramidas <keramida@FreeBSD.org>によって作成された。
バグ
一部のハードウェア/OEMベンダは、BIOS設定を無視し、その結果、snd_hdaドライバが無意味なものとなり、通常は、snd_hdaドライバが組み込まれ動作しているように見えるが音の入出力ができない状態となる。この様なケースは、loader.confの変数を調整することによって解決されることがある。しかし、小の方法で問題を解決する前に、本当に問題があるかどうか、及び使用しているPCMオーディオデバイスが本当に期待されるオーディオコネクタに対応しているかどうかを確認するべきである。
OSSの制限により、マルチチャンネル(マルチデバイスではない)の再生はサポートされない。