用ALSA驱动声卡流程详解

来源:互联网 发布:windows高精度触控板 编辑:程序博客网 时间:2024/05/21 11:28
作者:北南南北
来自:LinuxSir.Org
提要:目前大多数发行版都已经支持主流声卡,声卡的驱动无非是用ALSA;本文主要讲述声卡驱动的流程;目的是帮助遇到声卡的驱动问题的弟兄来弄清楚解决问题的流程;只要流程明白了,解决问题是没有太大的困难;
一、什么是ALSA ;
Advanced Linux Sound Architecture 的简称为 ALSA ,译成中文的意思是 Linux 高级声音体系(这是我直译的,可能译的不对);一谈到体系就有点范围就太大了,所以ALSA不仅仅是包括对声卡的支持和驱动;ALSA具有如下特征:
1、对所有音频接口的高效支持,从普通用户的声卡到专业级别多路音频设备;2、声卡驱动完全模块化设计;3、SMP and thread-safe design.4、开发库(alsa-lib) 为程序设计提供了简单、方便,并且拥有有高级的效果和功能;5、支持旧版本的OSS API 结口,能为大多数的OSS应用程序提供兼容;
OSS是一个商业性的驱动,OSS有一个简装本的代码已经移入内核和ALSA,其中alsa-oss就是;OSS公司据说目前已经并不存在了;我们没有必要用OSS 公司提供的商业版本;用ALSA和OSS简装版足够;
二、关于硬件驱动驱动的必备基础 ;

0、查看声卡是不是已经能发声了;
如果能发声,我们没有必要折腾了;呵。。。。
[root@localhost ~]# cat /usr/share/sounds/phone.wav > /dev/audio
[root@localhost ~]# cat /usr/share/sounds/phone.wav > /dev/dsp
也就是说找一个wav文件,然后用 cat file.wav > /dev/audio
1、如何查看硬件芯片;
在Linux操作系统中,所有的硬件都是以芯片组来区分的,品牌并不是最重要的;硬件最重要的标识是芯片组;所以您在讨论区求助的时候,只说硬件品牌,而不提供芯片组,大家是帮助不了您的,切记;我们查看硬件的芯片组是的命令是 lspci -v 或者是dmesg,由于dmesg输出的信息不太多,不够直观;所以经常用的还是lspci -v ;也可以用lshal 获取;最方便的还是lspci -v;初学者还是用 lspci -v 更好一点;
[root@localhost beinan]# lspci -v
我们运行lspci -v 后,如果查看声卡芯片组,发会现有类似下面的一段;
[root@localhost beinan]# lspci -v

Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M)
AC'97 Audio Controller (rev 03)
       、
Subsystem: Hewlett-Packard Company: Unknown device 3080
        Flags: bus master, medium devsel, latency 0, IRQ 5
        I/O ports at 1c00 [size=256]
        I/O ports at 18c0 [size=64]
        Memory at e0100c00 (32-bit, non-prefetchable) [size=512]
        Memory at e0100800 (32-bit, non-prefetchable) [size=256]
        Capabilities: [50] Power Management version 2

2、系统内核版本;
[root@localhost beinan]# uname -r -m -p -i
2.6.11-1.1369_FC4 i686 i686 i386
上面的表示的是系统的内核版本,处理器架构等;提示:如果您自己编译内核,还要安装kernel-devel (或 kernel-source), 这个是在系统光盘或者映像文件中有带;如果您想自己用 kernel.org 下载内核,自己编译,然后再来驱动声卡,也可以到 kernel.org 上下载最新的内核源码;一般情况下,如果系统默认的内核不能驱动声卡,大多得更换内核,我们建议您先从发行版所提供的升级包来升级内核及源码;比如Fedora 的扩展项目软件包更新速度极快,我们能通过apt和yum进行kernel的升级;在启用新内核时,我们不建议您删除老内核;因为现在Fedora / Redhat 引入apt和yum 更新工具,系统的完整性极为重要;如果系统被破坏,用更新工具变得极为困难;比如Fedora 的apt和yum升级源升级的内核也解决不了您的问题,我们可能需要自己通过 kernel.org 下载内核来编译;但也不能删除以前的内核包及源码包;一是为了安全,毕竟我们自己编译内核不是百分之百的成功;另外系统自带的内核及源码包被系统很多软件依赖;apt和yum 每次更新软件包的时候都要检查系统的完整性;对于有些发行版,可以直接从从 kernel.org 下载最新的内核;如果从系统提供的内核源码(kernel-devel或kernel-source)编译,可能解决不了您的问题;
3、modprobe.conf的内容;
在Fedora Core 4.0 中,内核模块的添加或定义别名是在 /etc/modprobe.conf 文件;在其它版本可能是 modules.conf ;如果您的系统中存在modprobe.conf ,我们就以这个文件为准;不同发行版有不同的定义文件,比如 slackware 是定义在/etc/modules.conf 中,但也要在 /etc/rc.d/rc.modules 打开相关驱动模块;modprobe.conf 或者module.conf就是对系统已经加载的模块进行相应的配置,比如设置别名等;这些一般都是自通过工具自动生成的,我们也可以通过查看硬件的文档和站点,也可以自己添加。为什么这样添加,而不是那样的呢?我也不懂了,因为人家文档那样说的,我不会开发,如果懂的开发的,可能会明白;请理解理解我;比如我用的是855的主板,系统驱动用的是 snd-intel8x0,在/etc/modprobe.conf的配置是如下的内容; 下面这段内容是通过 alsaconf 配置工具自动生成的;
alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
options snd-intel8x0 index=0
remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0


