1.声卡驱动
1.链接
2.链接
尝试在两个平台:CentOS-8-x86_64-1905-dvd1.iso(kernel-4.18.0-80.el8)
与Fedora-Everything-netinst-x86_64-29-1.2.iso(linux-5.3.11)
开启声卡播放声音。
fedora由于工具比较全,所以可以做先期尝试。而centos由于稳定性高,适合企业级应用,所以最终还是要在它上面跑起来。
我先点明,其实centos8上支持很多的声卡,所以首先要看是否自己声卡已经被支持了,支持的话就没必要再去安装alsa驱动,下面的内容是我所做过的尝试,最后才发现其实什么都不需要做。
2.步骤
先说明一下,这个步骤是按照按照rme声卡驱动的链接来做的,但是实际上,用处不大。所以这章基本上算是浪费掉了。
alsa官网地址:链接
alsa-driver地址:链接
更详细的alsa源码:链接
1.下载alsa-driver代码
$ git clone git://git.alsa-project.org/alsa-driver.git
下载完成后,需要经过处理:
cd alsa-driver
git checkout build
git pull origin build
git checkout mirror
git pull origin mirror
git checkout release
git pull origin release
make ALSAKERNELDIR=../alsa-kernel all-deps
(if the alsa-kernel-dir is really there)
aclocal
autoconf
./configure
make dep
make
编译该源码需要kernel代码的参与,所以没有的话,可以参照下面的步骤进行安装。
安装工具:
$ yum install elfutils-libelf-devel
2.解压
$ xz -d /lib/modules/4.18.0-80.el8.x86_64/kernel/sound/soundcore.ko.xz
$ yum install kernel*
$ yum install patch
$ yum install ncurses-devel (安装alsa-utils需要)
下载的内容会在/usr/src/kernels/4.18.0-80.11.2.el8_0.x86_64
呈现出来。
下载过alsa-driver-1.0.25.tar
发现编译错误挺多。
还需要安装:alsa-utils,alsa-libs.
如果报错缺少version.h,则:
拷贝include/uapi/linux/dvb/version.h
到include/linux/version.h
$ ./configure --with-cards=hdspm --with-sequencer=yes --with-kernel=/usr/src/kernels/4.18.0-80.11.2.el8_0.x86_64
播放器安装地址:
https://blog.csdn.net/weixin_41282397/article/details/80804448
3.系统
centos7:链接 注意下载everything版本,这样包含图形界面等所有软件。
centos6:链接
centos6内核源码:链接 ,这样不一定对应的是centos6的版本,可以使用yum install kernel-devel
安装内核代码。
centos所有版本:链接
3.1 问题
发现在centos6,centos7,centos8上均无法安装alsa-driver,还有一个alsa-driver是使用git维护的,使用aclocal,autoconf等编译方式,这个也没有安装成功。
alsa-driver在centos上安装错误有.h文件找不到,函数找不到等等错误。
在centos8上编译alsa-driver-1.0.25主要是centos版本过高,而alsa-driver-1.0.25版本低,故要处理KERNEL_VERSION等宏定义问题。
centos6,centos7上则要处理io_remap等函数问题。
3.2 centos成功安装alsa-driver方法
centos版本:CentOS-7.0-1406-x86_64-Everything.iso
$ git clone git://git.alsa-project.org/alsa-driver.git
$ 压缩 tar -zcvf alsa-driver.tar alsa-driver
$ 解压 tar -zxvf alsa-driver.tar
$ git checkout build
$ git pull origin build
$ git checkout mirror
$ git pull origin mirror
$ git checkout release
$ git pull origin release
使用命令:
$ ./utils/setup-alsa-kernel /usr/src/kernels/3.10.0-123.el7.x86-64
$ cp ../Documentation /usr/src/kernels/3.10.0-123.el7.x86-64/ -rf
$ ./utils/setup-alsa-kernel -c /usr/src/kernels/3.10.0-123.el7.x86-64
$ ./gitcompile
$ make install
$ ./snddevices
下一步提示:
the mixer channels for the alsa driver are muted by default,you would use some alsa or oss mixer to set the appropriate volume
下载alsa-lib,alsa-firmware,alsa-utils文件:
$ wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.2.1.2.tar.bz2
$ wget ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.2.1.tar.bz2
$ wget ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.2.1.tar.bz2
可以使用命令:
$ less SUPPORTED_KERNELs
看支持的内核版本。
4.尝试ubuntu安装alsa
4.1 ubuntu18.04
获取源码:apt-get source linux-image-$(uname -r)
$ sudo apt-get install dpkg-dev
https://blog.csdn.net/CaspianSea/article/details/43014525
apt-cache search linux-source 和 apt-get install linux-source
5.快速安装alsa
https://alsa.opensrc.org/Quick_Install
6.fedora安装alsa
fedore29镜像地址:链接 ,它的内核版本为 linux-5.3.11。
fedora29的一些关键信息如下:
$ cat /proc/version
Linux version 5.3.11-100.fc29.x86_64 ([email protected]) (gcc version 8.3.1 20190223 (Red Hat 8.3.1-2) (GCC)) #1 SMP Tue Nov 12 20:41:25 UTC 2019
$ alsactl -v
alsactl version 1.1.9
$ ls /dev/snd
by-path controlC0 pcmC0D0c pcmC0D0p pcmC0D1c seq timer
$ lspci | grep -i audio
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01)
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: HDSPMx59356d [RME MADI_59356d], device 0: RME MADI [RME MADI]
Subdevices: 1/1
Subdevice #0: subdevice #0
$ cat /proc/asound/cards
0 [HDMI ]: HDA-Intel - HDA Intel HDMI
HDA Intel HDMI at 0xf7e14000 irq 49
1 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7e10000 irq 50
2 [HDSPMx59356d ]: HDSPM - RME MADI_59356d
RME MADI S/N 0x59356d at 0xf7d00000, irq 17
$ aplay -Dhw:1,0 -r48000 test.wav
$ cat /proc/asound/pcm
另外,如果需要停止当前的alsa服务,则:
$ sudo /etc/init.d/alsa-utils stop
查看支持的内核版本:
$ less alsa-driver/SUPPORTED_KERNELS
查看声卡解码芯片:
$ tail -2 /proc/asound/oss/sndstat
或者:
$ head -1 /proc/asound/card0/codec#0
在 alsa-driver/alsa-kernel/Documentation/ALSA-Configuration.txt 中查找自己声卡解码芯片对应的model 名字,比如alc655 对应的就是:
- alc_jack For ALC65x, turn on the jack sense mode
查看具体的声卡信息:
$ lshw -C sound
查看声卡模块:
$ cat sndmodules
使用alsamixer
设置参数并且保存:
$ alsactl store
可以使用命令:
$ speaker-test -c 6
测试6个声道的声音。
7.扩展知识
alsa声卡驱动程序一般命名规则是snd-card-
如果要做到向后兼容,需要两个模块,snd-pcm-oss和snd-mixer-oss。
在成功插入了alsa声卡模块后,系统会出现/proc/asound
目录。
在加载了snd-pcm-oss
模块之后,也能使用与oss兼容的方式读取声卡,有这样的映射关系:
alsa设备 | oss设备 | 次设备 |
---|---|---|
/dev/snd/pcmC0D0 | /dev/audio0(/dev/audio) | 4 |
/dev/snd/pcmC0D0 | /dev/dsp0(/dev/dsp) | 3 |
/dev/snd/pcmC0D1 | /dev/adsp(/dev/adsp) | 12 |
/dev/snd/pcmC1D0 | /dev/audio1 | 20 |
/dev/snd/pcmC1D0 | /dev/dsp1 | 19 |
为了让alsa正常工作,需要设置一些设备别名,例如:
设置alsa设备的主设备号,固定为116:
alas char-major-116 snd
设置oss设备的主设备号,固定为14,这样alsa复用oss设备:
alas char-major-14 soundcore
建立源码树:
1.添加mockbuild用户
$ useradd -s /sbin/nologin mockbuild
2.添加需要用到的工具
$ yum install audit-libs-devel binutils-devel
$ yum install elfutils-devel elfutils-libelf-devel
$ yum install java-devel kabi-dw openssl-devel
$ yum install perl-devel python3-devel xmlto
$ yum install python3-docutils
3.安装源码
$ rpm -iV xxx.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
$ cd ~/rpmbuild/BUILD/..
$ cp /boot/config-3.10.0-327.el7.x86_64 .config
$ make oldconfig
$ make -j2
$ make modules_install (编译内核模块)
最好加上-V,这样有错误也能显示出来。要注意make -jn
的使用,并不是n
越大越好啊,如果不指定n
的值,在centos
上也是容易死机的。
后面使用:
$ modprobe snd-pcm-oss.ko
$ modprobe snd-mixer-oss.ko
$ modprobe snd-seq-oss.ko
如果报错,可以尝试depmod
命令。
实在不行,可以考虑查看dmesg
的输出信息,如果是版本不正确,可以查看include/config/kernel.release
里面的版本是否和模块的版本一致。
最终还是不行,那就只能使用自己编译的系统内核来启动整个系统。
$ make install
这样可以添加自己的内核程序到整个系统中。也就是在系统启动的时候会多加一个系统的选择。
下面是查看模块是否被安装到内核中:
$ lsmod | grep -i "snd"
如果没有被安装,可以到/lib/modules/4.18.0-80.el8.x86_64/modules.dep
进一步查看。
查看具体声卡的信息:
$ cat /proc/asound/card0/hdsmp
可以看出lineout是打开的。
要想开机自动加载snd-pcm-oss.ko
,snd-mixer-oss.ko
,snd-seq-oss.ko
,则需要在/etc/modules-load.d/alsa.conf
,没有alsa.conf则自己建立,添加如下内容:
snd-pcm-oss
snd-mixer-oss
snd-seq-oss
可以将声音输出来。另外要注意使用alsamixer
将64个通道的生意都调节一下。否则会没有声音的。经过仔细对比,发现其左右声道是集中在63
与64
上的。
另外注意:
在
/usr/share/sounds/alsa/
中有一些测试信号,例如:Front_Center.wav
发现使用这个文件播放声音是没有问题的。
还有一个地方有文件:
/usr/share/sounds/freedesktop/stereo/complete.oga
,不过这个文件是播不了的。
8.重新建立source-tree并且编译模块与安装
8.1 找到内核源码并且安装
$ rpm -iV xxx.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
$ cd ~/rpmbuild/BUILD/..
$ cp /boot/config-3.10.0-327.el7.x86_64 .config
$ make oldconfig
$ make -j2
$ make modules_install (编译内核模块)
$ make install
使用make install
可以在启动的时候或者在启动之后能将模块插入到/lib/modules/4.18.0-80.el8.x86_64/modules.dep
中。如果使用lsmod | grep -i "snd"
发现没有被安装,可以在/etc/modules-load.d/alsa.conf
(没有alsa.conf则自己添加)添加如下内容:
snd-pcm-oss
snd-mixer-oss
snd-seq-oss
模块snd-pcm-oss.ko
,snd-mixer-oss.ko
,snd-seq-oss.ko
作用是建立/dev/dsp
,/dev/audio
等节点。其实,最终实验发现声卡hdspm
不需要
这几个节点也是没有关系的。
声卡最终可以使用:
$ cat test.wav > /dev/audio
或者
$ cat test.wav > /dev/dsp
初步验证是否能工作。
后期需要使用:
$ aplay -Dsysdefault:CARD=HDSPMx59356d /usr/share/sounds/alsa/Front_Left.wav
真正能播放出声音才是表明没问题了。
另外,贴出实验过程中使用的图片:
$ cat /proc/devices
$ cat /proc/asound/cards
$ lspci | grep -i audio
$ aplay -l
$ aplay -Dhw:0,0 -r44100 test.wav
$ alsamixer
$ aplay -L
$ speaker-test -Dplug:sysdefault -c2
$ speaker-test -Dsysdefault:CARD=HDSPMx59356d -c2
$ aplay -Dsysdefault:CARD=HDSPMx59356d test.wav
$ alsactl -v
$ 安装 pavucontrol
直接编译kernel-dev会报错,因为已经不是整个源码树了,估计是担心整个系统由于开发人员的问题而崩溃
节点与节点的作用
直接modprobe xx ,发现会导致版本等相关错误而安装不成功,后面就使用源码树编译整个内核来安装模块,就不会有问题了。
可以查看Makefile来修改linux版本与名称等内容。
源码树的版本与存放的位置
查看模块是否在某一个文件中。
$ cat /proc/asound/oss/sndstat
9.x11桌面环境
当前使用的桌面系统环境可以使用:
$ echo $DESKTOP_SESSION
gnome
$ xhost +