link もっと前
   2013年 9月 20日 -
      2013年 9月 11日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

2013年 9月 20日

link permalink

link 編集する

ALSA その 4

その 1その 2その 3その 4その 5

前回、aplay にて WAV ファイルの再生に成功するところまできました。今回は音量の設定方法のご紹介です。

再生は成功しているのに音が出ない!という方も居られるかと思います。原因として、音量が 0 になっているか、消音(ミュート)されている、ことが考えられます。

音量の設定

前回と同様に、サウンドカードの構成は下記の図の通りです。以降の章はこの構成を使って説明していきます。


図1: Intel HD Audio のデバイス構成

音量を確認、変更するには alsamixer を使用します。

起動方法は alsamixer -D hw:0 です。-D はデバイス名を指定するオプションで、-D hw:0 でサウンドカード 0 の設定を行ってくれ、という意味になります。別のサウンドカードの設定をする場合は hw:0 を hw:1 なり 2 なりに適宜変更すれば良いです。


図2: alsamixer -D hw:0 の画面

ひとまず全てのボリュームを 0 にして、全てのミュートを解除し、左端のボリュームから上げていけば、どこかを上げた段階で音が聞こえるようになると思います。

ボリュームを最大にしてミュート解除すると、突然、馬鹿でかい音が鳴って耳がおかしくなるかもしれませんので、ご注意を…。

なおボリューム調整はカーソルの上下キーで、ミュートの設定・解除は M キーです。音量ゲージの下にある 2つの文字が MM ならミュートされていますので、M キーを押して OO に変えてください。

操作方法がわからなければ、H キーを押してヘルプを参考にして下さい。

[編集者: すずき]
[更新: 2018年 4月 1日 10:56]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2013年 9月 19日

link permalink

link 編集する

模様替え

デザインを変えました。もういい加減、対応していないブラウザは無いだろうと思い CSS level 3 に手を出してみました。

CSS 3 とは言っても、使った要素は border-radius(枠線の角を丸める)と、linear-gradient(グラデーション)くらい。

最近の流行はどちらかというと、脱!角丸!って感じがしますが、時代に逆行して角丸を増やしまくりました。あまり増やすと見づらいのでこれくらいにしておきます。

[編集者: すずき]
[更新: 2013年 9月 20日 00:36]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2013年 9月 13日

link permalink

link 編集する

ALSA その 3

その 1その 2その 3その 4その 5

では、実際に ALSA で音声を鳴らしてみましょう。

私の使用しているマシンにはオンボードのサウンドカードとして Intel HD Audio が搭載されており、デバイスは図 1 のように構成されています。

今回使用する ALSA PCM デバイスの一覧
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


図 1: Intel HD Audio のデバイス構成

以降の章はこの構成を使って説明していきます。

ALSA のデバイス名

適当な WAV ファイルを用意して、aplay コマンド(※1)で鳴らしてみましょう。使い方は下記の通り。

(※1)もしお使いの環境に aplay コマンドがインストールされていなければ apt-get install alsa-utils など(Debian)でインストールしてください。

ALSA で PCM を再生(成功例)
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 参照)ため、指定するとエラーになります。

ALSA で PCM を再生(失敗例)
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 の正体

先の例で再生デバイスに hw:0,2 を指定したとき「そのようなファイルやディレクトリはありません」というエラーメッセージが出ました。そもそも aplay は何の「ファイル」がない、と怒っているのでしょうか?

実は ALSA は hw:0,2 といったデバイス名を受け取ったとき、対応する /dev/snd ディレクトリ以下のデバイスファイルを開いていて、目的となる「デバイスファイルがない」と怒っているのです。

ALSA デバイスファイル

ALSA のデバイスファイルは /dev/snd ディレクトリにあります。ひとまず /dev/snd 以下を ls してみましょう。

ALSA のデバイスファイル一覧
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 で始まる名前のファイルです。

ALSA PCM デバイスファイル

PCM 再生、録音のデバイスファイル名は 4つの部分に分かれていて、それぞれ命名にルールがあります。たとえば pcmC0D0p を例にとって分解してみましょう。

pcm
PCM のデバイスであることを意味します。どのデバイスファイルでも pcm です。
C0
サウンドカード番号 0 を意味します。カード 1 なら C1 となります。
D0
デバイス番号 0 を意味します。デバイス 2 なら D2 となります。
p
PCM の再生能力があることを意味します。録音能力の場合は c となります。

先ほど 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 のデバイスファイルは全てキャラクタデバイスなので調べる必要はありません。

メジャー番号
Linux 内で有効な、各ドライバが持っている ID のようなものです。/proc/devices を見ると各ドライバがどの番号を使っているかわかります。
マイナー番号
各ドライバ内で有効です。ドライバが制御対象にしているデバイスなどが持つ ID のようなものです。ドライバが変わるとマイナー番号の意味も変わります。
ALSA のマイナー番号は ALSA が管理しているデバイスと 1対 1にひも付いていて、/proc/asound/devices を見ると各デバイスがどの番号を使っているかわかります。

まずはメジャー番号を探しましょう。

メジャー番号の一覧
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番が割り当てられているようです。次にマイナー番号を探します。

ALSA のマイナー番号の一覧
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

一覧の左端の数字がマイナー番号です。なお、他の部分の意味は下記の通りです。

ALSA のマイナー番号の調べ方
  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, ... と振っていく、マイナー番号を動的に割り当てるコンフィグが主流だと思われます。自動的にデバイスファイルを作成してくれるような環境であれば、マイナー番号を動的に割り当てても不自由はないでしょう。

ALSA のマイナー番号の動的割り当てコンフィグ
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 にデバイス名をパースする仕組みが書いてあります。

