问题描述
我想要的是以下内容:
-
当我插入耳机时,我希望声音为un-muted并设置为特定的音量级别。
-
当我拔下耳机时,我希望声音被静音(或设置为特定的音量)。
设置音量不是问题所在,但是在取消/插入耳机时我需要这样做,所以我正在寻找一种方法来获得这些事件的通知。
我很快找到了/proc/asound/card0/codec#0
来指示是否插入了耳机,所以我尝试使用inotifywait
对其进行监控,并根据修改后的通知更改音量。不幸的是,inotifywait
失败了,因为proc不是普通的文件系统。
还有其他方法可以做到这一点(可能通过PulseAudio)?
音频设备:Intel HDA,音频编解码器:Conexant CX20585。
总结一下到目前为止我尝试过的事情:
-
Ear Candy:在我的系统上根本没有运行。似乎是一个废弃的项目?
-
Karl Bielefeldt发布的代码可能适用于某些硬件,但不适用于我的代码。
-
由于缺少’Speaker’通道,StephenPaulger的想法失败了。
-
由aking1012激发我通过在内核代码中查找(在找到编解码器的插孔感测代码之后)使其工作,但这是一个相当麻烦的解决方案。
所以,我仍然在寻找一种简单的方法来做到这一点。
最佳解决思路
要从控制台设置音量级别,请使用命令amixer。例如:
amixer sset Master playback 0%
将您的等级设为0%
当你插上耳机时,我不知道如何改变它…但也许有人可以帮助你
次佳解决思路
在UDS for Oneiric期间,有一个关于插孔检测的会话。有关详细信息,请参阅the blueprint。听起来这将完全符合我的要求:不同设备的不同音量级别 – 只是不在每个硬件上:
<htorque> something i’m curious about: will i be able to have different volume levels for different devices (eg., internal sound muted, headphones 75%) anytime soon?
<coling> this will be supported (on some h/w) yes. Timescales are “soonish” :p
<coling> (I’d also expect OSD to be shown (with current volume) when jacks are plugged/unplugged)
更新11.10
这应该是working in Oneiric – 遗憾的是我的ThinkPad T510似乎是目前不支持的系统之一。
David Henningsson的另一个follow-up:
Long story short, it’s a desirable feature, and we’re moving in that direction, but slowly, as the feature is more complex than it seems like at first glance.
The good news: in the upcoming Ubuntu Oneiric (11.10), this is actually working. The bad news: it isn’t working for everyone.
更多here。
更新12.04
它现在在Ubuntu 12.04(开发版)中使用我的ThinkPad T510(以及许多其他型号)。
第三种解决思路
Ear Candy具有一些处理耳机插入/移除功能。
第四种思路
我不知道你有多少编码经验,但你提到了inotifywait
所以我假设你至少对shell脚本感到满意。以下基于this article的C程序应该能够检测到插入或拔出的耳机,之后您可以执行任何您想要的操作。
#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
int fd = -1;
char name[256]= "Unknown";
struct input_event event;
if ((fd = open(argv[1], O_RDONLY)) < 0) {
perror("evdev open");
exit(1);
}
if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
perror("evdev ioctl");
}
printf("The device on %s says its name is %s\n",
argv[1], name);
read(fd, &event, sizeof(struct input_event));
printf("Event type is %d\n", event.type);
printf("Event code is %d\n", event.code);
printf("Event value is %d\n", event.value);
close(fd);
return 0;
}
该程序采用一个参数,该参数应该是耳机输入事件设备的路径。这对我来说是/dev/input/event7
,但您可能需要尝试一些来查找系统中的内容。您将需要该设备的读取权限。程序将在退出之前打印设备的名称,第一个事件的类型,代码和值。