晚上本来要给兜哥看一会儿《大侦探福尔摩斯》的,结果在 Debian 8.1 系统下声卡不出声。兜哥等不及老爸我折腾,睡了,于是三太爷开始放心折腾。
系统其实能识别出声卡来,lspci -nn | grep -i audio 的输出见下:
00:06.1 Audio device [0403]: NVIDIA Corporation MCP55 High Definition Audio [10de:0371] (rev a2)
但就是没有声音。到 Windows 下看了看设备驱动,是 realtek 的,于是到官网下载了驱动的源代码(http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=14&PFid=24&Level=4&Conn=3&DownTypeID=3&GetDown=false),计划自己编译。先补全了系统内缺失的 make 和 Linux 的内核头文件(apt-get 对应的包名是 linux-headers-[uname -r])。执行 configure 成功后,执行 make 开始编译。
第一个和第二个错误都出现在 pcm_native.c 文件里,前一个是说 fget_light 函数没有声明的事,手动补上即可,根据参数和返回值很容易就能推出原型来,第二个是一个 runtime 变量定义了没有使用,把该函数下面代码中能用此变量等价替换的地方都换成它即可。编译可过。
第二个拦路的文件是 info.c。里面有一句代码使用了 __DATE__ 预定义宏,高版本编译器报错,省事的做法就是把它删除(后果是编译出的二进制文件里没有了编译日期这个字面信息)。编译可过。
第三个会出错的文件是 ua101.c。貌似需要为 snd_usbmidi_disconnect 函数添加前向声明,然后再把 __list_for_each 函数(宏?)前面的两个下划线删除。编译可过。
顺利的话,就该全部通过了。sudo make install 即可。鼓捣几下系统的 mixer,声音就有了。