ALSA (Advanced Linux Sound Architecture) は Linux でオーディオの入出力をするときに使う定番のライブラリ群です
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について書きます。