alsamixer は TODO なんだそうな(笑)


いつもお世話になっているてんこうさんのパッケージ置き場に ALSA 0.3.1 のパッケージが置いてあるのだが、今回はそれを使わずに自分でやってみた。

もともと、ALSA の tar玉って spec ファイルのテンプレートを自前で持ってるので(って、こりゃ_tom_ さんに以前教わったんだけどさ)、それを見てパッケージを作成してブチ込んだ。

alsa-driver と alsal-utils の場合は、tar 玉を展開してできる utils というディレクトリに、それぞれ alsa-driver.spec.in とか alsa-utils.spec.in なんてのがあって、一回 make すると in が取れて、普通に使える spec ファイルになる。alsa-lib の場合は最初から alsa-lib.spec が置いてある。

中身は結局のところ、kernel のバージョンを動的に指定するためだけに spec.in から spec を作るようになっているだけで、そのまま使えた。alsa-driver.spec の先頭が

%define version  @CONFIG_SND_VERSION@
%define kversion @kversion@.@kpatchlevel@.@ksublevel@

などというようになっているので、ここを

%define version  0.3.1
%define kversion 2.2.9-ac6

としただけ。ここで、kversion に指定したものが /lib/modules/ に続くディレクトリの名前を一致してないとモジュールのロードに失敗するので、そこだけは注意だ。今回、オレは 2.2.9-ac6 を使っているのだが、普段は Alan Cox のパッチはあてないんだけど(バージョンアップのときに面倒だから)、ちょっと調べものをしている都合で ac6 だったのだ。

というわけで、ALSA ってばパッケージになってるとはいえ、どっちにしても kernel を上げたらバージョン番号に注意して spec を微調整して rpm --rebuild をカマさねばならない宿命のようだ。src.rpm になってるだけでも随分便利なんで、まぁよしとしよう。

alsa-driver の INSTALL に書いてあるとおり(読めよ〜) ソースを展開したところにある ./snddevices を実行して /dev 以下のスペシャルファイルを作っとくのを忘れないようにしよう。パッケージができたら rpm -ivh なり -Uvh なりでインストールする。

ウチで使っているのは SoundBlaster 64 Value というカードなんだけど、特に何もせずに認識しているとはいえ、AWE は今まで一度も使えたタメシがない。というか使う気もないので追ってもいないし今まで気にとめてなかったんだけど、alsa-driver-0.3.1 をインストールしたら、%post で実行される depmod -a で

/lib/modules/2.2.9-ac6/misc/snd-sbawe.o: unresolved symbol(s)
/lib/modules/2.2.9-ac6/misc/snd-sb-dsp.o: unresolved symbol(s)
/lib/modules/2.2.9-ac6/misc/snd-emu8000.o: unresolved symbol(s)
/lib/modules/2.2.9-ac6/misc/snd-audiopci.o: unresolved symbol(s)

などと言われてしまったぜ。でもまぁ sb16 そのものとして使うつもりなので、上記のエラーは無視することにした(笑) わはははは。すまん。だって。snd-sbawe.o は使わないし、dsp もオレの使うのは snd-sb16-dsp.o なんだもん。

alsa-driver を入れたら、alsa-lib をパッケージにして入れ、最後に alsa-utils も入れた。特に問題なく入ったところで、カードの設定をしなければならぬ。/etc/conf.modules に ALSA のモジュールをずらずら並べて書いてやるのだが、これがけっこう面倒くさいうえに、間違うと当然音も鳴らぬ。

だもんでオレは念のためalsaconfを使っている(ってこれも実は _tom_ さんに教わったの…)。これってば起動するとサウンドカードを選ぶところから始まって、いろいろと設定を聞いてくるのでそれに答えていくと、最終的に /etc/conf.modules に必要な設定を書き込んでくれちゃうのだ。当然 sudo するか root にならねば使えない。

これですっかり準備も整い、あとは /etc/rc.d/init.d/alsaaound start するだけなのだが、ちょっと待った。

GNOME などで esound を使っている人は、きっと ALSA ともとから入っている esound とのツジツマ合わせが必要なんだろうと思うが(オレは使ってないんで知らぬ)、/etc/conf.modules の中に "alias sound" という文字列があると、ブート時にいち〜ち sound モジュールが modprobe されてしまい(当然失敗する)うっとうしいったらありゃしないのだ。

/etc/rc.d/rc.sysinit がそ〜ゆ〜マネをしているのだが、それって極悪で