4、lsmod 查看已经加载的内核模块;
如果一个设备在内核的编译中是以模块方式加载的,主要是通过lsmod 来查看;
[root@localhost beinan]# lsmod
可能初学Linux的弟兄会问,内核的module存放在哪里,我们能不能自己来手工加载模块;内核的模块放在 /lib/modules/内核的版本/kernel/ ,比如在Fedora 4.0 中,我们可以看到如下的:
[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/kernel/
arch/    crypto/  drivers/ fs/      lib/     net/     sound/

其中,sound 就是声卡模块存放目录,大多数的硬件驱动放在 drivers目录,fs 是文件系统模块的目录;net是与网络有关的存放目录,比如一些网络协议支持的模块、防火墙支持的模块等;arch 是cpu方面 ... ... 如果我们想自己加载模块,就到这些目录中查看相应模块的信息,然后用 modprobe 来加载;
[root@localhost beinan]# modinfo snd-intel8x0
查看一个模块的信息,我们用 modinfo 来查看,所要查看的模块不要带 .ko 或者.o 之类的;比如查看到类似下面的信息;description: Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7012; Ali 5455通过这个我们足可以知道这是Intel 集成声卡,通过lspci -v 得到的声卡信息,感觉他们很相近;所以就能尝试用这个模块来驱动;
[root@localhost beinan]# modprobe snd-intel8x0
用 modprobe 加载了模块,然后我们通过 lsmod 就能看到了;对于声卡模块是这么加载的,其它设备的驱动模块也是如此;注意:这些只是教您一点基础知识,遇到什么问题,知道怎么去查看解决;如果您在论坛求助的时候,是必须把 lsmod 输入内容以及 /etc/modprobe.conf 或 modules.conf 的内容帖出来。这样能节省很多时间,否则大家不会明白问题出在哪里;
二、针对自己系统的声卡不发声,我是否有必要来升级内核解决;
可能存在这样的情况,比如有时我在Mandriva Linux时,声卡是有声音的,但安装好Fedora 系统后却没有声音了;所以我们有必要弄清楚如下的几个问题;可能声卡已经驱动起来了,只是我们不太了解系统的原因所致;下面我们以Fedora 为例;
1、声卡是不是被系统识别支持了;
我们可以用Fedora 提供的配置工具 system-config-soundcard 来测试;
[beinan@localhost ~]# system-config-soundcard
通过测试,如果能听到声音,证明声卡已经驱动好了;如果听不到声音,但反应在也不迟钝,不是打开 system-config-soundcard ,按测试播放声音时会出现假死的情况;可能是声量没有打开;
2、是否把声卡的音量打开了,比如PCM 和MASTER等;
我们可以用下面几个工具;
[beinan@localhost ~]# gnome-volume-control
[beinan@localhost ~]# kmix
[beinan@localhost ~]# alsamixer
[beinan@localhost ~]# aumix
上面的四个工具,可以尝试一下,有时这几个工具存在BUG的事;所以我们还要引入一个工具 aumix ,目前已经被Fedora 删除了;我们自己安装上就行了;请参考:《声卡工具 aumix》
3、我的声卡是测试时是有声音的,但我为什么不能播放CD和听mp3呢?
自从Redhat 8.0以后,也就是说 Redhat 9.0 ,Fedora 1.0,Fedora 2.0,Fedora 3.0 ,Fedora 4.0的媒体播放软件不再对mp3提供支持;究其原因是版权方面的原因;但这不是意味着我们不能在Fedora 系统中让播放软件支持 mp3;我们可以安装mp3支持补丁或者下载全新的播放器;而这一切都离不开在线安装工具 apt或yum ;请参考:
《Fedora / Redhat 软件包管理指南》
《Fedora 4.0 播放机支持mp3、wma的解决办法》至于CD为什么不能播放的问题,在论坛上已经说过多次了;首先要保证CDROM的音频线和主板相连接;有的弟兄会问,Windows为什么就能直接播放,我也没有把CDROM的音频线接在主板上;我答复您的是:咱们得转换观念,咱们是在用Linux,而不是Windows;
3、查看声卡是否有模块冲突;
比如Intel 主板集成了猫和声卡、网卡等,这时可能猫的蜂鸣器会被系统识别为声卡,所以要通过 lsmod 来查看,是否有 snd-intel8x0m;如果有则要处理一下;把在/lib/modules/内核的版本/kernel/sound/pci 中或 /lib/modules/内核的版本/kernel/drviers/sound/pci中的 snd-intel8x0m.ko改名为 snd-intel8x0m.koBAK ;还有类似的主板,比如 VIA 主板集成了声卡和猫的, 如果声卡不发声,大多也与这有关,比如内核模块有snd-via82xx.ko 和snd-via82xx-modem.ko,可能系统会把 snd-via82xx-modem.ko模块当成是声卡的驱动。如果您出现这样的情况,也要改名;
4、通过 alsaconf 来配置声卡;
一般的情况下,系统在安装的时候,会自动把声卡配好;如果能识别的,就基本没有问题了;但如果出现识别了,但还是不发声;或者识别成猫的蜂鸣器;所以我们除了要把前面所说的猫的蜂鸣器模块改名后,还要重新运行一下声卡配置工具 alsaconf ;可能我们还需要前面的一点知识,比如 modprobe 、lsmod等;有必要的时候还要启新启动机器;如果我没有alsaconf 这个命令怎么办?
[root@localhost beinan]# /usr/sbin/alsaconf
比如在Fedora Core 4.0 中,可能您不能发现这个命令;您采取的办法只能是重新编译 alsa-utils ;但也要保守编译;不能把alsa相关的包全都删除,只能是选择对应版本来编译;现在的Fedora 通过yum和apt升级,如果系统所依赖的包出被移除,比较重要的,alsa 就是其中的一个;会导致一些程序不能用;因为有版本对应关系;我们不能把系统整体的依赖关系打破;当然无关紧要的,比如这个软件包是依赖于其它包,而这个包不为其它包提供依赖的包,这样的包是可以移除的;自己编译alsa-utils 的办法是:首先,确认系统alsa软件包的版本;
[root@localhost alsa]# rpm -qa |grep alsa
alsa-utils-1.0.9rf-2.FC4
alsa-lib-1.0.9rf-2.FC4
alsa-tools-1.0.9-1.fc4
我们要到 alsa-project.org 中下载 1.0.9的源码包;主要下载alsa-lib-1.0.9 和 alsa-utils-1.0.9a;不要卸载原来的RPM包;先安装 alsa-lib-1.0.9,然后再安装alsa-utils-1.0.9a ;编译方法无非是 tar zxvf file.tar.gz 或者 tar jxvf file.tar.bz2 ,然后是进入相应的解压目录 ./configure;make;make install ;当然您要有安装开发工具、开发库等;如果不能进行源码包安装alsa等,所以我们要补装系统所缺少的软件;请参考《Fedora / Redhat 软件包管理指南》 这样我们就有 alsaconf 工具可用了;这样编译 alsa也不会对系统造成破坏;
++++++++++++++++++++++++++++++++
中场休息:我已经精疲力尽,上面所提到的我都尝试了,但还是不能驱动声卡;我该怎么办?
++++++++++++++++++++++++++++++++

如果上面的的内容您都明白了,那我得为您祝贺,说明您对硬件的驱动方法已经有所了解了;虽然声卡的问题还是没有解决,但您把基本的必备知识掌握,解决声卡的发声还不是什么难事;您看到这里已经是很疲惫,呵,我写到这里也有点累;但为了初学者在Linux能听到音乐,我还得接着努力,直到把您的问题解决为止;
三、安装新版本的ALSA;

1、对ALSA软件包的说明;

通过上面的一系列工程,可能您发现还不能解决您的问题,这时我们有必要升级ALSA;至于是否升级内核,我们还得等完成这步,看是否有必要;比如在Fedora 4.0 中,我们通过 rpm -qa |grep alsa 查询时会发现没有 alsa-driver 这个包,这是怎么回事?
[root@localhost alsa]# rpm -qa |grep alsa
alsa-utils-1.0.9rf-2.FC4
alsa-lib-1.0.9rf-2.FC4
现就ALSA 相关的软件包做一说明(在alsa-project.org 上有列出);alsa-lib 是alsa-driver 或者alsa其它包的时候,必须先安装这个包;
alsa-driver 是音频设备的驱动;一般内核都集成在里面,大多是以模块的方式,安装在了 /lib/modules/内核的版本/kernel/sound 或 /lib/modules/内核的版本/kernel/drviers/sound/ 中了;每个版本的内核都是如此;这也是我们没有在 Fedora Core 4.0 中没有发现 alsa-driver的原因 ;如果我们自己编译升级 alsa,其中 alsa-driver 也是被安装在 /lib/modules/内核的版本/kernel/sound 中或 /lib/modules/内核的版本/kernel/drviers/sound 中 ;明白了吧;alsa-utils 这个包主要是一些声卡配置工具,比如 alsaconf 、 alsamixer等;
alsa-oss 这个包和alsa-driver 一样,也没有以独立的包出现在 Fedora Core 4.0 中,原因和alsa-driver 一样,是集成在内核了,这个包极有必要的;如果我们升级ALSA的话,有些声卡用ALSA是驱动不起来的,是必须用alsa-oss才行;alsa-oss 包括了oss驱动库;alsa-oss,我们自己安装一般是默认放在了 /usr目录中;
alsa-tools 这个是额外的工具包,不是必须的;是针对一些特别的声卡的工具或者解码器之类,您可以根据自己的声卡来安装;不安装也是可以的;其它的包就不说了,到 alsa-project.org 上去看吧;比较重要的就是 alsa-lib 、alsa-driver、alsa-utils 、alsa-oss ;
2、ALSA的编译安装的前期准备;
编译安装ALSA,我们需要什么环境,就如同我们在Windows中打开一个file.doc文档一样,是需要先把Word安装上一样;Linux也是如此,我们必須先把软件包编译所需要的工具安装上;另外还要安装kerenel-devel或者其它一些支持的库,如果您没有安装这些,编译无法进行;这样开发工具都在系统安装盘中;如果您不知道如何安装,对于Fedora /Redhat 请参见《Fedora / Redhat 软件包管理指南》 您也要在线升级内核及内核的源码包,以Fedora 4.0为例,必须保证kernel 和kernel-devel 包是同一个版本;可能您看到好多kernel的包,还有什么smp之类的;如果您只是单处理器的,就不要用smp的;看图作业(点击看大图,升级内核时,请选择图中标记的颜色对应的内核和源码升级,也就是说版本要对应)重要:通过在线升级内核可能会解决您的声卡所存在的问题,要试着用前面所说的来尝试解决;您还可以通在在线升级alsa-lib ;alsa-tools ;alsa-utils 等包;如果通过在线升级内核及alsa-lib;alsa-utils;alsa-tools 等能解决您的问题,请不必看以下的内容;为什么说,通过在线长级内核能解决呢?因为通过内核的升级,内核包内置的alsa-driver 可能也得到了升级,如果打包的人升级了alsa-driver的话;如果是不能解决,说明alsa-driver 还是老版本;起重要作用的是alsa-driver ; 如果在线升级的过程中,alsa-lib没有新版本,肯定新内核中的alsa-driver 也没有更新,因为他们是配套的;明白了吧;
判断是否有必要重编内核:
[root@localhost beinan]# modinfo soundcore
filename:       /lib/modules/2.6.11-1.1369_FC4/kernel/soundBAK/soundcore.ko
description:    Core sound module
author:         Alan Cox
license:        GPL
alias:          char-major-14-*
vermagic:       2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends:
srcversion:     E11490DC3F523551C4C2A6D
如果出现上面类似的信息,则不必编译内核;误区之一:看到论坛的好多弟兄,总认为只要在线升级了alsa-lib 和alsa-utils 或 alsa-tools 就能解决声卡不发声的问题;其实不是这样的;因为起关健作用的是内核,而内核中的声卡驱动也是来自alsa-driver ;所以我们要尝试升级 alsa-driver 才能解决问题,只升级alsa-lib和alsa-utils 有何用?声卡的驱动并没有更新;有时升级alsa-lib 和alsa-utils 或许也能让声卡发声;只能说明是alsa-lib或alsa-utils存在了问题才导致声卡不发声;误区之二:也有弟兄认为驱动声卡是一定要重新从 kernel.org 下载内核,然后自己编译内核来解决声卡的问题;通过kernel.org 下载的内核,是能解决您的问题;但kernel.org 的内核集成声卡驱动也是来自于 alsa-project.org ;如果我们为了解决声卡驱动,没有在尝试用 alsa-driver 新版本的情况下,是没有必要重新编译内核的;正确观点:只要内核中的soundcore 是以模块的形式编译的,并且通过modinfo soundcore查看版本信息输出,我们就没有太大必要重编内核;因为系统几乎对所有的声卡及设备都有编译进去;所以我们先不要重编内核;除非做了升级alsa-driver后,还是不能解决问题,这时才能重编译核;alsa-driver 是和内核配置文件相关联的;也就是说,alsa-driver 是根据内核的配置文件来进行判断,对哪些声卡应该支持等;如果内核的配置文件没有配置对您的声卡进行支持;这时才需要我们来配置内核;另外内核中对声卡的支持的驱动也是来自于 alsa-driver ;
3、尝试编译安装ALSA ;
比如我下载了alsa 1.0.10rc1 版本,要下载配套的,比如 alsa-driver、alsa-lib、alsa-oss、alsa-utils 要下载同一系列的版本;我们先要安装alsa-lib;然后再安装其它的包;警告:在编译alsa所有包的时候,对于Fedora Core ,请不要卸载系统自带的alsa-lib 及alsa-utils 等;这样能欺骗系统,说明系统完整的;alsa是基础包之一,不是随便可以卸载的,因为有很多的包依赖这几个旧的包;比如xmms,如果您把alsa-lib系统自带的包卸掉了,xmms就不能用 alsa驱动,只能用oss驱动了,除非您在升级alsa-lib后重新编译xmms;另外最严重的后果,如果卸掉了这几个包,会破坏系统整体的依赖关系,yum和apt升级系统将无关正常运行;
[root@localhost alsa]# tar jxvf alsa-lib-1.0.10rc1.tar.bz2
[root@localhost alsa]# cd alsa-lib-1.0.10rc1
[root@localhost alsa-lib-1.0.10rc1]# ./configure ;make ;make install

[root@localhost alsa]# tar jxvf alsa-utils-1.0.10rc1.tar.bz2
[root@localhost alsa]# cd alsa-utils-1.0.10rc1
[root@localhost alsa-utils-1.0.10rc1]# ./configure ;make ;make install

[root@localhost alsa]# tar jxvf alsa-driver-1.0.10rc1.tar.bz2
[root@localhost alsa]# cd alsa-driver-1.0.10rc1
[root@localhost alsa-driver-1.0.10rc1]# ./configure ;make ;make install

[root@localhost alsa]# tar zxvf alsa-oss-1.0.10rc1.tar.bz2
[root@localhost alsa]# cd alsa-oss-1.0.10rc1
[root@localhost alsa-oss-1.0.10rc1]# ./configure ;make;make install
提示:其中alsa-driver 可以定义声卡来编译,这个对于老手还比较适用,如果您还不太会查看alsa的文档的话,就直接用通用的./configure;make;make install 来安装;这样所有的声卡都安装进去了;
4、尝试通过用新的ALSA驱动来配置声卡 ;
在这个时候,我们才用到前面讲的基础知识;呵。。。。。书到用时方恨少;不学习怎么也不行;

1)通过alsaconf 来配置声卡;

