Facebook の公式サイト&公式アプリは、どこまでが未読で、どこまでが既読なのかさっぱりわからなくて使いづらい。そんなに真剣に読まなくても良いじゃない、ってメッセージなのかなあ?
Twitter もどこからどこまで読んだのかさっぱりわからないけど、読んでも読まなくてもどうでも良いことを書くのが基本なので、あまり気にならない。
メモ: 技術系?の話は Facebook から転記しておくことにした。
目次: 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 を使う準備はバッチリです。
目次: 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 で音声を鳴らしてみましょう。
私の使用しているマシンにはオンボードのサウンドカードとして 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 にデバイス名をパースする仕組みが書いてあります。
この仕組みは一見の価値有りだと思いますが、この仕組みを解説しても誰得?感が満載なので、申し訳ないですが、今後も特に説明する予定はありません。ご勘弁。
デザインを変えました。もういい加減、対応していないブラウザは無いだろうと思い CSS level 3 に手を出してみました。
CSS 3 とは言っても、使った要素は border-radius(枠線の角を丸める)と、linear-gradient(グラデーション)くらい。
最近の流行はどちらかというと、脱!角丸!って感じがしますが、時代に逆行して角丸を増やしまくりました。あまり増やすと見づらいのでこれくらいにしておきます。
目次: ALSA - まとめリンク
前回、aplay にて WAV ファイルの再生に成功するところまできました。今回は音量の設定方法のご紹介です。
再生は成功しているのに音が出ない!という方も居られるかと思います。原因として、音量が 0 になっているか、消音(ミュート)されている、ことが考えられます。
前回と同様に、サウンドカードの構成は下記の図の通りです。以降の章はこの構成を使って説明していきます。
音量を確認、変更するには alsamixer を使用します。
起動方法は alsamixer -D hw:0 です。-D はデバイス名を指定するオプションで、-D hw:0 でサウンドカード 0 の設定を行ってくれ、という意味になります。別のサウンドカードの設定をする場合は hw:0 を hw:1 なり 2 なりに適宜変更すれば良いです。
ひとまず全てのボリュームを 0 にして、全てのミュートを解除し、左端のボリュームから上げていけば、どこかを上げた段階で音が聞こえるようになると思います。
ボリュームを最大にしてミュート解除すると、突然、馬鹿でかい音が鳴って耳がおかしくなるかもしれませんので、ご注意を…。
なおボリューム調整はカーソルの上下キーで、ミュートの設定・解除は M キーです。音量ゲージの下にある 2つの文字が MM ならミュートされていますので、M キーを押して OO に変えてください。
操作方法がわからなければ、H キーを押してヘルプを参考にして下さい。
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)