if grep -s "alias sound" /etc/conf.modules > /dev/null ; then
   action "Loading sound module" modprobe sound
fi

などとしているんだぜ。でもって、alsaconf で生成した /etc/conf.modules はオレの場合は以下のようになっている。

# --- BEGIN: Generated by ALSACONF, do not edit. ---
alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-sb16
alias sound-slot-0 snd-card-0
alias sound-service-0-3 snd-pcm1-oss
alias sound-service-0-12 snd-pcm1-oss
options snd snd_major=116 snd_cards_limit=1 snd_device_mode=0666 snd_device_gid=0 snd_device_uid=0
options snd-sb16 snd_index=1 snd_id=SB64AWE snd_port=0x220 snd_mpu_port=0x330 snd_irq=5 snd_dma8=1 snd_dma8_size=64 snd_dma16=5 snd_dma16_size=128 snd_mic_agc=1
# --- END: Generated by ALSACONF, do not edit. ---

だから思いっきりヒットしちゃうんだよなぁ。せめて grep -s "alias sound " と、sound の後に一文字の空白を入れるくらいの知恵を付けてくれ>赤帽ペンギン

あ、だもんでオレは /etc/rc.d/rc.sysinit の該当する行の grep 部を修正している。さて、いよいよ /etc/rc.d/init.d/alsasound start を実行してみよう。

alsactl: Cannot open configuration file '/etc/asound.conf'...

などと怒られなかった? だが、それがデフォルトみたいなんだよねどうも。2回目からは黙って起動するでしょ? が、これがまたワナなんだよなぁ。例によって、ALSA のミュート地獄にハマッてしまうのだ。このままでは音が出ないの。で、従来なら alsamixer で設定して一発だったんだけど、今回のバージョンでは

Toru:/usr/src/redhat$ alsamixer
TODO

だって。え?あれぇ?と思って alsamixer.c を見てみると、

#include 

void main(void)
{
        printf("TODO\n");
}

わはははは。面白すぎんぞ(笑) マジで中身がないのだ。で、どうするかというと、結局 /etc/asound.conf を手で編集してしまった。っつ〜か、他に方法あんの?

インストール直後だと Tone Control 以外は全部 0 とか off になっていたので、以下のようにしてみた。

# ALSA driver configuration
# This configuration is generated with the alsactl program.

soundcard("SB64AWE") {
  mixer("CTL1745") {
    ; The type is 'bool'.
    switch("Auto Gain Control", false)
    ; Voice 0 : Min 0 Max 3
    ; Voice 1 : Min 0 Max 3
    element("Input Gain",0,200,Volume1(0,0))
    ; Voice 0 : Min 0 Max 3
    element("PC Speaker Volume",0,200,Volume1(2))
    element("MIC Input Switch",0,100,Switch1(off,off))
    element("MIC Output Switch",0,100,Switch1(off))
    ; Voice 0 : Min 0 Max 31
    element("MIC Volume",0,200,Volume1(0))
    element("Line Input Switch",0,102,Switch3(on,on,on,on))
    element("Line Output Switch",0,100,Switch1(on,on))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("Line Volume",0,200,Volume1(16,16))
    element("CD Input Switch",0,102,Switch3(on,on,on,on))
    element("CD Output Switch",0,100,Switch1(on,on))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("CD Volume",0,200,Volume1(16,16))
    element("Synth Input Switch",0,102,Switch3(off,off,off,off))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("Synth Volume",0,200,Volume1(0,0))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("PCM Volume",0,200,Volume1(16,16))
    ; Voice 0 : Min 0 Max 3
    ; Voice 1 : Min 0 Max 3
    element("Output Gain",0,200,Volume1(2,2))
    ; Bass : Min 0 Max 15
    ; Treble : Min 0 Max 15
    element("Tone Control",0,500,ToneControl1(bass=8,treble=8))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("Master Volume",0,200,Volume1(16,16))
  }
}

と、PC Speaker Volume などの Min 0 Max 0 というものは 2 に、PCM Volume などの Min 0 Max 31 というものは 16 にしといた。まぁだいたい半分ってことで。Synth とか MIC とかはとりあえず使わないので放っておいた。

/etc/asound.conf を書き換えて、alsactl restore したら、ちゃんと音が出るようになったぜ。さすが ALSA は音がいいわ〜(プラシーボやって)


メール 戻る