我们要通过alsaconf 来配置,看能否找到声卡;在运行alsaconf的时候,对于FC4请修改/etc/modprobe.conf 对其它的版本按前面的说,可能是 /etc/modules.conf ,把所有关于声卡的项目前面加#注掉,或者删除; 在选行alsaconf时,我们有必要运行一下如下的两个命令;目的是更新文件的索引数据库;
[root@localhost beinan]# rpm -rebuilddb 这个是针对RPM包的系统的;
[root@localhost beinan]# updatedb

然后再来运行alsaconf
[root@localhost beinan]# /usr/sbin/alsaconf
我们用过alsaconf后,要查看 /etc/modprobe.conf 或/etc/modules.conf ;还要lsmod ,看声卡模块有没有加载进来。如果没有加载进来,我们还要会用 modprobe 加载模块,前面有说,请回头看看;如果运行 alsaconf 后,配置文件 /etc/modprobe.conf 并没有发生变化,没有发现声卡的配置内容;您要到 alsa-project.org 上查看相应的信息,只看关于 /etc/modprobe.conf 的内容就行;比如他在上面说的是modules.conf 的,您可以直接写到 modprobe.conf (如果是Fedora 的话),各个系统的配置文件都差不多,如果不是modprobe.conf就是modules.conf ; 请参见:ALSA 声卡支持列表和文档请根据文档所说的来加载模块和配置 modprobe.conf或 modules.conf ;