この仕組みは一見の価値有りだと思いますが、この仕組みを解説しても誰得?感が満載なので、申し訳ないですが、今後も特に説明する予定はありません。ご勘弁。

[編集者: すずき]
[更新: 2018年 4月 1日 10:55]

コメント一覧

  • hdk 
    hw:0,0 といった表記が実は libasound によって /usr/share/alsa/alsa.conf にある定義に従って解釈されていると知った時は ALSA の奥深さにビビりました。出力先の指定を変えるだけで、周波数変換や、ファイル出力、複数プロセスの出力の合成などもできるというもので、よくできています。 
    (2013年09月15日 00:44:18)
  • すずき 
    >hdkさん
    はい、ご指摘の通り可変なのですが…。
    そこまでいじっているシステムは見たことないし、そんな説明しても誰得?って感じがするので今回のような説明に留めています。 
    (2013年09月15日 00:52:26)
  • hdk 
    デスクトップ用途だと、デフォルトの出力先を変えようとかいう時に、alsa.conf あるいは .asoundrc を書かないといけなくなって、そのへんの知識が必要になったりしますね。HDMI 出力は周波数の選択肢が少なくて、単純に hw: で指定すると周波数が一致しないと再生できないとか、そういうこともありました。 
    (2013年09月15日 01:06:47)
  • すずき 
    .asoundrc を書く場合も hw:0,0 という書き方は変えないと思います。hwの意味を変えたり、名前を iw とか jw にしても嬉しくないし…。
    組み込み SoC のドライバを見ていたら、周波数が 1通りで固定なんてのもありました。こういうときに plug は便利ですね。 
    (2013年09月15日 01:29:59)
  • amakko 
    二枚デバイスが有り、デバイス名「hw:x.y」の指定が良く分かりませんでしたが、ここですっきり理解出来ました。助かりました。 
    (2018年05月09日 22:57:59)
  • すずき 
    コメントありがとうございます、お役に立ててよかったです。 
    (2018年05月10日 09:32:36)
open/close この記事にコメントする



2013年 9月 12日

link permalink

link 編集する

ALSA その 2

その 1その 2その 3その 4その 5

ALSA を使う準備ができたので早速、音を鳴らしたいところですが、その前に ALSA の「サウンドカード」と「デバイス」の概念について簡単に説明したいと思います。

ALSA のサウンドカード

下記のように PCM の入力、出力を複数備えたサウンドカードが 2枚刺さっているコンピュータがあるとします。


図 1: システムの例

このとき ALSA のカード一覧を見ると下記のように、2つ検出されるはずです。以降、1枚目の AAAAA 社製カードを「サウンドカード 0」、2枚目の BBBBB 社製カードを「サウンドカード 1」と呼びます。

ALSA カードの一覧取得、例
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 の再生(出力)
  • PCM の録音(入力)
  • MIDI の再生
  • ハードウェア固有機能

今回はこれらの能力のうち、PCM の再生、録音にのみ触れます。

ALSA のデバイス

図1 に示した例だと、デジタル入出力のデバイスと、アナログ入出力のデバイスに別れて、ALSA は下記の図2 のようにデバイスを認識するでしょう(※1)。

(※1)なおデバイスの番号付けはドライバ(ハードウェア依存処理)の作りによって違うため、同じデバイス数のハードウェアでも、必ずこの順番になるわけではありません。


図 2: ALSA のカードとデバイスの構成例

図2 の右側「デバイスファイル」とか「snd_pcm_open() の引数」の部分は、また後で説明しますので気にしないで下さい。

今回、大事なことは、サウンドカード 0 として、

  • PCM を再生しデジタルで出力する能力と、PCM をデジタルで入力し録音する 2つの能力を持ったデバイス 0
  • PCM を再生しアナログで出力する能力のみを持ったデバイス 1

2つのデバイスが ALSA に認識され、

サウンドカード 1 として、

  • PCM をアナログで入力し録音する能力を持ったデバイス 0
  • PCM を再生しデジタルで出力する能力のみを持ったデバイス 1

2つのデバイスが ALSA に認識された、ということです。

お使いのコンピュータで ALSA が認識した PCM 再生、録音デバイスの一覧を確かめるには、/proc/asound/pcm を見て下さい。

ALSA 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 再生については詳しくないので知りません…。

[編集者: すずき]
[更新: 2018年 4月 1日 10:55]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2013年 9月 20日 -
      2013年 9月 11日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 10/18 04:44

カレンダー

<2013>
<<<09>>>
1234567
891011121314
15161718192021
22232425262728
2930-----

最近のコメント 5件

  • link 20年09月10日
    すずき 「追加情報。最新の Debian Test...」
    (更新:10/07 16:48)
  • link 20年09月20日
    hdk 「最近は音楽聞く時やビデオ視聴時はミニコン...」
    (更新:09/24 21:43)
  • link 20年09月20日
    すずき 「ありゃー、同じ壊れ方ですね。\n新たなヘ...」
    (更新:09/24 00:23)
  • link 20年09月20日
    hdk 「うちのATH-AD300もやはり頭にプラ...」
    (更新:09/23 12:26)
  • link 20年07月10日
    すずき 「鳥のゲームは知りませんでした。色々やって...」
    (更新:08/11 18:59)

最近の記事 3件

link もっとみる
  • link 20年02月22日
    すずき 「[Zephyr を調べる - まとめリンク] 日記が増えすぎて、一...」
    (更新:10/18 04:44)
  • link 20年10月18日
    すずき 「[Zephyr OS で遊ぼう その 27 - SMP 対応、] ...」
    (更新:10/18 04:43)
  • link 20年10月17日
    すずき 「[Zephyr OS で遊ぼう その 26 - SMP 対応、] ...」
    (更新:10/18 03:24)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報