123下一页
返回列表 发布新帖

XPEnoboot 5.2 驱动编译 & Mplayer 玩法

17086 45
发表于 2016-8-22 18:08:00 | 查看全部 阅读模式
本帖最后由 svdztn 于 2016-10-18 10:14 编辑

首先,感谢XPEnoboot制作组的大神们的工作和分享精神,让我们能在更多的平台上使用DSM。

一直苦于板载声卡不能用,最近,XPEnoboot 5.2-5967.1发布的同时,制作组放出了相应的内核源码,这样就可以编译我们自己的驱动了。
DSM 5.2 使用的内核版本号为3.10.35,理论上此次放出的内核对DSM 5.2版本均可使用。(我只测试了5529和5967,其他版本不保证一定可用,测试过的朋友请告知下)
驱动加载有两种方式:一种是编译进内核,另一种是编译成模块,在内核外加载。
对于这两种方式,经测试均可。

编译进内核的方式,需要重新编译内核,然后替换启动U盘中的zImage内核映像,相比加载模块来说风险更大些,所以我们后面再介绍此种方式。

编译成模块的方式,只需要编译我们需要的驱动,然后放进NAS中加载即可,更方便、安全。
就具体编译方式来说,也有两种:在内核代码下,使用make modules编译;自己下载相应的驱动代码,单独编译。其实这两种方式是一样的,比如我这次编译的声卡驱动,内核代码中本来就有,只需要把menuconfig中相应选项打开,编译一下就可以了,但如果你需要的驱动内核中没有,那就只能自己单独编译了。

下面以编译板载声卡驱动为例,介绍编译驱动的过程,编译其他驱动也与之类似。

