目次: ALSA
突然ですが、ALSAについて何回か書こうと思います。仕事で使ったのがきっかけで、ここ最近ALSAを家でいろいろ調べていたのです。
せっかく調べたので、いつか忘れたときに見直せたら便利であろう情報、つまづいたポイント、などをまとめておこうと思います。
ALSAとはAdvanced Linux Sound Architectureの略で、Linux 2.6から採用されたLinuxのサウンドシステムです。それ以前はOSS(Open Sound System)というサウンドシステムが採用されていました。が、OSSをこれから使う人はいないし、解説できるほど詳しくもないので無視します。
サウンドシステムって何かというと、基本はLPCM(Linear Pulse Code Modulation)音声データを再生、もしくは録音するための仕組みです。LPCM音声データは、圧縮されていない音声データと思っていただければ差し支えないと思います。
実はLPCMの再生だけではなく、シーケンスデータであるMIDIの再生もでき、この点がOSSとの大きな違いだったりしますが、そちらは良く知りませんもので、華麗にスルーします。
後でまた説明しますが、ALSAは大きく4つの部分に分けられます。
具体的にどのファイルなの?というと環境の差などによって違いますが、あえて細かい点は無視してざっくり言うと下記のようになります。
LPCMの流れとしては、おおまかには、
ALSAを使うアプリケーション
→ ALSAライブラリ(libasound.so)
→ ALSAプラグイン(libasound.soなど)
→ ALSAドライバ共通処理(snd.koなど)
→ ALSAドライバハードウェア依存処理(snd-hda-codec-xxxx.koなど)
→ サウンドカード
となります。
FedoraやDebianなどの一般的なPC向けディストリビューションを使っていれば、この章以降の作業はおそらく自動的に行われており、既にALSAが使える状態になっているはずです。
トラブルシューティング、特殊な(組み込み向けとか)環境、中身に興味がある、などなど、そんな方はご一読ください。特に興味がなければ無視して構いませんので、次の記事(そのうち掲載予定)へどうぞ。
説明はこれくらいにして、自分のLinux PCでALSAドライバが使えるか?を確かめてみましょう。下記のコマンドを打つと、ALSAドライバ(共通処理部分)のバージョンが取得できます。
katsuhiro@falcon:~$ cat /proc/asound/version Advanced Linux Sound Architecture Driver Version 1.0.25.
そんなファイルはありません!と言われたら、ALSAドライバのロードが必要です。
falcon:~# lsmod | grep snd (何も表示されない) falcon:~# modprobe snd falcon:~# lsmod | grep snd snd_seq 39243 0 snd_timer 14562 1 snd_seq snd_seq_device 4013 1 snd_seq snd 40302 3 snd_timer,snd_seq,snd_seq_device (↑ドライバがロードされた)
もしそれでも怒られる場合は、お使いのLinuxカーネルがALSAを使う構成になっていないと思われます。ALSAを使うにはLinuxカーネルのコンフィグを変更してビルドしなおす必要があるでしょう。
どのコンフィグを有効にすべきかは、使っているサウンドカードによりますが、例えばIntelの内蔵サウンドチップであれば、下記のコンフィグを有効にすることになると思います。
falcon:~# cd /usr/src/linux falcon:/usr/src/linux# make menuconfig Device Drivers ---> <*> Sound card support ---> <M> Advanced Linux Sound Architecture ---> [*] PCI sound devices ---> <M> Intel HD Audio ---> falcon:~# make modules AS [M] arch/x86/crypto/aes-i586-asm_32.o CC [M] arch/x86/crypto/aes_glue.o (...略...) falcon:~# make modules_install INSTALL arch/x86/crypto/aes-i586.ko INSTALL arch/x86/crypto/aesni-intel.ko (...略...)
ビルドできたでしょうか。先ほどのmodprobe sndはドライバ(共通処理)をロードしただけで、ドライバ(ハードウェア依存処理)すなわち、実際にサウンドカードを制御するドライバがロードされていませんので、このままでは音を鳴らすことができません。
ドライバ(ハードウェア依存処理)をロードするには、PCに搭載されているサウンドカードを調べて、適切なドライバをロードする必要があります。サウンドカードの調査は、カタログスペックを検索するも良し、lspciコマンドの出力結果なども参考になります。
私のPCはIntelの内蔵サウンドが搭載されているため、対応するドライバはsnd_hda_intelとなります。
falcon:~# lsmod | grep snd snd_seq 39243 0 snd_timer 14562 1 snd_seq snd_seq_device 4013 1 snd_seq snd 40302 3 snd_timer,snd_seq,snd_seq_device falcon:~# modprobe snd_hda_intel snd_hda_intel 0000:00:1b.0: irq 49 for MSI/MSI-X falcon:~# lsmod | grep snd snd_hda_codec_hdmi 20592 1 snd_hda_codec_realtek 48172 1 snd_hda_intel 18380 0 snd_hda_codec 59097 3 snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_intel snd_pcm 56936 3 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel snd_seq 39243 0 snd_timer 14562 2 snd_pcm,snd_seq snd_seq_device 4013 1 snd_seq snd 40302 8 snd_hda_codec_realtek,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_seq,snd_hda_codec,snd_hda_intel,snd_seq_device snd_page_alloc 5509 2 snd_pcm,snd_hda_intel (↑ドライバがロードされた)
もし間違って異なるドライバをロードした時は、rmmodでアンロードしましょう。
ドライバが無事ロードできたら、ALSAがサウンドカードを認識できているかどうか?を確かめます。
もし間違ったドライバをロードしている場合は、サウンドカードの一覧に何も出ない場合が多いです。今一度ドライバが合っているかどうか確かめましょう。
katsuhiro@falcon:~$ cat /proc/asound/cards 0 [Intel ]: HDA-Intel - HDA Intel HDA Intel at 0xdff00000 irq 49
例ではサウンドカードが1つ認識されています。ここまで来ればALSAを使う準備はバッチリです。
Facebookの公式サイト&公式アプリは、どこまでが未読で、どこまでが既読なのかさっぱりわからなくて使いづらい。そんなに真剣に読まなくても良いじゃない、ってメッセージなのかなあ?
Twitterもどこからどこまで読んだのかさっぱりわからないけど、読んでも読まなくてもどうでも良いことを書くのが基本なので、あまり気にならない。
メモ: 技術系?の話はFacebookから転記しておくことにした。
< | 2013 | > | ||||
<< | < | 09 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | - | - | - | - | - |
合計:
本日: