【Linux】ALSAの使い方【aplay】

| 0件のコメント

Advanced Linux Sound Architecture (ALSA) は 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】

コメントを残す

Required fields are marked *.