1.编译环境搭建
(参考http://xpenology.com/wiki/en/building_xpenology
我使用的Ubuntu 12.10虚拟机(可以用更新一点的版本,老版本的源不好找)
最好再装上VMware Tools,方便使用。

安装一些工具。(有几个我觉得没啥必要)
sudo apt-get install git libc6-i386 build-essential libncurses5-dev

下载群晖官方放出的GCC编译链,我用的是:DSM Beta 5.2 Tool Chains -> Intel x86 Linux 3.10.35 (Bromolow) -> bromolow-gcc473_glibc217_x86_64-GPL
http://sourceforge.net/projects/dsgpl/files/
使用 tar -Jxf 把gcc包解压到自己喜欢的位置,(我放到/usr/local/下)
如果以后使用gcc时不想每次都用绝对路径,可以将 x86_64-pc-linux-gnu/bin 添加进环境变量$PATH中

下载XPEnoboot5.2内核源码,http://xpenology.com/forum/viewtopic.php?f=2&t=5026
使用 tar -Jxf 把源码包解压到自己喜欢的位置,(我放到/usr/src/下)


喜欢的话,可以从装好的XPEnology5.2-5967中,/proc目录下,将config.gz复制出来,这就是XPEnoboot-5967的内核配置文件。(后面我会放到附件里)
解压后重命名为 ".config",放到内核源码目录下

2.编译驱动
在内核源码目录下

编辑配置文件(未编辑环境变量的,使用类似 CROSS_COMPILE=/usr/local/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu- 的绝对路径)
make ARCH=x86_64 CROSS_COMPILE=x86_64-pc-linux-gnu- menuconfig
将自己需要的驱动设置为“M”

编译驱动
make ARCH=x86_64 CROSS_COMPILE=x86_64-pc-linux-gnu- modules

编译完成后,生成的.ko文件分别在各自的源码目录下
可使用 find -name *.ko 查找其位置
之后可以手动或使用脚本将其复制到同一目录下

2*.
单独下载驱动代码包编译

在解压好的驱动代码目录下运行./configure 配置相应参数,如输出路径,依赖路径,编译器等
如我编译ens1371声卡驱动
./configure --prefix=[.ko文件的输出路径] --with-kernel=/usr/src/linux-xpenoboot-5.2.5967.1 --with-cards=ens1371 --with-cross=x86_64-pc-linux-gnu-

编译
make

导出驱动
make install

单独编译的好处是生成的ko文件可以直接输出到指定目录下
(或许在内核目录下编译也可以,高手请指教)

3.目标平台加载驱动
把相应的ko文件传到nas的/lib/modules/[自定义一个目录]/
注意,一定要在modules下新建一个目录,对于我编译的声卡驱动来说,生成新的snd.ko文件,但nas中原来就有此文件,但其中缺少对新编译驱动的支持,如果直接替换,每次关机重启后,新的snd.ko文件会被启动U盘中原来的snd.ko文件覆盖。


对于我编译的声卡驱动
lsmod |grep snd
如果snd.ko已经被加载,就使用rmmod将它以及依赖它的模块卸载
使用modprobe 加载我们编译好的新驱动
比如:我编译的虚拟机中使用的声卡驱动为snd-ens1371.ko
modprobe snd-ens1371.ko
就可以将它以及它依赖的驱动加载上


查看/dev/snd目录下多了 pcmC0D0c,pcmC0D0p等,几个文件,就说明声卡驱动已经加载上了。
也可以使用lspci -v 查看声卡信息

至此,声卡驱动编译,加载完成,但想让它出声音,还需要alsa-lib和alsa-utils,如果想听歌或是流媒体的话,还需要播放器,我使用的是mplayer,每天定时播放电台广播,用来当闹钟,嘿嘿。
这些就后面开贴再做介绍吧。



XPEnologyXPEnology

评论45

hzjnetLv.5 发表于 2016-11-30 10:50:34 | 查看全部
支持加精  好文
回复 点赞

使用道具 举报

KillingJacky 发表于 2016-11-25 10:43:29 | 查看全部
这应该是个加精的贴子啊
回复 点赞

使用道具 举报

hzjnetLv.5 发表于 2016-11-11 15:03:06 | 查看全部
谢谢  作者能留个联系吗?  我的Q是145649872
回复 点赞

使用道具 举报

hzjnetLv.5 发表于 2016-11-11 14:51:14 | 查看全部
本帖最后由 hzjnet 于 2016-11-15 20:00 编辑

帅  能留个IM或者其它的联系吗?  我的QQ和维信都是15640872。好 谢谢楼主 ,kernel和mod都编译好了  继续试试32位的
回复 点赞

使用道具 举报

svdztn楼主 发表于 2016-10-28 14:46:53 | 查看全部
说说播放器的随机策略

听歌喜欢将很多歌加入播放列表,然后使用随机播放。但很多播放器的随机策略不好,有些是经常重复播某些歌,但另一些又一直播不到;有些是列表循环播放过一轮后,第二轮的顺序和前一轮一模一样。

查看了一下mplayer处理播放列表部分的代码,它的做法是,随机播放时,每播放一首歌时,都会把这首歌做一个标记;当本首歌播放完后,再从播放列表中未做标记的歌中随机选取一首来播放,如此循环;当检测到所有歌全都做了标记时,就代表播放列表已全部播放,此时再清除所有标记,开始新一轮的循环。

这样做就避免了前面说的两个问题,但我在使用中,又遇到了另一个问题:每次运行mplayer听歌时,不会记住之前已播放的标记,也就是每次重新打开播放器时,列表中已播放的标记都是空的,所以还是会经常重复听到前一次播放的歌。

闲来无事,强迫症大发作,尝试修改了一下mplayer播放列表处理部分的代码,将播放列表的数据写入到外部文件中,当每次做已播放标记时,同步修改外部文件中的相应标记。这样,每次播放器重新启动时,先从外部保存的播放列表文件中读取相关数据,就可以从上次退出的位置继续随机播放了。

代码见附件。

回复 点赞

使用道具 举报

svdztn楼主 发表于 2016-10-28 14:03:15 | 查看全部
本帖最后由 svdztn 于 2016-10-28 15:13 编辑

修改版alarm_start与alarm_stop
增加守护功能,若mplayer意外退出,会自行重启,每1分钟检查一次。运行alarm_stop后,关闭mplayer,同时关闭守护。

alarm_start.sh:
  1. task="null"
  2. testflag=0 #Play/Test#
  3. abort=0


  4. ##-----------------Read Para-----------------##
  5. while getopts "t" arg
  6. do
  7.         case $arg in
  8.                 t)
  9.                         testflag=1
  10.                         ;;
  11.                 ?)
  12.                         echo "unkonw argument"
  13.                         exit 1
  14.                         ;;
  15.         esac
  16. done


  17. ##----------------- Play -----------------##
  18. if [ $testflag -eq 0 ];then

  19. ##PLAY##
  20. /volume1/@appstore/mplayer/bin/mplayer rtmp://................ </dev/null >/dev/null 2>&1 &

  21. ##Search schedule##
  22. schedule=$(cat /etc/crontab | grep alarm_start | grep -v grep)

  23. ##schedule not found##
  24. if [ -z "$schedule" ];then
  25. ##Bakup crontab##
  26. cp -f /etc/crontab /etc/crontab.bak
  27. ##Write crontab##
  28. task="/volume1/@appstore/sh/alarm_start.sh"
  29. echo "*        *        *        *        *        root        $task -t">>/etc/crontab
  30. ##Reload config##
  31. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  32. kill $crondpid
  33. fi

  34. exit 0
  35. fi


  36. ##----------------- Test -----------------##
  37. if [ $testflag -eq 1 ];then
  38. stillRunning=$(ps | grep mplayer | grep -v grep)

  39. if [ -z "$stillRunning" ];then
  40. task="/volume1/@appstore/sh/alarm_start.sh"
  41. `$task`
  42. fi

  43. exit 0
  44. fi


  45. ##----------------- Error -----------------##
  46. exit 1
