|
作者: forever steel(zhoun)
原发: http://guo9310.blog.163.com/
KDE中, 三个声音控制键, 现在mute是起作用的, 音量大小键只有unmute功能
1. 测试一下这三个声音键的键值
http://dl.bytesex.org/cvs-snapshots/
下载input-utils的源代码, 然后编译一下就可以用, 不用安装
1)
2) 在lsput输出中找到*keyboard*
(X61, kernel 2.6.24-rc7):- /dev/input/event0
- bustype : BUS_I8042
- vendor : 0x1
- product : 0x1
- version : 43860
- name : "AT Translated Set 2 keyboard"
- phys : "isa0060/serio0/input0"
- bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP
复制代码
3) 运行键测试
input-events <你的键盘设备的序号>.
如我的就是
如果不能在X下面运行, 转换到一个字符终端, 运行试试
4) 按你想要测试的键 (volume up/down/mute), 会显示输入事件
5) 很奇怪的是, 音量高和低键有事件输出,静音键没有任何输出!
但是为什么能够静音呢, 是因为BIOS控制的原因
6) thinkpad-acpi的开发者建议, 在启动的时候, 给kernel加启动参数 acpi_osi=Linux, 会比较好,
在grub的menu.lst里面, 给kernel加上这个参数- kernel /boot/vmlinuz ro root=LABEL=/ acpi_sleep=s3_bios,s3_mode resume=/dev/sda6 vga=773 acpi_osi=Linux
复制代码
7)重启之后, 重复上面1)-4)的测试, 会发现有输出了, - keycode 160 : Mute
- keycode 174 : LowerVolume
- keycode 176 : RaiseVolume
复制代码
8) 但是现在的问题是, 虽然有按键事件了, 但是静音功能也不能用了!
因为BIOS现在是不控制了, 需要软件来控制音量和静音功能了
2. 给~/.Xmodmap加入下面三行, 让X知道这三个按键事件
- keycode 160 = XF86AudioMute
- keycode 174 = XF86AudioLowerVolume
- keycode 176 = XF86AudioRaiseVolume
复制代码
3. 让.Xmodmap起作用, 执行xmodmap ~/.Xmodmap, 或者重启KDE, 也可以
4. 这时候按键, 发现屏幕有显示了, 有静音关, 静音开, 0%, 11%, 虽然有显示, 但是功能一点没有,
这个显示是kmilo的作用, 可以通过控制中心->KDE组件->启动服务,
看到有kmilo服务在运行
控制中心->系统管理->Thinkpad 便携电脑, 这个功能是kmilo的一个插件,
但是现在有bug, 虽然显示正常, 但音量控制功能不正常.
据说ubuntu的kde-utils已经修正了这个bug, 但我没有用升级的方式解决
原因是
其他的thinkpad快捷键, 是通过acpi事件控制, 然后通过osd_cat显示的,
干脆这个音量控制也统一用这种osd_cat方式
所以还是自己解决吧
5. 把kmilo服务停了, 把自动启动的勾勾掉
6. 写一个脚本volume.sh, 跟acpi事件处理脚本放在一起,用osd_cat控制屏幕显示, 用kmix控制音量
dcop真是个好东西, 刚发现这个功能是如此强大, 学习中, 正好试试
/etc/acpi/volume.sh
- #!/bin/bash
- KMIX="dcop kmix Mixer0"
- osd() {
- pkill osd_cat
- echo $@ | osd_cat -p bottom -A center -c green -d 5 -O 1 -u black -f "-adobe-helvetica-bold-r-normal-*-*-320-*-*-p-*-iso8859-1" &
- }
- mute() {
- $KMIX setMute 0 $@
- $KMIX setMute 13 $@
- $KMIX setMute 14 $@
- }
- case "$1" in
- mute)
- mute "on"
- osd "mute on"
- ;;
- up)
- mute "off"
- $KMIX setMasterVolume $(expr $($KMIX masterVolume) + 7)
- osd $($KMIX masterVolume) %
- ;;
- down)
- mute "off"
- $KMIX setMasterVolume $(expr $($KMIX masterVolume) - 3)
- osd $($KMIX masterVolume) %
- ;;
- esac
- sleep 5
- pkill osd_cat
- exit 0
复制代码
7. 添加这三个音量控制键的输入动作
KDE控制中心->区域和辅助功能->输入动作->reset Actions
添加三个动作, 动作类型都为: 键盘快捷方式->命令/URL(简单),- 1) mute XF86AudioMute /etc/acpi/volume.sh mute
- 2) volumeUp XF86AudioLowerVolume /etc/acpi/volume.sh down
- 3) volumeUp XF86AudioRaiseVolume /etc/acpi/volume.sh up
复制代码
8. 脚本的mute函数中, 对应的0,13,14是kmix的deviceidx,
本来kmix中有setMasterVolume, toggleMasterMute等直接控制主声道的方法,
但是Intel的集成声卡一般都没有主声道, 即使用kmix主声道静音(喇叭是灰色, 有删除线), 还是有声音,
想静音只有控制kmix的Tab"开关"的喇叭和耳机这两个设备.
所以只能想办法找出对应的喇叭和耳机的deviceidx,
直接控制这些设备的状态
1) 写一个脚本, testmute.sh- #!/bin/sh
- i=0
- while [ $(($i <= 20)) ] && [ $(dcop kmix Mixer0 isAvailableDevice $i) == "true" ]; do
- echo $i $(dcop kmix Mixer0 mute $i)
- i=$(($i+1))
- done
- exit 0
复制代码
2) 把kmix的Tab"开关"的喇叭和耳机这两个设备全部开启
3)
4) 把kmix的Tab"开关"的喇叭和耳机这两个设备全部关闭
5)
6), 看看输出结果- 1c1
- < 0 false
- ---
- > 0 true
- 14c14
- < 13 false
- ---
- > 13 true
复制代码
7) 上面的结果说明0, 13分别是喇叭和耳机,
看看你的是什么数字, 替换一下volume.sh中对应的数字就可以了
9. 现在这三个音量控制键就可以使用了!
注意
1. osd_cat只支持点阵字体, 我还没有试能不能用中文点阵字体
2. AudioLowerVolume和AudioRaiseVolume这两个键的步长不一样, 亮度的也是, 很奇怪,
所以脚本中调整了一下数字, 步长都为约5%
3. 脚本中控制静音用了三个设备, 是发现有时候喇叭的这个13 deviceidx有时候会变成14, 干脆都设置
4. kdcop, 这个是dcop浏览器, 非常有用, 可以浏览和查询可用的dcop方法 |
|