2) 调节音量;
我们可能已经把声卡驱动起来了,但没有声音,所要一定要打开音量;调节工具:kmix 、aumix 、alsamixer及system-config-soundcard等工具;

3)值得注意是的,如果您播放mp3时,要注意以下系统;

自从Redhat 8.0以后,也就是说 Redhat 9.0 ,Fedora 1.0,Fedora 2.0,Fedora 3.0 ,Fedora 4.0的媒体播放软件不再对mp3提供支持;究其原因是版权方面的原因;但这不是意味着我们不能在Fedora 系统中让播放软件支持 mp3;我们可以安装mp3支持补丁或者下载全新的播放器;而这一切都离不开在线安装工具 apt或yum ;请参考:
《Fedora / Redhat 软件包管理指南》
《Fedora 4.0 播放机支持mp3、wma的解决办法》提示:测试。。。。能成功吗? 不成功接着看下面。。。。。。:(
+++++++++++++++++++++++++++++++++
下半场:前半场下来,您还是不能解决声卡,只能用最后一招;重新编译内核~
+++++++++++++++++++++++++++++++++

四、重新编译内核;

1、为什么要编译内核?
因为您的声卡没有被当前所用的内核版本配置进去,所以我们要新编译内核;
2、我不会编内核怎么办?;
可能新手弟兄会说,我不会编内核怎么办?答曰:不会编内核,就得学习,谁也不是天生就会的;学习改变命运,不是吗?其实编译内核目前看来是极为简单的事,只是我们第一次接触到Linux,太习惯Windows的点鼠标,不太习惯Linux的命令行操作罢了。只要努力,没有什么做不成的;你看北南这水平都会写教程 。呵。。。坐在电脑前大侠如果认为北南写的这篇文章或许对你有所帮助的话,那您也能行;加油~~~~
3、内核的选择;
一般的情况下选择发行版所提供的内核升级包及源码包要好;您可以通过 apt+synaptic 来选择装,但不要把老内核删除,系统的完整性是很重要的;一般的情况下如果通过新内核的在线升级能解决问题的,我们也没有必要编译了;我们前面已经说过了;如果不能用新的内核来驱动,我们可以在新的内核的基础上进行编译,当然我们必须要下载kernel-devel 或者 kernel-source 包;为什么要选择系统提供的内核及源码升级包呢?一是主要是为了方便,对于大多数的选项,我们按默认就好了,我们只是针对比较重要的地方改一改;比如对于Fedora Core 4.0 ,目前在线升级源有很多版本可下载使用;我们要把同一版本的内核包及源码包都要安装;
二是如果我们用新编的内核启动不了系统,可以用老内核来引导,这是为了系统的安全。对新手和老手都是适用的;当然您也能从 kernel.org 上下载最新最稳定的内核;目前最新版本是 2.6.13 ;kernel.org 下载的内核包含的声卡驱动也是来自 alsa-driver ;
4、编译内核参考文档;
《编译内核操作流程 ──为新手指南》根据《编译内核操作流程 ──为新手指南》 中所说的,有针对性的来解决问题;编译好内核后,用alsaconf 来配置声卡;或者重新编译 alsa-lib 、alsa-oss、alsa-utils 等;经过我的测试,一般的情况下重新编译过内核后,用 alsaconf 配置一下就能用了;
后记:

至此,关于声卡的问题就算解决流程就算完工了;如果您认为我的这篇文档写的还不够详细,或者不能解决您的问题;问题无非是两种,一是您的声卡没有被ALSA所支持,请查相应的列表;二是如果ALSA已经支持了您的声卡,您看了我的文档还是不能解决您的问题(看与不看只是一个假设,就看我的文档值不值得您一看了);对于第二种情况无非又是有两种原因,一是北南写的文档不行,您看不懂;二是您可能是真的初学者,可能需要更多的尝试和努力;如果还是解决不了,或行您静下心仔细看一下本文档所提到的流程,或许能找到一点对您有所启示的内容;最好是... ... 再解决不了怎么办呢,如果您和北南在同一个城市的话,把机器抱到我这里,我感觉差不多能解决吧;哈哈。。。。。。。。。
附录:
1、《编译内核操作流程 ──为新手指南》
2、《Fedora / Redhat 软件包管理指南》
3、《Fedora 4.0 播放机支持mp3、wma的解决办法》
4、ALSA 声卡支持列表和文档
5、 http://www.alsa-project.org
6、 http://www.kernel.org 附件大小kernel000linuxsir.orgbest.jpg94.52 千字节

这样棒的文章............!!

这样棒的文章............!!

刚装完Fedora3时还有声音,一升级就没声音了……

我的声卡是Creative Vibra 128的,Model CT4730,芯片是EV1938;alsa对应的驱动模块是snd-ens1371。Fedora3刚装完的时候还是有声音的,midi、mp3、ape播放都没问题,但是在线升级后就没声音了,真是晕倒,难道新的内核或alsa有这方面的Bug?FC3原始版本的内核是2.6.9的,在线升级后是2.6.12的。后来上alsa官网下载了最新的release版编译安装也不行,下载了最新的rc版编译安装也还是没声音,master和pcm音量都调到最大了都没用;怀疑声卡出问题了,回头进XP,声音暴响。不知道北南兄是否有听说过新版本的内核或alsa在驱动snd-ens1371方面有这样的Bug?

我没有用过snd_ens1371的;

看看mod是不是已经装载了?
如果还是不行,可能就得重编内核了。。。

如果是重编内核,就不如自己到 kernel.org 去下载最新的,自己编译也方便;现在2.6X的内核极好办。。。。

另外一个办法是把内核换回去,还是用老内核,要用新版本的alsa是否有声音。

另外最好看一下音量方面的,用 aumix 看看;这个比较直观;

多谢北南兄回复,看来要试试换kernel了

mod已经装载了。只能先试试老内核,然后再考虑编译最新的内核了。aumix好象FC3自带的吧?我没有去下载,命令行下直接就能执行的。但是看起来好象不如alsamixer来得清晰呀?另外,在线升级好之后,曾经发现alsamixer中怎么也找不到PCM这一项,安装了最新的alsa组件后才又有了。而且在安装alsa1.0.10rc2之前,曾经发现realplayer一启动时音量就是最小,调大后,重启系统后就又回到最小了。虽然现在没有这个现象了,但声音还是没有。

是不是配置文件没写好?查看一下 配置文件;

新版本的配置文件是不是变了??这个也是得考虑的。应该查看一下在线文档;看看他的modprobe.conf 关于alsa是怎么写的。。。

北南兄,似乎是alsa和kernel配合的问题

后来试了。首先,最新的kernel编译后不能启动,报告什么policy错误。然后安装2.6.9的rpm,一切OK,又有声音了。在2.6.9下编译最新的alsa驱动,出错,说 field owner not found 云云,查源代码,发现是最新的alsa驱动所引用的kernel的一个pci_driver的struct导致的,在2.6.9的kernel的头文件定义中,pci_driver这个struct独缺owner这个field。于是把alsa驱动中这一行注释掉,编译通过,安装——声音没了。可见使用老kernel的alsa驱动肯定是OK的,但是使用新的驱动就有问题了,首先是新的驱动和老的kernel肯定配合有问题,其次,新的驱动在新的kernel上又没有声音。配置文件是看过了,ens1371的写法并没有变化。再次感叹,linux在这方面确实还是任重而道远~~

难道新的alsa对创新的PCI128支持有问题!?

继续前面的尝试,新版本的kernel下,老的alsa(1.0.6)驱动无法编译……如此一来,没戏了,只有用2.6.9的kernel了。再次下载了最新的alsa驱动(变成rc3了),在老的kernel上编译、安装——一切通过,就是没声音。这样一来,结论基本完全清晰了。看来要想在新的kernel和alsa上出声,除非是换声卡了。

有什么错误?最好下载最新的1.09吧

有什么错误??
有什么错误?最好下载最新的1.09吧

我做了上面的所有工作,但还是听不到声音

我做了上面的所有工作,但还是听不到声音lsmod与/etc/modprobe.conf 如下:
[root@chenglinwang ~]# lsmod
Module Size Used by
snd_intel8x0 37920 1
snd_ac97_codec 91552 1 snd_intel8x0
snd_ac97_bus 2688 1 snd_ac97_codec
snd_seq_dummy 4100 0
snd_seq_oss 45056 0
snd_seq_midi_event 10496 1 snd_seq_oss
snd_seq 78864 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event
snd_seq_device 9612 3 snd_seq_dummy,snd_seq_oss,snd_seq
snd_pcm_oss 53664 0
snd_mixer_oss 18816 1 snd_pcm_oss
snd_pcm 112648 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss
snd_timer 42884 2 snd_seq,snd_pcm
snd 63972 13 snd_intel8x0,snd_ac97_codec,snd_seq_dummy,snd_s eq_oss,snd_seq_midi_event,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_p cm,snd_timer
soundcore 12449 1 snd
appletalk 35317 2
ipx 39529 2
radeon 76609 1
drm 77653 2 radeon
parport_pc 30469 1
lp 13129 0
parport 46089 2 parport_pc,lp
autofs4 42309 2
rfcomm 46429 0
l2cap 38469 5 rfcomm
bluetooth 63429 4 rfcomm,l2cap
sunrpc 197509 1
pcmcia 44921 4
ipt_REJECT 5953 1
ipt_state 1985 1
ip_conntrack 41849 1 ipt_state
iptable_filter 3137 1
ip_tables 19905 3 ipt_REJECT,ipt_state,iptable_filter
nls_cp936 126657 2
vfat 14017 1
fat 58461 1 vfat
dm_mod 61917 0
video 16197 0
ibm_acpi 16381 0
button 6737 0
battery 9541 0
ac 4933 0
ipv6 292865 8
yenta_socket 23885 4
rsrc_nonstatic 13633 1 yenta_socket
pcmcia_core 45929 3 pcmcia,yenta_socket,rsrc_nonstatic
uhci_hcd 43345 0
ehci_hcd 48333 0
shpchp 95429 0
i2c_i801 9165 0
i2c_core 21697 1 i2c_i801
snd_page_alloc 11144 2 snd_intel8x0,snd_pcm
e1000 108717 0
ipw2200 77133 0
ieee80211 24389 1 ipw2200
ieee80211_crypt 9413 1 ieee80211
floppy 71861 0
joydev 9601 0
ext3 138569 2
jbd 111065 1 ext3

# ALSA portion
alias char-major-116 snd
alias snd-card-0 snd-intel8x0
# module options should go here

# OSS/Free portion
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0

# card #1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss

# --- BEGIN: Generated by ALSACONF, do not edit. ---
# --- ALSACONF version 1.0.10rc2 ---
alias snd-card-0 snd-intel8x0
alias sound-slot-0 snd-intel8x0
# --- END: Generated by ALSACONF, do not edit. ---

不知何因,请北南指教.我的邮箱:chenglinwang@126.com.MSN:chenglinwang@hotmail.com

把modprobe.conf中有关声卡的都注掉

把modprobe.conf中有关声卡的都注掉,然后重新运行 alsaconf

试试看???

非常感谢这么快回复!但还是不行!?

我在南京,现在在线MSN。
我的本本 IBM T42-4WU
注消完了后,modprobe.conf为:
# ALSA portion
alias char-major-116 snd
alias snd-card-0 snd-intel8x0
# module options should go here

# OSS/Free portion
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0

# card #1
# alias sound-service-0-0 snd-mixer-oss
# alias sound-service-0-1 snd-seq-oss
# alias sound-service-0-3 snd-pcm-oss
# alias sound-service-0-8 snd-seq-oss
# alias sound-service-0-12 snd-pcm-oss

# --- BEGIN: Generated by ALSACONF, do not edit. ---
# --- ALSACONF version 1.0.10rc2 ---
alias snd-card-0 snd-intel8x0
alias sound-slot-0 snd-intel8x0
# --- END: Generated by ALSACONF, do not edit. ---

但是alsaconf后用“声卡检测”还是听不到声音。
北南南北老师还请您多多指教!

lspci -v

把这个贴上来看看?

lspci -v的内容如下

00:00.0 Host bridge: Intel Corporation 82855PM Processor to I/O Controller (rev 03)
Subsystem: IBM: Unknown device 0529
Flags: bus master, fast devsel, latency 0
Memory at d0000000 (32-bit, prefetchable) [size=256M]
Capabilities: [e4] Vendor Specific Information
Capabilities: [a0] AGP version 2.0

00:01.0 PCI bridge: Intel Corporation 82855PM Processor to AGP Controller (rev 03) (prog-if 00 [Normal decode])
Flags: bus master, 66Mhz, fast devsel, latency 96
Bus: primary=00, secondary=01, subordinate=01, sec-latency=64
I/O behind bridge: 00003000-00003fff
Memory behind bridge: c0100000-c01fffff
Prefetchable memory behind bridge: e0000000-e7ffffff

00:1d.0 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 01) (prog-if 00 [UHCI])
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at 1800 [size=32]