复制代码


alarm_stop.sh:
  1. ##----------------- Schedule -----------------##

  2. ##Search schedule##
  3. schedule=$(cat /etc/crontab | grep alarm_start | grep -v grep)

  4. ##schedule found##
  5. if [ -n "$schedule" ];then

  6. ##Del all mpalarm schedule##
  7. task="/volume1/@appstore/sh/alarm_start.sh"
  8. sed -i "s#$task#dEltAsktEmp#" /etc/crontab
  9. sed -i '/dEltAsktEmp/d' /etc/crontab

  10. ##Reload config##
  11. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  12. kill $crondpid

  13. fi


  14. ##----------------- Kill Process -----------------##
  15. NAME=$(ps | grep mplayer |grep -v grep | awk 'NR==1{print $1}')
  16. kill $NAME

  17. exit 0
复制代码



回复 点赞

使用道具 举报

svdztn楼主 发表于 2016-10-17 16:47:32 | 查看全部
本帖最后由 svdztn 于 2016-10-17 17:25 编辑

再说说mplayer的玩法。

玩法一:
电台闹钟,其实就是定时播放网络流媒体。

脚本 alarm_start.sh:
  1. /.../mplayer/bin/mplayer rtmp://................ </dev/null >/dev/null 2>&1 &
复制代码
流媒体地址根据自己的喜好来设定,在DSM任务计划中,添加定时任务,定时执行alarm_start.sh,播放流媒体。


脚本 alarm_stop.sh:
  1. NAME=$(ps | grep mplayer |grep -v grep | awk 'NR==1{print $1}')
  2. kill $NAME
复制代码
在DSM任务计划中,添加定时任务,定时执行alarm_stop.sh,关闭播放器。




玩法二:
NAS,作为家里的媒体服务器,本地音乐文件都放在上面,用手机播放效果不好,而且音量不够,用nas的外接音箱来播放挺不错。
控制端使用Android手机上的ServerAssistant软件,可以将控制台命令做成按钮,一键完成SSH登录和执行命令。

脚本 volume_set.sh:
  1. ##set Volume##
  2. vol=$1

  3. if [ $# -eq 0 ];then
  4. echo -------------------------------------
  5. echo No volume input,leave without modify
  6. echo -------------------------------------
  7. echo Current Volume:
  8. amixer |grep -A 4 Master
  9. exit 0
  10. fi

  11. if [ $vol -gt 100 ] || [ $vol -lt 0 ];then
  12. echo Error:Input volume error
  13. exit 1
  14. fi

  15. echo set volume = $vol
  16. amixer -q set Master unmute $vol%
  17. #amixer -q set Front unmute $vol%
  18. exit 0
复制代码
功能:设置/查看音量
用法:volume_set.sh [volume]
如:volume_set.sh 90即为设置音量为90%
不带参数时为查看音量


脚本 music_start.sh:
  1. ##play music##
  2. /.../mplayer/bin/mplayer -loop 0 -shuffle /.../* </dev/null >/dev/null 2>&1 &
复制代码
播放指定目录下的所有文件
(-loop 0:无限循环;  -shuffle:随机播放)


如果睡觉前播放,定时关闭是少不了的,
脚本 timer.sh:
  1. sethour=0
  2. setmin=0
  3. task="null"
  4. dsflag=0 #Do/Set#
  5. abort=0
  6. setvolume=-1

  7. ##-----------------Read Para-----------------##
  8. while getopts "h:m:d:s:v:A" arg
  9. do
  10.         case $arg in
  11.                 h)
  12.                         sethour=$OPTARG
  13.                         echo sethour = $sethour
  14.                         ;;
  15.                 m)
  16.                         setmin=$OPTARG
  17.                         echo setmin = $setmin
  18.                         ;;
  19.                 d) #DO TASK#
  20.                         task="$OPTARG"
  21.                         dsflag=1
  22.                         ;;
  23.                 s) #SET TASK#
  24.                         task="$OPTARG"
  25.                         dsflag=0
  26.                         ;;
  27.                 v) #SET VOLUME#
  28.                         setvolume="$OPTARG"
  29.                         ;;
  30.                 A) #ABORT ALL TASKS#
  31.                         abort=1
  32.                         ;;
  33.                 ?)
  34.                         echo "unkonw argument"
  35.                         exit 1
  36.                         ;;
  37.         esac
  38. done
  39. echo "-----------------"

  40. ##-----------------Abort All Tasks-----------------##
  41. if [ $abort -eq 1 ];then
  42. echo ABORT ALL TASKS

  43. ##Del all timer.sh tasks from crontab##
  44. task="/volume1/@appstore/sh/timer.sh"
  45. sed -i "s#$task#dEltAsktEmp#" /etc/crontab
  46. sed -i '/dEltAsktEmp/d' /etc/crontab

  47. ##Reload config##
  48. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  49. kill $crondpid

  50. exit 0
  51. fi

  52. ##-----------------Set Task-----------------##
  53. if [ $dsflag -eq 0 ];then

  54. ##Shortcut for mpstop.sh##
  55. if [ "$task" = "mpstop" ];then
  56. task="/volume1/@appstore/sh/mpstop.sh"
  57. fi

  58. ##Check input time##
  59. if [ $sethour -eq 0 ] && [ $setmin -eq 0 ];then
  60. echo "Error: No time input,exit without change..."
  61. exit 1
  62. fi

  63. ##Check input task##
  64. if [ "$task" = "null" ];then
  65. echo "Error: No task input,exit without change..."
  66. exit 1
  67. fi

  68. echo SET TASK ["$task"]

  69. ##Check volume set##
  70. if [ $setvolume -ge 0 ];then
  71. if [ $setvolume -gt 100 ];then
  72. echo "Error:Input volume error,exit without change..."
  73. exit 1
  74. else
  75. echo SET VOLUME ["$setvolume"]
  76. fi
  77. fi

  78. if [ "$task" = "null" ];then
  79. echo "No task input,exit without change..."
  80. exit 1
  81. fi

  82. ##Calc time##
  83. nhour=`date +%H`
  84. nmin=`date +%M`
  85. if [ $nhour -lt 10 ];then #convert "08" to "8"#
  86. nhour=${nhour:1:1}
  87. fi
  88. if [ $nmin -lt 10 ];then
  89. nmin=${nmin:1:1}
  90. fi

  91. thour=$(($nhour+$sethour))
  92. tmin=$(($nmin+$setmin))

  93. if [ $tmin -gt 59 ];then
  94. thour=$(($thour+$(($tmin/60))))
  95. tmin=$(($tmin%60))
  96. fi
  97. if [ $thour -gt 23 ];then
  98. thour=$(($thour%24))
  99. fi

  100. echo RUN TIME [$thour:$tmin]

  101. ##Bakup crontab##
  102. cp -f /etc/crontab /etc/crontab.bak

  103. ##Write crontab##
  104. if [ $setvolume -ge 0 ];then
  105. echo "$tmin        $thour        *        *        *        root        /volume1/@appstore/sh/timer.sh -h $thour -m $tmin -d $task -v $setvolume">>/etc/crontab
  106. else
  107. echo "$tmin        $thour        *        *        *        root        /volume1/@appstore/sh/timer.sh -h $thour -m $tmin -d $task">>/etc/crontab
  108. fi

  109. ##Reload config##
  110. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  111. kill $crondpid

  112. exit 0
  113. fi


  114. ##-----------------Do Task-----------------##
  115. if [ $dsflag -eq 1 ];then
  116. echo DO TASK ["$task"]

  117. ##Run task##
  118. `$task`

  119. ##Set Volume##
  120. if [ $setvolume -ge 0 ];then
  121. `/volume1/@appstore/sh/volume_set.sh $setvolume`
  122. fi

  123. ##Del task from crontab##
  124. task="/volume1/@appstore/sh/timer.sh -h $sethour -m $setmin -d $task"
  125. sed -i "s#$task#dEltAsktEmp#" /etc/crontab
  126. sed -i '/dEltAsktEmp/d' /etc/crontab

  127. ##Reload config##
  128. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  129. kill $crondpid

  130. exit 0
  131. fi
复制代码
功能:定时执行指定命令或脚本,且执行完成后,删除相应的定时任务
用法:timer.sh [-h hour] [-m minute] [-d do] [-s set] [-v volume] [-A]
参数解释:

-h 设定多少小时后执行指定命令(大于24,按对24取余计算)
-m 设定多少分钟后执行指定命令(可以大于60)
(-h与-m可单独使用也可一起使用)
-d 此参数不需手动使用
-s 设定定时执行指定命令或脚本
-v 执行定时任务时,是否重新设定音量(即执行上面的volume_set.sh脚本)
-A 清除此前设定的全部任务(不会清除DSM原来的任务,请放心使用)

举例:
  1. timer.sh -h 1 -m 30 -s /.../alarm_stop.sh -v 100
复制代码
  1. timer.sh -m 90 -s /.../alarm_stop.sh -v 100
复制代码
即:1小时30分后,运行“/.../alarm_stop.sh”脚本,并将音量设置为100%
其实这个脚本的原理是,先向crontab中写入一条定时任务,即1小时30分后,以“-d”参数运行timer.sh本身;
timer.sh以“-d”参数运行时,先执行指定命令,即“/.../alarm_stop.sh”脚本和“volume_set.sh 100”;
然后删除crontab中指定的定时任务。
注:
timer.sh中出现的脚本路径,需要根据自己的实际情况修改。



最后,声明一句,上述脚本均经本人DSM上测试,若在其他人的主机上运行出现不可预期的后果,造成的损失本人不负责。




回复 点赞

使用道具 举报

svdztn楼主 发表于 2016-10-17 15:12:28 | 查看全部
本帖最后由 svdztn 于 2016-10-17 17:30 编辑

很久没更新了,这回说说mplayer的编译。
为什么要用mplayer呢,因为它支持在控制台操作(其实是没用过别的播放器,嘿嘿)。
mplayer的功能还是很强大的,支持本地音、视频播放,网络流媒体播放。反正我需要的就这么多,而且我也不需要视频播放。

mplayer官网:
http://www.mplayerhq.hu/design7/news.html

下载代码,解压到虚拟机中;
下载解码器 Binary Codec Packages,选择平台“Linux AMD64”。解压到将要生成mplayer可执行文件的目录,我放到了.../mplayer/lib/codecs下;如果不需要gui界面的话,可以不下载皮肤。

要成功编译mplayer,需要先安装nasm和zlib,可以下载代码编译安装,也可以使用apt-get install安装。

配置mplayer:
  1. ./configure --prefix=/home/test/project/product/mplayer --host-cc=gcc --cc=x86_64-pc-linux-gnu-gcc --enable-alsa --target=amd64-linux --enable-cross-compile --codecsdir=/home/test/project/product/mplayer/lib/codecs --confdir=/home/test/project/product/mplayer
复制代码

简单解释下:
--prefix=/home/test/project/product/mplayer
生成可执行文件的目录。

--cc=x86_64-pc-linux-gnu-gcc
指定编译器。

--codecsdir=/home/test/project/product/mplayer/lib/codecs
前面下载的解码器目录。

--confdir=/home/test/project/product/mplayer
配置文件输出目录。

需要界面的,可以加上参数--enable-gui,带界面的我只在Ubuntu里运行过,应该需要X11支持


运行过configure后,如果没错误的话,会生成一个config.mak文件,重点来了。。。
因为我的DSM运行在AMD平台,而我的编译环境(即虚拟机)为Intel平台,configure这个脚本会自动判断当前编译平台的cpu,当我用上述配置直接编译时,发现生成的可执行文件放到DSM下运行不了。

查看编译器选项后,发现需要增加两个相关处理器优化的参数,因为暂时没找到configure相关配置参数,
直接修改config.mak文件:
在 “CFLAGS   =”后,增加参数
  1. -march=amdfam10 -mtune=amdfam10
复制代码

(如果DSM为与编译环境同平台,应该就不需要增加)

下面是完整的CFLAGS:
  1. CFLAGS   = -Wundef -Wall -Wno-switch -Wno-parentheses -Wpointer-arith -Wredundant-decls -Werror=format-security -Wstrict-prototypes -Wmissing-prototypes -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Werror-implicit-function-declaration -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ISOC99_SOURCE -I. -Iffmpeg -O4 -march=amdfam10 -mtune=amdfam10 -pipe -ffast-math -fomit-frame-pointer -fno-tree-vectorize -fno-asynchronous-unwind-tables -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE  -fpie -DPIC -D_REENTRANT  -DZLIB_CONST
复制代码

之后make和make install,
mplayer就在--prefix目录下等你了。





回复 点赞

使用道具 举报

四哥!Lv.6 发表于 2016-10-13 19:24:44 | 查看全部
本人新手,用5.2的XPEnoboot,主板网卡是RTL8111E,系统只认成百兆,想自己编译加进驱动,看到楼主的帖子就想动手试下,虚拟机装好Ubuntu15了,请问楼主可以发下详细点的教程吗?新手+鸟语白痴看不懂啊。最好能私下指导下。非常感谢。
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-10-13 17:35:26 | 查看全部
可考虑IPOIB的驱动。
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-10-13 17:34:08 | 查看全部
latest DSM(6.0x):kernel sources uploaded ,"I have 7274 source repo here https://github.com/quiknick/7274-kernel." ;
"kernel sources uploaded : http://setsunakawa.ddns.net/synology/dsm6/",来自:
A new loader for latest DSM
http://xpenology.com/forum/viewtopic.php?f=2&t=20216
回复 点赞

使用道具 举报

kingzwj168Lv.10 发表于 2016-10-12 15:03:50 | 查看全部
能照葫芦画瓢编译出6.0的引导就好了
回复 点赞

使用道具 举报

CZQ83Lv.6 发表于 2016-10-12 01:54:27 | 查看全部
LZ能帮编译一个BCM43602CS的无线网卡驱动吗......求!
回复 点赞

使用道具 举报

superwh 发表于 2016-9-18 23:18:29 | 查看全部
感觉好强大。。。
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-9-18 15:37:59 | 查看全部
svdztn 发表于 2016-9-14 16:12
应 avivi 的要求,简单说一下alsa相关的东西。
简单来说,alsa层次结构如下:

十分感谢!!
回复 点赞

使用道具 举报

wokexi 发表于 2016-9-17 18:25:59 | 查看全部
这个好专业啊,收藏了谢谢
回复 点赞

使用道具 举报

svdztn楼主 发表于 2016-9-14 16:12:45 | 查看全部
应 avivi 的要求,简单说一下alsa相关的东西。
简单来说,alsa层次结构如下:

alsa app
--------
alsa lib
--------
alsa driver

alsa driver:
我们知道,在linux下,应用程序是不能直接操作硬件设备的,要想使用设备,必须通过操作系统来完成,操作系统调用驱动程序与设备进行通信。alsa driver就是注册在内核的一个驱动模块,它负责与声卡通信,并把声卡描述成设备文件,从而应用程序就可以通过open、write等文件操作来操作声卡了。

alsa lib:
对于应用程序来说,如果直接调用设备文件,open、write、read等操作,这些操作在功能上太过于简单(或者说太底层),使用起来不够方便。为了使应用程序不必太过于关心底层操作,就需要将各种底层操作组合起来,构成更复杂、更高级的操作,再封装成接口函数,提供给上层的应用程序来使用,这就是alsa lib的作用。

alsa app:
各种播放器、alsa utils就属于这一层,alsa utils提供一组alsa音频相关的工具,通过这些工具,我们可以设置音量、测试声卡、编辑音频等,有些类似于windows下的音量合成器,但功能上更强大些。


关于alsa-lib和alsa-utils的编译,网上有很多资料,各个参数的设置解释也比较详细,这里我只做下简单的介绍,重点说下我觉得需要注意的细节。


先下载alsa-lib和alsa-utils的源码,两者版本尽量一致,我用的1.0.25,解压到编译环境中。


按照自下而上的原则,先编译alsa-lib,alsa-lib代码目录下:
./configure --host=x86_64-pc-linux-gnu --prefix=/usr/local
make
make install


再编译alsa-utils,alsa-utils代码目录下:
./configure --host=x86_64-pc-linux-gnu --prefix=/usr/local --with-alsa-inc-prefix=/usr/local/include --with-alsa-prefix=/usr/local/lib --disable-xmlto --with-curses=ncurses
make
make install



注意:
1.--with-alsa-inc-prefix 与 --with-alsa-prefix 是上面alsa-lib安装后,头文件和库文件所在的目录,要与上面alsa-lib设置对应好。
2.重点说下alsamixer
alsamixer是一个可以在shell下提供图形化界面的音量控制器,界面如下:

alsamixer

alsamixer

它使用起来比amixer更方便些
但它需要ncurses支持,所以如果需要alsamixer的话,需要下载ncurses源码,并编译一下(网上说可以用apt-get install libncurses5-dev安装,可能我的ubuntu源不大好),编译完成后,如果./configure配置 alsa-utils时,还提示检测不到ncurses,可以把生成的ncurses的头文件和库文件放到DSM-gcc编译器相应目录下(没找到为这个编译器指定默认include和lib目录的方法,哪位大神知道的话还请不吝赐教)
如果嫌麻烦的话,也可以不编译alsamixer,使用--disable-alsamixer参数配置configure
没有alsamixer,也可以使用amixer命令也可以设置音量等参数。

编译完成后,把生成目录下的lib、bin、sbin、share放到NAS的相应目录下(如果这些目录下原来就有其他文件,注意只考这次编译生成的文件,用文件修改时间做参考)
注意:
1.lib目录下的文件应该放到NAS的lib64下
2.share目录在NAS中的绝对路径要与在编译环境下一致。

声卡驱动一般默认静音,可以使用alsamixer,按m键开启,上下键调整音量;
也可以使用命令:
amixer -q set Master unmute 100%
amixer -q set PCM unmute 100%
不同的声卡,调整的项目可能不同,不一定使用Master和PCM


测试:
aplay /usr/local/share/sounds/alsa/Front_Center.wav
回复 点赞

使用道具 举报

tosspLv.7 发表于 2016-9-14 12:46:27 | 查看全部
make,,,这个好
回复 点赞

使用道具 举报

liruishengLv.4 发表于 2016-9-14 02:51:08 | 查看全部
哇...超屌啊...感谢啊
回复 点赞

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

投诉/建议联系

support@gebi1.cn

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 隔壁网 版权所有 All Rights Reserved. 粤ICP备14056481号-1
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表