目次: ALSA
では、実際にALSAで音声を鳴らしてみましょう。
私の使用しているマシンにはオンボードのサウンドカードとしてIntel HD Audioが搭載されており、デバイスは図1のように構成されています。
katsuhiro@falcon:~$ cat /proc/asound/pcm 00-00: ALC892 Analog : ALC892 Analog : playback 1 : capture 1 00-01: ALC892 Digital : ALC892 Digital : playback 1 00-02: ALC892 Analog : ALC892 Analog : capture 1 00-03: HDMI 0 : HDMI 0 : playback 1
以降の章はこの構成を使って説明していきます。
適当な WAVファイルを用意して、aplayコマンド(※1)で鳴らしてみましょう。使い方は下記の通り。
(※1)もしお使いの環境にaplayコマンドがインストールされていなければapt-get install alsa-utilsなど(Debian)でインストールしてください。
katsuhiro@falcon:~$ aplay -D hw:0,0 test.wav 再生中WAVE 'share/chimes.wav' : Signed 16 bit Little Endian, レート44100 Hz, ステレオ
音は聞こえたでしょうか?もしかするとどの端子からも何も聞こえないかも知れませんが、ここはひとまずエラーらしき表示が出なければ成功とします。
コマンドラインの -D hw:0,0という部分は「再生するときにサウンドカード0、デバイス0のPCM再生機能を使って下さいね」という意味です。
もしデバイス1で再生したければhw:0,1、デバイス2で再生したければhw:0,2と指定しますが、今回使用しているサウンドカードのデバイス2はPCMの再生能力を持たない(図1参照)ため、指定するとエラーになります。
katsuhiro@falcon:~$ aplay -D hw:0,2 share/chimes.wav aplay: main:682: audio open error: そのようなファイルやディレクトリはありません
みなさんがお使いの環境でPCMの再生を試したとき、上記のようなエラーが出る場合はhw:0,0以外のデバイスを試してください。
もし何も指定しなかった場合「default」というデバイスを指定したことになりますが、以降の説明ではdefaultデバイスは使いません。なぜかというと defaultがどのデバイスとひも付くかは、お使いの環境に寄って異なり、どのデバイスを使っているかわからなくなるためです。
最近のLinuxディストリビューションですとdefaultデバイスはPulseAudio(Wikipediaの PulseAudioの項参照)などのサウンドサーバとひも付いていることが多いようですが、残念ながら一概には言えません…。
先の例で再生デバイスにhw:0,2を指定したとき「そのようなファイルやディレクトリはありません」というエラーメッセージが出ました。そもそもaplayは何の「ファイル」がない、と怒っているのでしょうか?
実はALSAはhw:0,2といったデバイス名を受け取ったとき、対応する /dev/sndディレクトリ以下のデバイスファイルを開いていて、目的となる「デバイスファイルがない」と怒っているのです。
ALSAのデバイスファイルは /dev/sndディレクトリにあります。ひとまず /dev/snd以下をlsしてみましょう。
katsuhiro@falcon:~$ ls -la /dev/snd 合計0 drwxr-xr-x 3 root root 220 9月10 01:52 . drwxr-xr-x 15 root root 13400 9月10 01:52 .. crw-rw---T 1 root audio 116, 7 9月10 01:52 controlC0 crw-rw---T 1 root audio 116, 6 9月14 02:13 pcmC0D0c crw-rw---T 1 root audio 116, 5 9月14 22:26 pcmC0D0p crw-rw---T 1 root audio 116, 4 9月14 13:54 pcmC0D1p crw-rw---T 1 root audio 116, 3 9月10 01:52 pcmC0D2c crw-rw---T 1 root audio 116, 2 9月14 13:54 pcmC0D3p crw-rw---T 1 root audio 116, 1 9月10 01:52 seq crw-rw---T 1 root audio 116, 33 9月10 01:52 timer
様々なファイルがありますがPCM再生、録音に関連するのは、pcmで始まる名前のファイルです。
PCM再生、録音のデバイスファイル名は4つの部分に分かれていて、それぞれ命名にルールがあります。たとえばpcmC0D0pを例にとって分解してみましょう。
先ほどaplayにhw:0,2と指定しましたが、このときALSAはサウンドカード0、デバイス2、PCMの再生能力があるデバイスを探します。
このデバイスファイルを先ほどのデバイスファイル名の命名ルールに従って表すと「pcmC0D2p」となりますが、/dev/snd以下にはPCM録音用のpcmC0D2cはあっても、pcmC0D2pはありません。
このためALSAはaplayに対して「(デバイス)ファイルがない」とエラーを返します。aplayはそれを受けてエラーメッセージを出していたのです。
FedoraやDebianなどの一般的なPC向けLinuxディストリビューションを使っていれば、この章以降の作業はおそらく自動的に行われており、ALSAデバイスファイルが使用可能な状態になっているはずです。
トラブルシューティング、特殊な(組み込み向けとか)環境、中身に興味がある、などなど、そんな方はご一読ください。特に興味がなければ無視して構いませんので、次の記事(そのうち掲載予定)へどうぞ。
最近のLinuxディストリビューションではデバイスファイルが自動的に生成されますが、自分で生成しなければならないときはどうしたら良いでしょうか?
デバイスファイルを生成する際に必要なのは、メジャー番号、マイナー番号(※2)です。詳しい説明は別のサイトを見ていただいた方が良いと思いますが、メジャー番号とマイナー番号についてざっくり説明します。
(※2)キャラクタデバイスか、ブロックデバイスか、という情報も必要ですが、ALSAのデバイスファイルは全てキャラクタデバイスなので調べる必要はありません。
まずはメジャー番号を探しましょう。
katsuhiro@falcon:~$ cat /proc/devices Character devices: (...略...) 10 misc 13 input 14 sound 21 sg 116 alsa 128 ptm 136 pts 180 usb 189 usb_device 253 BaseRemoteCtl 254 bsg (...略...)
一覧の左端の数字がメジャー番号です。どうやら116番が割り当てられているようです。次にマイナー番号を探します。
katsuhiro@falcon:~$ cat /proc/asound/devices 1: : sequencer 2: [ 0- 3]: digital audio playback 3: [ 0- 2]: digital audio capture 4: [ 0- 1]: digital audio playback 5: [ 0- 0]: digital audio playback 6: [ 0- 0]: digital audio capture 7: [ 0] : control 33: : timer
一覧の左端の数字がマイナー番号です。なお、他の部分の意味は下記の通りです。
5: [ 0- 0]: digital audio playback ↑ ↑ ↑ ↑ ↑ ↑ ↑ PCM再生用デバイス ↑ ↑ ↑ ↑ ↑ デバイス番号0 ↑ ↑ ↑ サウンドカード番号0 ↑ マイナー番号
たとえばpcmC0D0p(サウンドカード0、デバイス0、PCM再生能力)デバイスファイルを作成する場合は、メジャー番号116、マイナー番号5のキャラクタデバイスファイルを作れば良いということです。
コマンドで書くとmknod /dev/snd/pcmC0D0p c 116 5ですね。
Linuxカーネルのコンフィグによって、ALSAデバイスとマイナー番号の関係が変わります。
最近はデバイスを検出した順番に、マイナー番号を0, 1, 2, ... と振っていく、マイナー番号を動的に割り当てるコンフィグが主流だと思われます。自動的にデバイスファイルを作成してくれるような環境であれば、マイナー番号を動的に割り当てても不自由はないでしょう。
Device Drivers ---> <*> Sound card support ---> <M> Advanced Linux Sound Architecture ---> [ ] Dynamic device file minor numbers
もし自分でデバイスファイルを作成しなければならない環境の場合、デバイスの認識順序が変わったらマイナー番号も変わってしまい、いちいちデバイスファイルを作り直さなければならないため、非常に面倒です。
動かすものは最小限にしたい、udevすら動かしたくないなど、特殊(?)な環境を使っている場合は、いっそコンフィグを無効にしてしまうのも手ですね。
ALSAのマイナー番号の動的割り当てコンフィグを無効にした場合のマイナー番号もお見せしたかったのですが、Intel HD Audioのドライバを使う場合は、マイナー番号動的割り当てコンフィグが有効でないとドライバが使用できないらしく、コンフィグを無効に出来ませんでした。
理由は調べていませんが、どうもそうなっているみたいです…。残念。
勘のいい人は、なぜデバイス名をhw:0,0と書くのか?が気になると思います。また、今後出てくる周波数変換しつつ再生するデバイス名の書き方plughw:0,0はもっと気になると思います。
つまり、hwやplughwという名前はどこから来たのか?なぜ、コロン、カンマ、カンマ、と変な区切り方をするのか、「hw:0:0」や「hw,0,0」はダメで「hw:0,0」と書かなければならない理由は何なのか?という疑問です。
この疑問に対して、私は一切説明せず「こういうもんです」としか書いていませんが、実はコメントで指摘いただいた通り /usr/share/alsa/alsa.confにデバイス名をパースする仕組みが書いてあります。
この仕組みは一見の価値有りだと思いますが、この仕組みを解説しても誰得?感が満載なので、申し訳ないですが、今後も特に説明する予定はありません。ご勘弁。
目次: ALSA
ALSAを使う準備ができたので早速、音を鳴らしたいところですが、その前にALSAの「サウンドカード」と「デバイス」の概念について簡単に説明したいと思います。
下記のようにPCMの入力、出力を複数備えたサウンドカードが2枚刺さっているコンピュータがあるとします。
このときALSAのカード一覧を見ると下記のように、2つ検出されるはずです。以降、1枚目のAAAAA社製カードを「サウンドカード0」、2枚目のBBBBB社製カードを「サウンドカード1」と呼びます。
katsuhiro@falcon:~$ cat /proc/asound/cards 0 [AAAAA ]: HDA-AAAAA - HDA AAAAA HDA AAAAA at 0xXXXX00000 irq xx 1 [BBBBB ]: HDA-BBBBB - HDA BBBBB HDA BBBBB at 0xXXXX0000 irq xx
カードにはいくつかのアナログやデジタルの入出力がついています。ALSAではこれらを「デバイス」と呼ぶようです。
デバイスは、現状 4種類の能力を持つことができます。このうち1種類の能力しか持たないデバイスもいますし、複数の能力を持つデバイスもいます。
今回はこれらの能力のうち、PCMの再生、録音にのみ触れます。
図1に示した例だと、デジタル入出力のデバイスと、アナログ入出力のデバイスに別れて、ALSAは下記の図2のようにデバイスを認識するでしょう(※1)。
(※1)なおデバイスの番号付けはドライバ(ハードウェア依存処理)の作りによって違うため、同じデバイス数のハードウェアでも、必ずこの順番になるわけではありません。
図2の右側「デバイスファイル」とか「snd_pcm_open() の引数」の部分は、また後で説明しますので気にしないで下さい。
今回、大事なことは、サウンドカード0として、
の 2つのデバイスがALSAに認識され、
サウンドカード1として、
の 2つのデバイスがALSAに認識された、ということです。
お使いのコンピュータでALSAが認識したPCM再生、録音デバイスの一覧を確かめるには、/proc/asound/pcmを見て下さい。
katsuhiro@falcon:~$ cat /proc/asound/pcm 00-00: AAAAA Digital : AAAAA Digital : playback 1 : capture 1 00-01: AAAAA Analog : AAAAA Analog : playback 1 01-00: BBBBB Analog : BBBBB Analog : capture 1 01-01: BBBBB Digital : BBBBB Digital : playback 1
一覧に出ている数字は、サウンドカードの番号 - デバイスの番号となっています。00-01であればサウンドカード0のデバイス1という意味です。
以降、サウンドカードという表記を省略することがあります。デバイス0-1のように書きますので、サウンドカード0のデバイス1なんだな、とご理解下さい。
また、PCMの再生と録音のためのデバイスをひっくるめて、PCMデバイスと表記することがあります。
デバイスの能力4種類のうち「ハードウェア依存機能」については、/proc/asound/hwdepにて一覧を見ることができます。MIDI再生については詳しくないので知りません…。
目次: 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 | - | - | - | - | - |
合計:
本日: