LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1162|回复: 3

设置默认输出声卡脚本

[复制链接]
发表于 2011-1-26 22:36:41 | 显示全部楼层 |阅读模式
之前买了个 Rapoo 无线耳机,snd_usb_audio 通用驱动即可使用;主板上有 intel 的集成声卡。然而在系统中(debian openbox)居然没有找到设置默认声卡的工具,故写之。单声卡同学请直接无视。

因查找资料时记得看到过 Ubuntu PPA 源里有 asound 的一个脚本工具可以做这个事(原理未知,没有看过内容),故我将之也命名为 asound 吧。初步完成,写得比较粗糙。诸位可随意更改,呵呵。

这个原理就很简单了:调整声卡驱动加载优先级。

用法就更简单了,不带参数直接运行获得声卡信息(id 先找到),然后再:
  1. asound sound_card_id
复制代码
需要支持 正则判断 的 bash 版本。其实是用来判断参数是否是单数字的,直接去除也行,自己用。

发现 bug 请直接跟帖,或 PM,或不屑。多谢。
  1. #!/bin/bash
  2. # 26/01/2011
  3. # - adjust priorities of modules to set the default sound card
  4. # - need root or sudo to run 'modprobe'
  5. CONFIG="/tmp/asound.conf"
  6. CARDS="/proc/asound/cards"
  7. MODS="/proc/asound/modules"
  8. function usage {
  9.     echo "  Usage: `basename $0` [sound_card_id]"
  10.     exit 1
  11. }
  12. [ $# \> 1 ] && usage
  13. N_CARDS=`sed -ne '/^ \+[0-9]\+/p' $CARDS | wc -l`
  14. # drivers not ready
  15. [ $N_CARDS == 0 ] && echo "  No sound cards found." && exit 0
  16. # info of sound cards
  17. if [ $# == 0 ]
  18. then
  19.     # detect sound cards
  20.     echo "$N_CARDS card(s) detected:"
  21.     sed -ne '/^ \+[0-9]\+/s/\[.*\]//p' $CARDS
  22.     echo "Current mixer:" `head -1 $CARDS | cut -d':' -f2`
  23.     if [ $N_CARDS \> 1 ]
  24.     then
  25.         echo ""
  26.         echo "To change default card:" "`basename $0` [sound_card_id]"
  27.     fi
  28.     exit 0
  29. fi
  30. # NAN
  31. [[ $# == 1 ]] && [[ ! ($1 =~ [0-9]) ]] && usage
  32. # id 0
  33. [ x"$1" == x"0" ] && echo "  ID 0 is the default device, so nothing changed." && exit 0
  34. if [ $1 \> $((N_CARDS-1)) ] || [ $1 \< 0 ]
  35. then
  36.     echo "  device with ID $1 not found."
  37.     exit 1
  38. fi
  39. # clean config file
  40. :>$CONFIG
  41. for ((i=0;i<$N_CARDS;i++))
  42. do
  43.     # disabled by default
  44.     inx=-2
  45.     # request
  46.     [ $i == $1 ] && inx=0
  47.    
  48.     awk '{if($1=="'$i'") printf("options %s index=%d\n", $2, "'$inx'")}' $MODS \
  49.     >> $CONFIG
  50. done
  51. MODULES=(`awk '{print $2}' $MODS`)
  52. # if busy
  53. if grep "running" /proc/asound/timers &> /dev/null
  54. then
  55.     echo "modules are busy, exit..."
  56.     exit 1
  57. fi
  58. # unload modules
  59. sudo modprobe -q -r ${MODULES[@]}
  60. # wait
  61. sleep 1
  62. # isolate unload and reload stmts to keep the index as it was
  63. # reload modules
  64. for mod in ${MODULES[@]}
  65. do
  66.     sudo modprobe -q $mod -C $CONFIG
  67. done
  68. echo "  all done!"
  69. exit 0
复制代码
发表于 2011-1-27 15:42:22 | 显示全部楼层
还有修改/etc/modprobe.d/sound的方法,但是需要重启后生效。大致的原理好像是让系统默认的0号声卡通过修改启动模块顺序发生变化。http://forum.vectorlinux.com/index.php?topic=4888.0

Ubuntu下面相应的工具是asoundconf。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-1-27 20:13:41 | 显示全部楼层
@ zhy2111314:
原理是一样的。之前查到过那样的方法(我这边是 /etc/modprobe.d/alsa-base.conf 文件),但是需要重启就不太方便了。后来了解到 modprobe 可指定 config 文件,就产生了这样的脚本。其实前面的 conf 文件是它默认加载的。
回复 支持 反对

使用道具 举报

发表于 2011-1-28 09:14:32 | 显示全部楼层
恩,不错,很久前用过usb声卡,只是那台工控机主板上没别的声卡了呵呵。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表