取消/插入耳机时如何自动更改音量?

我想要的是以下内容:

  • 当我插入耳机时,我想要将声音取消静音并设置为特定的音量级别。
  • 当我拔下耳机时,我希望将声音静音(或设置为特定的音量)。

设置音量不是问题所在,但是在解开耳机时我不知何故需要这样做,所以我正在寻找一种方法来获得这些事件的通知。

我很快找到了/proc/asound/card0/codec#0来指示是否插入了耳机,所以我尝试使用inotifywait监视它并根据修改后的通知更改音量。 不幸的是, inotifywait失败了,因为proc不是普通的文件系统。

还有其他方法可以做到这一点(可能通过PulseAudio)?

音频设备: Intel HDA ,音频编解码器: Conexant CX20585 。


总结一下到目前为止我尝试过的事情:

  • Ear Candy:在我的系统上根本没有运行。 似乎是一个废弃的项目?
  • Karl Bielefeldt发布的代码可能适用于某些硬件,但不适用于我的代码。
  • 由于缺乏“演讲者”频道, StephenPaulger的想法失败了。
  • 在aking1012的推动下,我通过在内核代码中查找(在找到编解码器的插孔感应代码之后)使其工作,但这是一个相当麻烦的解决方案。

所以,我仍然在寻找一种简单的方法来做到这一点。

要从控制台设置音量级别,请使用命令amixer。 例如:

amixer sset大师播放0%

将您的等级设为0%

当你插上耳机时,我不知道如何改变它…但也许有人可以帮助你

在UDS for Oneiric期间,有一个关于插孔检测的会话。 有关详细信息,请参阅蓝图 。 听起来这将完全符合我的要求:不同设备的不同音量级别 – 只是不在每个硬件上:

我很好奇:我能不能很快为不同的设备(例如内部声音静音,耳机75%)提供不同的音量水平?

这将支持(在某些情况下)是的。 时间表“很快”:p
(我还希望在插入/拔出插孔时显示OSD(当前音量)

更新11.10

现在应该在Oneiric中工作 – 不幸的是我的ThinkPad T510似乎是目前不支持的系统之一。

David Henningsson的另一个后续行动:

长话短说,它是一个理想的特征,我们正朝着那个方向前进,但是慢慢地,因为这个特征比初看起来更复杂。

好消息:在即将推出的Ubuntu Oneiric(11.10)中,这实际上是有效的。 坏消息:它并不适合所有人。

更多这里 。

更新12.04

它现在正在使用Ubuntu 12.04(开发版)中的ThinkPad T510(以及许多其他型号)。

Ear Candy具有一些处理耳机插入/移除function。

我不知道你有多少编码经验,但是你提到了inotifywait所以我假设你至少对shell脚本感到满意。 基于本文的以下C程序应该能够检测到您的耳机已插入或拔出,​​之后您可以执行您想要的任何操作。

 #include  #include  #include  #include  #include  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 ,但你可能需要尝试一些来查找它在你的系统上。 您将需要该设备的读取权限。 程序将在退出之前打印设备的名称,第一个事件的类型,代码和值。

检查dmesg和其他日志文件。 可能插入/拔出某些特定消息。

然后,您可以使用守护程序来解析该日志文件并检测事件。 我想你知道从这一点做什么:)

如果你这样做

 amixer sset 'Speaker' playback 0% 

扬声器音量将静音,但耳机将继续工作。 拔下耳机意味着没有声音。 这几乎是你想要的……

然而 ……

如果您改变音量控制,将再次设置“扬声器”音量设置。 这是因为pulseaudio试图通过设置音量变得聪明(有关更多信息,请参阅http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes )。 我们可以阻止它搞乱卷。

打开/etc/pulse/default.pa

并找到该行

 load-module module-udev-detect 

并将其更改为

 load-module module-udev-detect ignore_dB=1 

重启pulseaudio。

 killall pulseaudio 

现在,如果您将扬声器音量静音,则更改主音量不会影响它。 所以耳机会工作,但扬声器会保持沉默。

检查ACPID套接字是否有变化,可以在python或C或shell脚本的帮助下完成(用于控制耳机插件播放的Python代码和在rhythmbox上暂停)。 检查ACPID电压的变化,检测耳机插件和耳机插头。 但是可以预期几秒钟的延迟。

Pulseaudio默认提供一个模块,旨在实现以下目标:

http://pulseaudio.org/wiki/Modules#module-device-restore

我想你可以用这个来实现你所需要的: https : //bbs.archlinux.org/viewtopic.php?pid = 1105458#p1105458