【Linux】ALSAの使い方

ALSA (Advanced Linux Sound Architecture) は Linux でオーディオの入出力をするときに使う定番のライブラリ群です

music_amp

ALSA構成

ALSAは従来の Open Sound System (OSS) を置き換えるために開発されたLinuxカーネルコンポーネントです。OSSがサポートしていなかったいくつかの機能をもつよう設計されています。特徴を Wikipedia から引用します。

  • ハードウェアベースのMIDI演奏
  • 複数チャンネルのハードウェアによるミキシング
  • 全二重通信
  • マルチプロセッサに対応した、スレッドセーフなデバイスドライバ

ALSAは大きく以下の2つで構成されています。

alsa-core

カーネル空間のサウンドデバイスドライバでkernelに組み込まれています。どのドライバを使うか振り分ける機能があります

alsa-library

ユーザ空間でプログラムを作る時に便利なAPI群。alsa-library は libasound2 で提供されています。

$ sudo apt-get install libasound2-dev libesd0

ALSA設定

これまで設定に使われていた alsaconf コマンドは既に廃止されています。設定ファイルは /etc/modprobe.d/alsa-base.conf で行います。

$ cd /etc/modprobe.d
$ ls
alsa-base-blacklist.conf  fbdev-blacklist.conf
alsa-base.conf          radeon-kms.conf
dkms.conf

$ cat alsa-base.conf
# autoloader aliases
install sound-slot-0 /sbin/modprobe snd-card-0
install sound-slot-1 /sbin/modprobe snd-card-1
install sound-slot-2 /sbin/modprobe snd-card-2
install sound-slot-3 /sbin/modprobe snd-card-3
install sound-slot-4 /sbin/modprobe snd-card-4
install sound-slot-5 /sbin/modprobe snd-card-5
install sound-slot-6 /sbin/modprobe snd-card-6
install sound-slot-7 /sbin/modprobe snd-card-7
# Cause optional modules to be loaded above generic modules
install snd /sbin/modprobe --ignore-install snd && { /sbin/modprobe --quiet snd-ioctl32 ; /sbin/modprobe --quiet snd-seq ; : ; }
install snd-rawmidi /sbin/modprobe --ignore-install snd-rawmidi && { /sbin/modprobe --quiet snd-seq-midi ; : ; }
install snd-emu10k1 /sbin/modprobe --ignore-install snd-emu10k1 && { /sbin/modprobe --quiet snd-emu10k1-synth ; : ; }
# Keep snd-pcsp from beeing loaded as first soundcard
options snd-pcsp index=-2
# Keep snd-usb-audio from beeing loaded as first soundcard
options snd-usb-audio index=-2
# Prevent abnormal drivers from grabbing index 0
options bt87x index=-2
options cx88_alsa index=-2
options snd-atiixp-modem index=-2
options snd-intel8x0m index=-2
options snd-via82xx-modem index=-2

aplay

ALSAの機能を簡単に試してみるには aplay コマンドが楽です。以下でインストールします。(環境はdebian 7.5)

$ sudo apt-get install alsa-utils

実行する前に version, shared-libraryのlibasound.so.2へのリンク, サウンドデバイスを確認します。

$ aplay --version
aplay: version 1.0.25 by Jaroslav Kysela 

$ ldd /usr/bin/aplay
	linux-vdso.so.1 =>  (0x00007fff83bff000)
	librt.so.1 => /lib64/librt.so.1 (0x00007ffb55ddf000)
	libasound.so.2 => /lib64/libasound.so.2 (0x00007ffb55af4000)
	libm.so.6 => /lib64/libm.so.6 (0x00007ffb557f5000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007ffb555f1000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffb553d5000)
	libc.so.6 => /lib64/libc.so.6 (0x00007ffb5502f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ffb55fef000)

$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: I82801AAICH [Intel 82801AA-ICH], デバイス 0: Intel ICH [Intel 82801AA-ICH]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

認識しているデバイスの一覧。

$ cd /dev/snd; ls -l
合計 0
drwxr-xr-x  2 root root       60  7月 28 20:47 by-path
crw-rw---T+ 1 root audio 116,  5  7月 28 20:47 controlC0
crw-rw---T+ 1 root audio 116,  4  7月 28 20:47 pcmC0D0c
crw-rw---T+ 1 root audio 116,  3  7月 28 21:43 pcmC0D0p
crw-rw---T+ 1 root audio 116,  2  7月 28 20:47 pcmC0D1c
crw-rw---T+ 1 root audio 116,  1  7月 28 20:47 seq
crw-rw---T+ 1 root audio 116, 33  7月 28 20:47 timer

サウンドカードの確認。

$ cat /proc/asound/modules
 0 snd_intel8x0
$ cat /proc/asound/cards
 0 [I82801AAICH    ]: ICH - Intel 82801AA-ICH
              Intel 82801AA-ICH with STAC9700,83,84 at irq 11

aplayはDオプションで出力先のデバイス名を指定します。以下例だとサウンドカード 0, デバイス 0 を指定。

$ aplay -D hw:0,0 sample.wav

ALSAを使ってみる

PCM出力を行うプログラムを書く時の基本的なAPIは以下です。

# ハンドルの取得
int snd_pcm_open (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode)
# サンプリング周波数、リサンプリング、出力チャネル、遅延時間等の設定を行う
int snd_pcm_set_params (snd_pcm_t *pcm, snd_pcm_format_t format, snd_pcm_access_t access, unsigned 
int channels, unsigned int rate, int soft_resample, unsigned int latency)
# データを書き込む, bufferはPCMデータへのポインタ
int snd_pcm_writei (snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
# PCMデータの吐き出し
int snd_pcm_drain (snd_pcm_t *pcm)
# ハンドルの解放
int snd_pcm_close (snd_pcm_t *pcm)

その他の関数のリファレンスはこちら

次回はALSAを使ったマルチメディアフレームワークのGStreamerについて書きます。

[1] 【RTP】Live555の使い方と解説【RTSPserver】