Linux中用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简装版足够;
二、关于硬件驱动驱动的必备基础 ;
1、如何查看硬件芯片;
在Linux操作系统中,所有的硬件都是以芯片组来区分的,品牌并不是最重要的;硬件最重要的标识是芯片组;所以您在讨论区求助的时候,只说硬件品牌,而不提供芯片组,大家是帮助不了您的,切记;
我们查看硬件的芯片组是的命令是 lspci -v 或者是dmesg,由于dmesg输出的信息不太多,不够直观;所以经常用的还是lspci -v ;也可以用lshal 获取;最方便的还是lspci -v;初学者还是用 lspci -v 更好一点;
代码:
[root@localhost beinan]# lspci -v
我们运行lspci -v 后,如果查看声卡芯片组,发会现有类似下面的一段;
[root@localhost beinan]# lspci -vMultimedia 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
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-intel8x0options snd-card-0 index=0options snd-intel8x0 index=0remove 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 就能看到了;对于声卡模块是这么加载的,其它设备的驱动模块也是如此;
<font color=red>注意:[/b][/size]这些只是教您一点基础知识,遇到什么问题,知道怎么去查看解决;如果您在论坛求助的时候,是必须把 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
如果我没有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
[root@localhost alsa]# rpm -qa |grep alsa
<img src="
重要:通过在线升级内核可能会解决您的声卡所存在的问题,要试着用前面所说的来尝试解决;您还可以通在在线升级alsa-lib ;alsa-tools ;alsa-utils 等包;
如果通过在线升级内核及alsa-lib;alsa-utils;alsa-tools 等能解决您的问题,请不必看以下的内容;
为什么说,通过在线长级内核能解决呢?因为通过内核的升级,内核包内置的alsa-driver 可能也得到了升级,如果打包的人升级了alsa-driver的话;如果是不能解决,说明alsa-driver 还是老版本;起重要作用的是alsa-driver ; 如果在线升级的过程中,alsa-lib没有新版本,肯定新内核中的alsa-driver 也没有更