LinuxSir.cn,穿越时空的Linuxsir!

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

Slackware current on Thinkpad X61 音量控制问题

[复制链接]
发表于 2008-1-15 12:43:43 | 显示全部楼层 |阅读模式
作者: forever steel(zhoun)
原发: http://guo9310.blog.163.com/

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

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

2) 在lsput输出中找到*keyboard*
(X61, kernel 2.6.24-rc7):
  1. /dev/input/event0
  2.    bustype : BUS_I8042
  3.    vendor  : 0x1
  4.    product : 0x1
  5.    version : 43860
  6.    name    : "AT Translated Set 2 keyboard"
  7.    phys    : "isa0060/serio0/input0"
  8.    bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP
复制代码

3) 运行键测试
   input-events <你的键盘设备的序号>.
   如我的就是
  1.   # ./input-events 0
复制代码
  
  如果不能在X下面运行, 转换到一个字符终端, 运行试试

4) 按你想要测试的键 (volume up/down/mute), 会显示输入事件

5) 很奇怪的是, 音量高和低键有事件输出,静音键没有任何输出!
但是为什么能够静音呢, 是因为BIOS控制的原因

6) thinkpad-acpi的开发者建议, 在启动的时候, 给kernel加启动参数 acpi_osi=Linux, 会比较好,
在grub的menu.lst里面, 给kernel加上这个参数
  1. kernel /boot/vmlinuz ro root=LABEL=/ acpi_sleep=s3_bios,s3_mode resume=/dev/sda6 vga=773 acpi_osi=Linux
复制代码

7)重启之后, 重复上面1)-4)的测试, 会发现有输出了,
  1. keycode 160 : Mute
  2. keycode 174 : LowerVolume
  3. keycode 176 : RaiseVolume
复制代码

8) 但是现在的问题是, 虽然有按键事件了, 但是静音功能也不能用了!
因为BIOS现在是不控制了, 需要软件来控制音量和静音功能了

2. 给~/.Xmodmap加入下面三行, 让X知道这三个按键事件
  1. keycode 160 = XF86AudioMute
  2. keycode 174 = XF86AudioLowerVolume
  3. 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
  1. #!/bin/bash
  2. KMIX="dcop kmix Mixer0"
  3. osd() {
  4.         pkill osd_cat
  5.         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" &
  6. }
  7. mute() {
  8.         $KMIX setMute 0 $@
  9.         $KMIX setMute 13 $@
  10.         $KMIX setMute 14 $@
  11. }
  12. case "$1" in
  13.         mute)
  14.                 mute "on"
  15.                 osd "mute on"
  16.                 ;;
  17.         up)
  18.                 mute "off"
  19.                 $KMIX setMasterVolume $(expr $($KMIX masterVolume) + 7)
  20.                 osd $($KMIX masterVolume) %
  21.                 ;;
  22.         down)
  23.                 mute "off"
  24.                 $KMIX setMasterVolume $(expr $($KMIX masterVolume) - 3)
  25.                 osd $($KMIX masterVolume) %
  26.                 ;;
  27. esac
  28. sleep 5
  29. pkill osd_cat
  30. exit 0
复制代码

7. 添加这三个音量控制键的输入动作
KDE控制中心->区域和辅助功能->输入动作->reset Actions
添加三个动作, 动作类型都为: 键盘快捷方式->命令/URL(简单),
  1. 1) mute             XF86AudioMute                           /etc/acpi/volume.sh mute
  2. 2) volumeUp         XF86AudioLowerVolume                /etc/acpi/volume.sh down
  3. 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
  1. #!/bin/sh
  2. i=0
  3. while [ $(($i <= 20)) ] && [ $(dcop kmix Mixer0 isAvailableDevice $i) == "true" ]; do
  4.         echo $i $(dcop kmix Mixer0 mute $i)
  5.         i=$(($i+1))
  6. done
  7. exit 0
复制代码

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

3)
  1. ./testmute.sh > 1.txt
复制代码

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

5)
  1. ./testmute.sh > 2.txt
复制代码

6)
  1. diff 1.txt 2.txt
复制代码
, 看看输出结果
  1. 1c1
  2. < 0 false
  3. ---
  4. > 0 true
  5. 14c14
  6. < 13 false
  7. ---
  8. > 13 true
复制代码


7) 上面的结果说明0, 13分别是喇叭和耳机,
看看你的是什么数字, 替换一下volume.sh中对应的数字就可以了


9. 现在这三个音量控制键就可以使用了!

注意
1. osd_cat只支持点阵字体, 我还没有试能不能用中文点阵字体
2. AudioLowerVolume和AudioRaiseVolume这两个键的步长不一样, 亮度的也是, 很奇怪,
所以脚本中调整了一下数字, 步长都为约5%
3. 脚本中控制静音用了三个设备, 是发现有时候喇叭的这个13 deviceidx有时候会变成14, 干脆都设置
4. kdcop, 这个是dcop浏览器, 非常有用, 可以浏览和查询可用的dcop方法
 楼主| 发表于 2008-1-16 22:55:12 | 显示全部楼层
