SVX日記
2009-03-21(Sat) Google [ LavieA 音が出ない SUSE Linux ] [検索]
実は先日より、openSUSEの環境を整え始めていたりする。別にFedoraに飽き足らず、というワケではない。どっちかってーと、Fedoraより不便なことは多いだろうけど、常用環境に仕上げるまでにブチ当たるであろう壁をブチ破るため、である。私は「手段のためなら目的を選ばない」のである。敢えていえば、まぁ、楽しんでお仕事をするため、かな。
育て上げたThinkPadX40上のFedora9に不満はない。むしろ、いまや常用環境として愛用しており、これを上書きしてしまうワケにはいかない。逆に、以前は上書きしてしまうワケにはいかなかった、常用環境だった赤いノートPC「NEC LavieA」上のWinXPを縮小し、その脇にSUSEを入れることにする。
インストールには何の問題もなかった。勝手にデュアルブートの設定までしてくれた。意外と苦労するかと思ったATOK X3も、すんなり入った。一方でXftEmacsは、早々にあきらめた。しかし、どうにもあきらめられないのが、サウンド。出ないのだ。音が。さっぱり。つまんない。つまんないと、環境構築を進めようという気にならない。
ノートPCでLinuxといえば、無線LANやサウンドなどのハードの認識で苦労する(挙げ句、あきらめる)のはお約束である。が、それにしても、さっぱり糸口がつかめない。そもそも、PCのサウンド関係(ハード, AC'97とか)って、各種概念が複雑すぎだ。さらに、混沌としたLinuxの各種実装(OSS, ALSA, PulseAudioとか)が拍車をかけている。こーゆートラブルになると、ドライバのレベルを超えて、チップセットとか、周辺回路とか、サウンドチップの仕様とかまで足をツッコまなければならなくなりがちだ。そんなことは、知ろうにも限界がある。仕事じゃあるまいし、ソースコードの正面突破は避けたいのだが……。
Webで情報を探すが、ほとんどが「alsaconfしろ、しらんけど」とか「ミュート状態でした、えへへ」程度で、さっぱり役に立たない。やはり、音が出なければ「あきらめる」のが基本のようだ。といってもなぁ。この「LavieA」は、キーボードの質もかなり高く、サイズや重量もギリギリのトコロを突いていて、かなりギーク向けなんだけど……などと思っているのはオイラだけで、一般的には「日本のライトユーザ向けオシャレっぽいパソコン」である。Linuxなんか入れるようにできてないようだ。TninkPadとは違う。
うぅむ。最終的にはSUSEで音を出すのが目的だが、最新のFedora10Liveを動かしてみて、音が出るか試してみよう。音が出れば、その設定を盗めば……出ない。Knoppi……出ない。Ubu……出ない……全滅。
自動的に選択されるモジュールが合ってないのか、と思い、そっちの方面から調べるが「lspci」の結果は「00:1e.2 Multimedia audio controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (rev 04)」である。モジュールとしては「snd_intel8x0」で間違ってないはずだ。
チップレベルではどうか。載っているのはANALOG DEVICESのAD1981BLというチップらしいが「sound/pci/intel8x0.c」のコード内には、AD1981Bという記載がある……って、結局ソースコード読みはじめちまってるよ。とほほ。まぁ、チップも問題なさそうだ。
んじゃ、次は上位側の概念からチェック。ALSAってのは、主にLinuxのサウンド機能の名前で、別にそういう外部パッケージがあるわけではない。カーネルに取り込まれているから、別に他のデバイスドライバと変わらない概念だ。「/dev/dsp」や「/dev/mixer」なんかが、ALSAとの主な対話手段。昔は、この辺りにはOSSというサウンド機能がいた。ALSAはOSSの上位互換。つまり、現在は入れ替わっているはず。たぶん。
で、最近の新しい概念がPulseAudio。ALSAはAPからの要求に基づいてハードウェアをドライブするが、複数のAPから同時に要求があると、互いに干渉してしまう。そこで、APにはALSAのふりをしつつも、複数のAPからの要求をミキシングして、単一もしくは複数のALSAをドライブするのがPulseAudio。APごとに独立してサウンドカードがあるかのように見せるので、APごとにボリュームを調整したりできるようになる。要するにサウンド環境の仮想化だ。
……と、ここまでわかってきて、なんとなく各種GUIの裏側が見えてきたものの、肝心の音は出てこない。むしろ、各種の表面的挙動は、ちゃんと音が出ているようにしかみえない。なんか、最後の最後で、線が切れているような、スイッチを入れてないような、耳が聞こえてないような、そんな印象。
しつこく、Web検索を続けていると「snd_intel8x0」の後継である「snd_hda_intel」モジュールには、パラメータとして「model」なんてのを与えることができるらしい。やっぱり、ソース調査が必要か。もう一度「sound/pci/intel8x0.c」に潜る。
static struct ac97_quirk ac97_quirks[] __devinitdata = {
{
.subvendor = 0x0e11,
.subdevice = 0x000e,
.name = "Compaq Deskpro EN", /* AD1885 */
.type = AC97_TUNE_HP_ONLY
},
{
.subvendor = 0x0e11,
.subdevice = 0x008a,
.name = "Compaq Evo W4000", /* AD1885 */
.type = AC97_TUNE_HP_ONLY
}, ※続く
LavieAのサウンドカードは「.subvendor = 0x1033」「.subdevice = 0x8288」に該当するが、もちろん記載はなかった。つーか、quirksってなんじゃ? typeってなんじゃ? 辞書で調べると「quirk」は「くせ, 奇癖; 気まぐれ; 急なねじれ, 急転回;」だそうだ。で、その「type」のひとつが「AC97_TUNE_HP_ONLY」。コードを読み進めると、HPはヘッドホンの意味らしい。この機種は「ヘッドホンのみ」ちゅー「くせ」がある?
/* quirk types */
enum {
AC97_TUNE_DEFAULT = -1, /* use default from quirk list (not valid in list) */
AC97_TUNE_NONE = 0, /* nothing extra to do */
AC97_TUNE_HP_ONLY, /* headphone (true line-out) control as master only */
AC97_TUNE_SWAP_HP, /* swap headphone and master controls */
AC97_TUNE_SWAP_SURROUND, /* swap master and surround controls */
AC97_TUNE_AD_SHARING, /* for AD1985, turn on OMS bit and use headphone */
AC97_TUNE_ALC_JACK, /* for Realtek, enable JACK detection */
AC97_TUNE_INV_EAPD, /* inverted EAPD implementation */
AC97_TUNE_MUTE_LED, /* EAPD bit works as mute LED */
AC97_TUNE_HP_MUTE_LED, /* EAPD bit works as mute LED, use headphone control as master */
};
統一性はないが、swapとか、JACKとか、LEDとか、いかにも配線の「くせ」くさい。これ、順に試してみようかしらん。この「type」を、外部から与える方法ってないんかな? モジュールのオプションには、それっぽいパラメータがあった。
# modinfo snd_intel8x0 | grep parm
parm: index:Index value for Intel i8x0 soundcard. (int)
parm: id:ID string for Intel i8x0 soundcard. (charp)
parm: ac97_clock:AC'97 codec clock (0 = auto-detect). (int)
parm: ac97_quirk:AC'97 workaround for strange hardware. (charp) ★コレ
parm: buggy_semaphore:Enable workaround for hardwares with problematic codec semaphores. (bool)
parm: buggy_irq:Enable workaround for buggy interrupts on some motherboards. (bool)
parm: xbox:Set to 1 for Xbox, if you have problems with the AC'97 codec detection. (bool)
parm: spdif_aclink:S/PDIF over AC-link. (int)
parm: enable:bool
parm: joystick:int
static struct quirk_table applicable_quirks[] = {
{ "none", NULL },
{ "hp_only", tune_hp_only },
{ "swap_hp", tune_swap_hp },
{ "swap_surround", tune_swap_surround },
{ "ad_sharing", tune_ad_sharing },
{ "alc_jack", tune_alc_jack },
{ "inv_eapd", tune_inv_eapd },
{ "mute_led", tune_mute_led },
{ "hp_mute_led", tune_hp_mute_led },
};
options snd-intel8x0 ac97_quirk=hp_only
設定を有効にするには、モジュールのリロードが必要になる。GUI環境では、モジュールがアンロードできないので、CUIに落ち、モジュールをリロードして、リロードの様子を確認しつつ、GUIに戻って音が出ないか試行錯誤する。
# init 3
# modprobe -r snd-intel8x0
# modprobe snd-intel8x0
# dmesg | tail
# init 5
hp_onlyでダメなら、次はswap_hp。それでもダメならswap_surroundと、順に試す。たぶん、これはサウンドカードの配線の仕様に依存するので、頭の使いどころはない。我慢して、何度か繰り返す……
options snd-intel8x0 ac97_quirk=inv_eapd
つーか、こんだけ苦労したんだから、これだけでは済まさんぞ「inv_eapd」って、いったんなんなんだよ。サウンドカードの配線の仕様に依存するならば、AD1981BLのデータシートをチェックだ。
eapd……eapd……っとッ!! 答えはデータシートの中にあった。「External Amp Power-Down Control」ってことは、外部アンプの電源制御ってことだ。「inv」はインバータ、つまり、負論理。LavieAは、電源制御線の論理が普通と逆。電源ONにすべき状況で、電源OFFになってしまっていたと、そういうことすか。なんとなく「スイッチを入れていないような」挙動にみえたのは、当たってたワケだ……ちっともうれしくネェョ。
ubuntuのフォーラムから流れてきました。現在、9.10をアップグレードして弄っているのですが、音が出ないトラブルに悩まされています。<br><br>私の環境はこちらに記載のLavieAと同じモジュール”intel8x0”なのですが、やはり「strange hardware」の壁が高くて相当難儀しています。(というかALSA、PulseAudioが壁なのか?)<br><br>サウンドカードを付け替えたほうがてっとり早いような気もしてきましたが、、、Intelさんubuntu用のドライバ出してくれないだろうか。SUSEやRedhatはサポートしてるのに。(一応、行って見てきました)<br><br>すみません、ただの愚痴になってしまいました。それでは。
サウンド関連の問題、特に音が出ないという症状に関しては、これといった切り分け方法もなく、非常に難しいです。<br><br>したがって、その症状が、本当に「strange hardware」に起因しているかどうかは、まだ断定するには早いと思います。<br><br>なんにせよ、私もFedora12で苦労してますが、kernel-2.6.31はかなりあちこちとバギーな印象です。どんな機種をご利用なのかわかりませんが、古いカーネルをインストールし、それで起動することで、問題を切り分けてみるのはかなり効果的な方法だと思います。
P4C800をDebian/squeezeマシンにして後はSPDIFから音がでればっ、てところで悩んでたところac97_quirk=inv_eapdが大当たり!<br>ほんと感謝です。助かりました〜