首页 > 代码库 > 如何监测耳机/麦克风设备插拔操作
如何监测耳机/麦克风设备插拔操作
没事的时候想起来做这么个功能,主要是想在插入耳机之后能自动调节到较小的音量,免得耳朵被震得难受。
在搜索过程中先搜到了CSDN论坛的一篇帖子《C#监测音频设备热插拔功能》(http://bbs.csdn.net/topics/390502788)
虽然没有靠这篇帖子解决问题,但是帖子还是指出了道路,就是用Windows Vista之后提供的新Core Audio API来侦测
在这里我是用NAudio(http://naudio.codeplex.com/)这个开源库中CoreAudio的实现
然后在搜索英文资源的时候注意用“jack detection”关键字
微软论坛上的这篇讨论很有帮助:http://social.msdn.microsoft.com/Forums/windowsdesktop/zh-CN/610aacff-062e-4453-8437-01f0de038b07/jack-detection-for-headset?forum=windowspro-audiodevelopment
最终最完整的解答是在这里:http://stackoverflow.com/questions/6163119/handling-changed-audio-device-event-in-c-sharp
虽然完整的代码写好了,但是还是花了一两天时间来让代码能正确运行,因为能否侦测到插拔操作,和硬件及驱动也有关系
最开始在插拔的时候只有OnPropertyValueChanged事件可以正常触发,其他事件毫无反应,一度让我以为代码哪里出了问题,直到读了MSDN里面的这段话,才让我把重心移到硬件及驱动上来,这段话是这样的:
“Unlike the connection between an adapter and an external bus such as USB or the IEEE 1394 bus, the connection between an endpoint device and an adapter device does not support PnP device detection. However, some audio adapters support jack-presence detection: when a plug is inserted into or removed from a jack, the hardware generates an interrupt to notify the adapter driver of the change in the hardware configuration. The endpoint manager in Windows Vista can exploit this hardware capability to notify applications which endpoint devices are present at any time. In this way, the operation of the endpoint manager is analogous to that of the Plug and Play manager, which keeps track of the adapter devices that are present in the system.”
我测试的环境使用的声卡都是Realtek的,我仔细研究了控制面板里面的音频管理器的设置项目,注意到了红框选项,修改了之后终于可以侦测到麦克风的插拔了。
但是耳机的插拔还是不行,我在笔记本和台式机上反复测试,终于在台式机上可以侦测到音频输入/耳机/麦克风三个插孔的插拔操作了,不过在笔记本上还是不行,即便是我在笔记本上安装了最新的Realtek声卡驱动,我个人认为区别应该在硬件上,也许笔记本上的声卡在功能上有某种程度的缩水或者设计的妥协导致。
下面附上一些图以供回忆吧:
笔记本:
台式机:
程序的输出: