8.2. サウンドカードの設定

寄稿: Moore Moses [FAMILY Given].
再構成: Fonvieille Marc [FAMILY Given].

8.2.1. システムを設定する

設定をはじめる前に、サウンドカードのモデル、 そのカードが使用しているチップを確認してください。 FreeBSD は サウンドカードに幅広く対応しています。 使用しているカードが対応しているかどうか、 どの FreeBSD ドライバを使うかについて、 ハードウェアノート の対応オーディオデバイスの一覧を確認してください。

サウンドデバイスを使うためには、 適切なデバイスドライバを読み込まなければいけません。 これには二つの方法のどちらかでできるでしょう。 もっとも簡単な方法は kldload(8) を使ってサウンドカードのカーネルモジュールを読み込むことです。 次の例は、Creative SoundBlaster® Live! サウンドカードのドライバを読み込む例です。

# kldload snd_emu10k1

このドライバを起動時に読み込むように設定するためには、 /boot/loader.conf にドライバを追加してください。 このドライバの場合は以下の行になります。

snd_emu10k1_load="YES"

他に利用可能な読み込み可能なサウンドモジュールは /boot/defaults/loader.conf に記載されています。 どのドライバを利用すればいいか確かでなければ、 snd_driver モジュールを読み込んでみてください。

# kldload snd_driver

snd_driver モジュールは、 一般に使用されるカードに対応したドライバをまとめて一度に読み込むメタドライバです。 このドライバを使用すれば、速やかに正しいドライバを探し出すことができます。 /boot/loader.conf ファイルを使用して、 すべてのサウンドドライバを読み込むこともできます。

snd_driver メタドライバの読み込み後に、 どのドライバがサウンドカードに選択されたのかを知るには、 cat /dev/sndstat と入力してください。

サウンドカードのドライバをカーネルへ静的に組み込むには、 次の節の手順に従ってください。 カーネル再構築の詳細は 9章FreeBSD カーネルのコンフィグレーション を参照してください。

8.2.1.1. サウンドに対応したカスタムカーネルを設定する

サウンドに対応したカスタムカーネルを使うときには、 オーディオフレームワークドライバをカーネルコンフィグレーションファイルに追加してください。

device sound

次に、サウンドカードに対応したドライバを追加します。 それには、どのドライバがカードに対応しているかを知る必要があります。 前節の Creative SoundBlaster® Live! サウンドカードの例では、 カスタムカーネルコンフィグレーションファイルに以下の行を追加してください。

device snd_emu10k1

ドライバのマニュアルページを読んで、 追加すべき構文を調べてください。 対応しているすべてのサウンドドライバに関するカーネルコンフィグレーションの具体的な構文は、 /usr/src/sys/conf/NOTES にもあります。

PnP 非対応の ISA サウンドカードでは、 IRQ および I/O ポートの設定を /boot/device.hints  に指定する必要があるかもしれません。 システムの起動時に、loader(8) はこのファイルを読み、設定情報をカーネルに渡します。 たとえば、PnP 非対応の古い Creative SoundBlaster® 16 (ISA 接続) には snd_sb16 とともに snd_sbc(4) ドライバを使用します。 このカードを使用する場合には、 カーネルコンフィグレーションファイルに以下の行を追加してください。

device snd_sbc
device snd_sb16

もしカードが 0x220 I/O port と IRQ 5 を使用している場合には、 /boot/device.hints に以下の行を追加してください。

hint.sbc.0.at="isa"
hint.sbc.0.port="0x220"
hint.sbc.0.irq="5"
hint.sbc.0.drq="1"
hint.sbc.0.flags="0x15"

この例では、 I/O ポートに 0x220 を、 IRQ に 5 を使用します。

/boot/device.hints に用いるべき構文は、sound(4) および、 サウンドカードの各ドライバのマニュアルページに記載されています。

これまでの設定はデフォルトのものです。 カードを使用する状況によっては、 IRQ やその他の設定を変更する必要があるかもしれません。 このカードについての詳細は、 snd_sbc(4) をご覧ください。

8.2.2. サウンドカードのテスト

カスタムカーネルで再起動するか、必要となるモジュールを読み込むと、 システムのメッセージバッファにサウンドカードが認識されたことが示されます。 dmesg(8)を実行して、次のようなメッセージを探してください。

pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0
pcm0: [GIANT-LOCKED]
pcm0: <Cirrus Logic CS4205 AC97 Codec>

サウンドカードの状態は、 以下のコマンドを使用して確認することもできます。

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm)
Installed devices:
pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384
kld snd_ich (1p/2r/0v channels duplex default)

この出力はシステムによって異なります。 pcm デバイスがなければ、 カーネルコンフィグレーションファイルを見直して、 正しいデバイスドライバを選択しているかどうか確認してください。 トラブルシューティングは 「よくある問題」 を参照してください。

すべてうまくいけば、サウンドカードが FreeBSD で機能するでしょう。 CD-ROM または DVD-ROM ドライブのオーディオ出力端子がサウンドカードと適切に接続されていれば、 cdcontrol(1) を使ってドライブ内のオーディオ CD を再生できます。

% cdcontrol -f /dev/acd0 play 1

