如何监测耳机/麦克风设备插拔操作

没事的时候想起来做这么个功能,主要是想在插入耳机之后能自动调节到较小的音量,免得耳朵被震得难受。

在搜索过程中先搜到了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声卡驱动,我个人认为区别应该在硬件上,也许笔记本上的声卡在功能上有某种程度的缩水或者设计的妥协导致。

下面附上一些图以供回忆吧:

笔记本:

台式机:

程序的输出:

时间: 2024-08-07 14:32:15

如何监测耳机/麦克风设备插拔操作的相关文章

WPF 插拔触摸设备触摸失效

原文:WPF 插拔触摸设备触摸失效 最近使用 WPF 程序,在不停插拔触摸设备会让 WPF 程序触摸失效.通过分析 WPF 源代码可以找到 WPF 触摸失效的原因. 在 Windows 会将所有的 Hid (输入)设备在插拔的时候通过 Windows 消息进行更新设备信息.在触摸的时候,通过一个线程用来收集触摸信息. 本文下面的代码是通过 dnSpy反编译调试. 存在的问题 通过 WPF 的源代码可以发现存在两个问题,两个问题在两个不同的类 在 PenThreadWorker 的 GetPenE

音乐播放-后台-耳机控制-耳机插拔

1.首先需要引用系统Framework – AVFoundation,然后在AppDelegate的应用启动事件里面添加以下代码: AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:nil] [session setActive:YES error:nil] AVAudioSessionCategoryPlayba

台式机上如何配置并使用苹果iPhone的耳机麦克风 并且麦克风开启降噪功能

这个资料和技巧在网络上面很少有人分享,但是可能会有不少人需要这个东西.这里分享下经验.这也是一个困扰我很久的一个问题.因为买来了这个转接头,发现,录音的时候iPhone的耳机麦克风有很大的噪音无法消除. 首先这个转接头在某淘X网有售的.这里主要说下如何设置声卡驱动.默认不要使用微软的驱动,因为降噪功能无法开启.需要设置Realtek的驱动,麦克风才会有降噪的选项卡出现,如图3显示的那样. 图1 图2 图3 采用原厂Realtek麦克风驱动,可以在麦克风音量放大的情况下开启噪音抑制,立即模式.也不

Windows 下编程检测显示器信息及插拔

Windows下提示显示器信息主要通过两个函数实现.一个是EnumDisplayDevices(), 另一个是EnumDisplayMonitors(). EnumDisplayDevices()枚举所有显示设备,而EnumDisplayMonitors枚举的是所有显示器.显示设备和显示器不一样,比如显卡算显示设备,但是不是显示器.具体差别后面会分析.EnumDisplayMonitors()还会枚举出不可见的伪显示器,如果只是想得到实际的显示器数目的话可以用GetSystemMetrics(S

headset-监听有线耳机插拔

今天在做项目的时候,需要对耳机的插拔事件进行监听,所以就写了如下的一个小demo,对耳机监听事件进行验证.直接看代码 package com.example.alert; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; publi

C#.NET U盘插拔监控

[1]涉及的知识点 1) windows消息处理函数 ? 1 protected override void WndProc(ref Message m) 捕获Message的系统硬件改变发出的系统消息 2) 硬件信息类 ? 1 DriveInfo [2]核心函数 消息常量: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /// <summary> /// windows消息常量 /// </summary> class CWn

MFC检测串口插拔

以对话框工程为例 头文件中 afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData); cpp中 ON_WM_DEVICECHANGE() 然后实现函数 BOOL CXXDlg::OnDeviceChange(UINT nEventType,DWORD dwData) { //0x4d36e978L, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 //DEV

玩转Oracle之12c 可插拔数据库数据泵功能体验

:数据泵可以高效备份.复制.保护和传输大量的数据和源数据.在导入和导出过程中可以做到过滤数据和对象,并且能够在全数据库级.方案级.表级和表空间级实现导入导出. Oracle12c的datapump功能跟以前差不多,在多租户的环境中执行导入\导出以及使用一些更细化的参数的时候,几乎没有区别,依然很好用,效率很高.目前有很多的用户仍然在使用exp/imp工具在执行一些迁移.备份.过滤和转移数据的工作,相比起来,数据泵的效率更高.更易用并且更方便管理,但exp/imp在有些时候可以完成datapump

oracle12c新特点——可插拔数据库(Pluggable Database,PDB)

1.    12c PDB新特点的优势 1)    可以把多个PDB集成进一个平台. 2)    可以快速提供一个新的PDB或一个已有PDB的克隆. 3)    通过拔插技术,可以快速把存在的数据库重新部署到一个新平台上. 4)    多个PDB数据库补丁或升级一次完成. 5)    通过把单个PDB拔插到较高版本的不同CDB,可以补丁或升级一个PDB. 6)    从同一个CDB中众多PDB中分离出某个PDB的内容. 7)    分离这些PDB应用管理员的责任. 2.    12c PDB新特