Slackware current on Thinkpad X61 音量控制问题

作者: forever steel(zhoun)
原发: http://guo9310.blog.163.com/

KDE中, 三个声音控制键, 现在mute是起作用的, 音量大小键只有unmute功能

1. 测试一下这三个声音键的键值
http://dl.bytesex.org/cvs-snapshots/
下载input-utils的源代码, 然后编译一下就可以用, 不用安装
1)

代码:
 
 
# ./lsinput

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 <你的键盘设备的序号>.
如我的就是

代码:
 
 
# ./input-events 0

如果不能在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控制中心->区域和辅助功能->输入动作->Preset 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)

代码:
 
 
./testmute.sh > 1.txt

4) 把kmix的Tab"开关"的喇叭和耳机这两个设备全部关闭

5)

代码:
 
 
./testmute.sh > 2.txt

6)

代码:
 
 
diff 1.txt 2.txt

, 看看输出结果

代码:
 
 
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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值