取消/插入耳机时如何自动更改音量?
我想要的是以下内容:
- 当我插入耳机时,我想要将声音取消静音并设置为特定的音量级别。
- 当我拔下耳机时,我希望将声音静音(或设置为特定的音量)。
设置音量不是问题所在,但是在解开耳机时我不知何故需要这样做,所以我正在寻找一种方法来获得这些事件的通知。
我很快找到了/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默认提供一个模块,旨在实现以下目标:
我想你可以用这个来实现你所需要的: https : //bbs.archlinux.org/viewtopic.php?pid = 1105458#p1105458