00:1d.1 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 01) (prog-if 00 [UHCI])
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at 1820 [size=32]

00:1d.2 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 01) (prog-if 00 [UHCI])
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at 1840 [size=32]

00:1d.7 USB Controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 01) (prog-if 20 [EHCI])
Subsystem: IBM: Unknown device 052e
Flags: bus master, medium devsel, latency 0, IRQ 11
Memory at c0000000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [50] Power Management version 2
Capabilities: [58] Debug port

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 81) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=02, subordinate=0a, sec-latency=64
I/O behind bridge: 00004000-00008fff
Memory behind bridge: c0200000-cfffffff
Prefetchable memory behind bridge: e8000000-efffffff

00:1f.0 ISA bridge: Intel Corporation 82801DBM (ICH4-M) LPC Interface Bridge (rev 01)
Flags: bus master, medium devsel, latency 0

00:1f.1 IDE interface: Intel Corporation 82801DBM (ICH4-M) IDE Controller (rev 01) (prog-if 8a [Master SecP PriP])
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at
I/O ports at
I/O ports at
I/O ports at
I/O ports at 1860 [size=16]
Memory at 20000000 (32-bit, non-prefetchable) [size=1K]

00:1f.3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 01)
Subsystem: IBM: Unknown device 052d
Flags: medium devsel, IRQ 11
I/O ports at 1880 [size=32]

00:1f.5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 01)
Subsystem: IBM: Unknown device 0537
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at 1c00 [size=256]
I/O ports at 18c0 [size=64]
Memory at c0000c00 (32-bit, non-prefetchable) [size=512]
Memory at c0000800 (32-bit, non-prefetchable) [size=256]
Capabilities: [50] Power Management version 2

00:1f.6 Modem: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (rev 01) (prog-if 00 [Generic])
Subsystem: IBM: Unknown device 0559
Flags: medium devsel, IRQ 11
I/O ports at 2400 [size=256]
I/O ports at 2000 [size=128]
Capabilities: [50] Power Management version 2

01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M7 LW [Radeon Mobility 7500] (prog-if 00 [VGA])
Subsystem: IBM: Unknown device 0530
Flags: bus master, stepping, fast Back2Back, 66Mhz, medium devsel, latency 66, IRQ 11
Memory at e0000000 (32-bit, prefetchable) [size=128M]
I/O ports at 3000 [size=256]
Memory at c0100000 (32-bit, non-prefetchable) [size=64K]
[virtual] Expansion ROM at c0120000 [disabled] [size=128K]
Capabilities: [58] AGP version 2.0
Capabilities: [50] Power Management version 2

02:00.0 CardBus bridge: Texas Instruments PCI4520 PC card Cardbus Controller (rev 01)
Subsystem: IBM: Unknown device 0552
Flags: bus master, medium devsel, latency 168, IRQ 11
Memory at b0000000 (32-bit, non-prefetchable) [size=4K]
Bus: primary=02, secondary=03, subordinate=06, sec-latency=176
Memory window 0: e8000000-e9fff000 (prefetchable)
Memory window 1: c2000000-c3fff000
I/O window 0: 00004000-00004fff
I/O window 1: 00005000-00005fff
16-bit legacy interface ports at 0001

02:00.1 CardBus bridge: Texas Instruments PCI4520 PC card Cardbus Controller (rev 01)
Subsystem: IBM: Unknown device 0552
Flags: bus master, medium devsel, latency 168, IRQ 11
Memory at b1000000 (32-bit, non-prefetchable) [size=4K]
Bus: primary=02, secondary=07, subordinate=0a, sec-latency=176
Memory window 0: ea000000-ebfff000 (prefetchable)
Memory window 1: c4000000-c5fff000
I/O window 0: 00006000-00006fff
I/O window 1: 00007000-00007fff
16-bit legacy interface ports at 0001

02:01.0 Ethernet controller: Intel Corporation 82540EP Gigabit Ethernet Controller (Mobile) (rev 03) Subsystem: IBM PRO/1000 MT Mobile Connection
Flags: bus master, 66Mhz, medium devsel, latency 64, IRQ 11
Memory at c0220000 (32-bit, non-prefetchable) [size=128K]
Memory at c0200000 (32-bit, non-prefetchable) [size=64K]
I/O ports at 8000 [size=64]
[virtual] Expansion ROM at ec000000 [disabled] [size=64K]
Capabilities: [dc] Power Management version 2

02:02.0 Network controller: Intel Corporation PRO/Wireless 2200BG (rev 05)
Subsystem: Intel Corporation: Unknown device 2712
Flags: medium devsel, IRQ 11
Memory at c0210000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [dc] Power Management version 2