audio/workman のように、 よりよいインタフェースを提供するさまざまなアプリケーションがあります。 audio/mpg123 port をインストールして MP3 オーディオファイルを聞くことができます。

手っ取り早くカードをテストするには、 /dev/dsp デバイスにデータを送ってみてください。

% cat filename > /dev/dsp

ここで filename はどんなファイルでも構いません。 このコマンドラインを実行すると雑音が発生するはずです。 これにより、サウンドカードが実際に動作していることを確認できます。

注記:

/dev/dsp* デバイスノードは、 必要に応じて自動的に作成されます。 デバイスノードが使用されていない場合には存在せず、 ls(1) の出力に表示されません。

サウンドカードのミキサレベルは mixer(8) コマンドで変更できます。 詳細は mixer(8) をご覧ください。

8.2.2.1. よくある問題

エラー解決方法
sb_dspwr(XX) timed out

使用する I/O ポートが適切に設定されていません。

bad irq XX

使用する IRQ が正しく設定されていません。 サウンドカードの IRQ と設定した IRQ が同じかどうか確かめてください。

xxx: gus pcm not attached, out of memory

デバイスを使用するのに十分なメモリを確保できません。

xxx: can't open /dev/dsp!

fstat | grep dsp を使って、 他のアプリケーションがデバイスを使用しているか調べてください。 注目すべきトラブルメーカは esoundKDE のサウンド機能です。

最近のグラフィックカードの中には、 HDMI や類似のインタフェースを利用するため、 グラフィックカード自身がサウンドカードを持つものがあります。 このようなサウンドデバイスには、 時としてサウンドカードより若い番号が付けられることがあり、 そのような場合には、 サウンドカードをデフォルトプレイバックデバイスとして利用できません。 このことが原因かどうかを確認するには、dmesg を実行して pcm を探してください。 以下のような出力を得るかもしれません。

...
hdac0: HDA Driver Revision: 20100226_0142
hdac1: HDA Driver Revision: 20100226_0142
hdac0: HDA Codec #0: NVidia (Unknown)
hdac0: HDA Codec #1: NVidia (Unknown)
hdac0: HDA Codec #2: NVidia (Unknown)
hdac0: HDA Codec #3: NVidia (Unknown)
pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0
pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0
pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0
pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0
hdac1: HDA Codec #2: Realtek ALC889
pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1
pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1
pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1
pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1
...

ここで、グラフィックカード (NVidia) には、サウンドカード (Realtek ALC889) より若い番号が付けられています。 サウンドカードをデフォルトのプレイバックデバイスとして利用するには、 hw.snd.default_unit をプレイバックで使用するユニット番号に変更してください。

# sysctl hw.snd.default_unit=n

ここで、n は使用するサウンドデバイスの番号です。 この例では 4 です。 /etc/sysctl.conf に以下の行を入れると、 設定の変更が常に反映されるようになります。

hw.snd.default_unit=4

8.2.3. 複数音源の利用

寄稿: Chopra Munish [FAMILY Given].

同時に再生することのできる音源を複数実装していることは、 多くの場合望ましいことです。 FreeBSD では、仮想サウンドチャネル を使ってこれを実現でき、sysctl(8) で設定できます。 仮想チャネルはカーネル内でサウンドを合成することにより、 サウンドカードの再生を多重化することができます。

仮想チャネルの数を決めるのに三つの sysctl 変数を設定できます。

# sysctl dev.pcm.0.play.vchans=4
# sysctl dev.pcm.0.rec.vchans=4
# sysctl hw.snd.maxautovchans=4

上記の例では四つの仮想チャネルを設定しています。 これは通常利用する上で十分実用的な数です。 dev.pcm.0.play.vchans=4dev.pcm.0.rec.vchans=4 は、 pcm0 が再生や録音のために持っている仮想チャネルの数で、 デバイスが取り付けられた後で設定できます。 hw.snd.maxautovchans は、 kldload(8) を用いて認識された新しいデバイスの仮想チャネル数です。 pcm モジュールはハードウェアドライバとは独立して読み込むことができるので、 hw.snd.maxautovchans は、デバイスが取り付けられた時に、 デバイスに与えられる仮想チャネルの数を表しています。 より詳細な情報については pcm(4) を参照してください。

注記:

デバイスを使用しているときに仮想チャンネルの数を変更することはできません。 まず、ミュージックプレーヤやサウンドデーモンといった デバイスを使用しているすべてのプログラムを終了してください。

/dev/dsp0 を必要とするプログラムが意識しなくても、 適切な pcm デバイスが自動的に設定されます。

8.2.4. ミキサチャネルの初期値を設定する

寄稿: El-Rayes Josef [FAMILY Given].

各ミキサチャネルの初期値は pcm(4) ドライバのソースにハードコーディングされています。 起動時に記録されていた値をミキサに設定する さまざまなアプリケーションやデーモンがありますが、 あまりよい解決方法ではありません。 以下の例のように、適切な値を /boot/device.hints ファイルに記述することによって、 ドライバレベルでミキサの初期値を設定することができます。

hint.pcm.0.vol="50"

この例では、pcm(4) が読み込まれたと同時に、 ボリュームチャネルの初期値を 50 に設定します。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。