看了一下kmilo中thinkpad插件的C++源代码,
原来也是用的dcop 和 kmix, 呵呵
回复 支持 反对

使用道具 举报

发表于 2008-1-27 08:24:36 | 显示全部楼层
我在启动参数加了 acpi_osi=Linux,但是重启后按键效果和没加的时候是一样的,要想这个参数生效内核需要调整吗?
重新打了0.19的thinkpad-acpi补丁,内核加参数后仍然无法识别三个按键,依然是只有mute on和mute off,按照thinkpad-acpi.txt里面的说明:
  1. Volume control -- /proc/acpi/ibm/volume
  2. ---------------------------------------
  3. This feature allows volume control on ThinkPad models which don't have
  4. a hardware volume knob. The available commands are:
  5.         echo up   >/proc/acpi/ibm/volume
  6.         echo down >/proc/acpi/ibm/volume
  7.         echo mute >/proc/acpi/ibm/volume
  8.         echo 'level <level>' >/proc/acpi/ibm/volume
  9. The <level> number range is 0 to 15 although not all of them may be
  10. distinct. The unmute the volume after the mute command, use either the
  11. up or down command (the level command will not unmute the volume).
  12. The current volume level and mute state is shown in the file.
复制代码
我测试了一下,跟按键效果相同,虽然可以加不同的level(0~15)但实际没有效果,只有mute on和mute off两种效果,看这个文档说目前好像还在开发中……

还好现在亮度变化用Fn+PageUp PageDown可以完美的控制了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-27 09:33:07 | 显示全部楼层
你的kernel版本是多少?
这个应该跟kernel的acpi的版本有关的, 最近kernel的acpi感觉改动非常大.

我刚用了2.6.24, 加patch thinkpad-acpi 0.19, 发现亮度控制也变了

dmesg 发现有新的提示,
thinkpad_acpi: standard ACPI backlight interface available, not loading native one...

/proc/acpi/ibm/brightness没有了, 现在是通过标准acpi的接口控制
/proc/acpi/video/VID1/LCD0/brightness
回复 支持 反对

使用道具 举报

发表于 2008-1-27 09:37:02 | 显示全部楼层
我的是 2.6.23.1 内核,我找个 2.6.24 看看。
还有一个问题就是我的休眠功能依然只能用在 console 下,X下面可以休眠但恢复不过来,这个问题也没解决
回复 支持 反对

使用道具 举报

发表于 2008-1-27 09:42:18 | 显示全部楼层
Post by zhoun;1811532
你的kernel版本是多少?
这个应该跟kernel的acpi的版本有关的, 最近kernel的acpi感觉改动非常大.

我刚用了2.6.24, 加patch thinkpad-acpi 0.19, 发现亮度控制也变了

dmesg 发现有新的提示,
thinkpad_acpi: standard ACPI backlight interface available, not loading native one...

/proc/acpi/ibm/brightness没有了, 现在是通过标准acpi的接口控制
/proc/acpi/video/VID1/LCD0/brightness

是的,我在 2.6.23.1 内核上打了 0.19 的补丁,跟你的变化是一样的,看来这是thinkpad-acpi的作用,但那个mute up down不知道是否跟内核本身有关,好像内核中除了 drivers/misc/ 里面有关于 thinkpad 的东西,其他地方没有了吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-27 10:09:46 | 显示全部楼层
  1. acpi_sleep=s3_bios,s3_mode
复制代码

加上这个内核参数了吗?
这个是跟休眠功能有关的
回复 支持 反对

使用道具 举报

发表于 2008-1-27 17:08:36 | 显示全部楼层
Post by zhoun;1811544
  1. acpi_sleep=s3_bios,s3_mode
复制代码


加上这个内核参数了吗?
这个是跟休眠功能有关的


加了,resume=/dev/sda3 这是我的swap分区(不知道这样对不对),只不过我的内存是2G,swap也分了2G(具体比内存小),是不是这个原因呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-27 17:51:02 | 显示全部楼层
应该没有什么问题的, 内存2G一般应用也用不完的.

不过Linux下的休眠问题还是挺多的, 如: 偶尔不能唤醒, 休眠耗电, 多休眠几次会出奇怪的问题......
而且在我的机器上, 休眠跟重启速度差不多,
所以我现在一般都只待机或者关机.
回复 支持 反对

使用道具 举报

发表于 2008-1-28 11:51:13 | 显示全部楼层
Post by zhoun;1811695
应该没有什么问题的, 内存2G一般应用也用不完的.

不过Linux下的休眠问题还是挺多的, 如: 偶尔不能唤醒, 休眠耗电, 多休眠几次会出奇怪的问题......
而且在我的机器上, 休眠跟重启速度差不多,
所以我现在一般都只待机或者关机.

是阿,这方面还是不完善,所以有时候干脆直接halt就行了,启动速度也挺快,不差那几分钟呵呵。
回复 支持 反对

使用道具 举报

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

本版积分规则

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