靠这么麻烦

麻烦麻烦麻烦!抵制REDHAT

靠这么麻烦

麻烦麻烦麻烦!抵制REDHAT

改modprobe.conf文件内容

把原来有关声卡的全部删除,但不要忘记备份原文件;

加入;

alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
options snd-intel8x0 index=0
remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0

加入后,就不要测试声卡了,也不要运行alsaconf;

运行

# modprobe snd-intel8x0

看是否打开音量了??如果没有声音,大多是音量方面的事。

#alsamixer

当然如果播放mp3,得让fedora 支持mp3 ,还得选择插件,比如 alsa还是oss ,自己点一点鼠标,当用xmms的时候;

啊!快崩溃了!北南兄救救我!

我按照上面做了,当
[root@chenglinwang ~]# modprobe snd-intel8x0
没有打开音量。
然后当
[root@chenglinwang ~]# alsamixer
出现如下内容:
Segmentation fault.
[root@chenglinwang ~]#
我打开kmix调节音量仍然无法听声音。
mp3插件我早就装了

不知北南兄有何联系方式,可否音频现场指导?我的qq:359003788。或者你身边有否联系固话?

郁闷啊,兄弟用的是哪个alsa的版本?

兄弟用的是哪个alsa的版本?

有点不解;

北南兄,救救我!

我的声卡还是不能出声啊!?

不甚感激!

我的声卡在XP上是好的,刚开始安装FC4时还能听到声音,后来不知咋就听不见了。
我的科研工作多数在linux平台,有时上课或休息需用多媒体,不想频繁开关机换系统。请多多帮忙!不甚感激!

大家用下面的方法来测试声卡

[root@localhost ~]# cat /usr/share/sounds/phone.wav > /dev/audio
[root@localhost ~]# cat /usr/share/sounds/phone.wav > /dev/dsp

找一个wav文件,然后用 cat file.wav > /dev/audio

看能否听到??

我的alsa的版本:

我在网上下了四个文件,加压编译安装了:
alsa-driver-1.0.10rc2.tar.bz2
alsa-lib-1.0.10rc2.tar.bz2
alsa-utils-1.0.10rc2.tar.bz2
alsa-oss-1.0.10rc2.tar.bz2
但是ape+synaptic升级只能是:alsa-lib-1.0.9rf-2.FC4

对,因为 alsa-driver 是直接写入内核核块的目录的

这个要自己编译来解决;

只单单升级lib有时并不管用。。。要升级就要下载同一版本的alsa ;

谢谢,按照你文章所说的做,我的电脑发声了,谢谢

谢谢,按照你文章所说的做,我的电脑发声了,谢谢啊!

声卡OK了

感谢北南兄的文章,我的声卡经过n天的折腾,在充分理解了北南兄的文章后,终于可以听歌了,真的十分感谢北南兄写出这样的好文章啊.
--心灵航帆