我想要的是以下内容:
- 当我插入耳机时,我希望将声音取消静音并设置为特定的音量级别。
- 当我拔下耳机时,我希望声音静音(或设置为特定音量)。
设置音量级别不是问题,但我在拔下/插入耳机时需要这样做,所以我正在寻找一种方法来获得这些事件的通知。
我很快发现/proc/asound/card0/codec#0
指示耳机是否插入,所以我尝试使用它来监控它inotifywait
并根据修改后的通知更改音量级别。不幸的是inotifywait
失败了,因为proc不是一个普通的文件系统。
还有其他方法可以做到这一点(也许通过 PulseAudio)?
音频设备:Intel HDA,音频编解码器:Conexant CX20585。
总结一下我到目前为止所做的尝试:
- Ear Candy:在我的系统上根本没有运行。似乎是一个废弃的项目?
- Karl Bielefeldt发布的代码可能适用于某些硬件,但不适用于我的。
- 由于缺少“演讲者”频道, StephenPaulger的想法失败了。
- 受aking1012的启发,我通过修改内核代码(在找到编解码器的插孔感应代码之后)使其工作,但这是一个相当麻烦的解决方案。
所以,我仍在寻找一种简单的方法来做到这一点。
在 Oneiric 的 UDS 期间,有一个关于插孔检测的会议。有关详细信息,请参阅蓝图。听起来这将完全符合我的要求:不同设备的不同音量级别 - 只是不是在每个硬件上:
11.10 更新
这现在应该可以在 Oneiric 中使用- 不幸的是,我的 ThinkPad T510 似乎是目前不支持的系统之一。
David Henningsson 的另一个后续行动:
更多在这里。
12.04 更新
它现在可以在 Ubuntu 12.04(开发版)中与我的 ThinkPad T510(和许多其他型号)一起使用。
要从控制台设置音量级别,请使用命令 amixer。例如:
将您的等级设置为 0%
当您插入耳机时,我不知道如何更改它...但也许有人可以帮助您
Ear Candy具有一些处理耳机插入/移除的功能。
我不知道你有多少编码经验,但你提到
inotifywait
了所以我假设你至少对 shell 脚本感到满意。以下基于本文的 C 程序应该能够检测到您的耳机被插入或拔出,之后您可以执行任何您想要的操作。该程序采用一个参数,它应该是耳机输入事件设备的路径。这是
/dev/input/event7
给我的,但您可能需要尝试一些才能找到它在您的系统上。您将需要对该设备的读取权限。程序将在退出前打印设备名称以及第一个事件的类型、代码和值。检查 dmesg 和其他日志文件。插入/拔出可能会触发一些特定的消息。
然后,您可以使用守护程序来解析该日志文件并检测事件。我想你知道从这一点上该怎么做:)
如果你这样做
扬声器音量将被静音,但耳机将继续工作。拔下耳机意味着没有声音。这几乎是你想要的......
然而...
如果您更改音量控制,“扬声器”音量设置将再次设置。这是因为 pulseaudio 试图巧妙地设置音量(有关更多信息,请参阅http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes)。不过,我们可以阻止它弄乱卷。
打开 /etc/pulse/default.pa
并找到线
并将其更改为
重新启动脉冲音频。
现在,如果您将扬声器音量静音,则更改主音量不会影响它。所以耳机会工作,但扬声器会保持沉默。
我想你可以用这个来实现你所需要的:https ://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458
检查 ACPID 套接字的变化,可以在 python 或 C 或 shell 脚本的帮助下完成,(用于控制耳机插件在节奏盒上播放和暂停的Python 代码)。检查 ACPID 电压的变化以检测耳机插件和耳机插头是否拔出。不过可以预期会有几秒钟的延迟。
Pulseaudio 有一个默认提供的模块,旨在实现这一点:
http://pulseaudio.org/wiki/Modules#module-device-restore