CoreAudioApi-音频端点设备-检测耳机插拔

术语“端点设备”是指位于数据路径一端的硬件设备,该数据路径源自或终止于应用程序。音频终端设备的例子有扬声器、耳机、麦克风和CD播放器。沿着数据路径移动的音频数据可能在应用程序和端点设备之间的行程中穿过许多软件和硬件组件。尽管这些组件对于端点设备的操作是必不可少的,但用户往往看不到它们。用户更可能考虑他们直接操作的端点设备,而不是端点设备插入的音频适配器上的设备,或处理流入和流出这些适配器的音频流的软件组件。

为了避免与端点设备混淆,本文档将音频适配器上的设备称为适配器设备

 

在上图中,以下是端点设备的示例:

  1. 扬声器
  2. 麦克风
  3. 辅助输入装置

以下是适配器设备的示例:

  1. 波输出装置(含数模转换器)
  2. 输出控制设备(包含音量和静音控制)
  3. 波输入装置(含模数转换器)
  4. 输入控制装置(包括音量控制和多路复用器)

通常,音频应用程序的用户界面指的是音频端点设备,而不是适配器设备。Windows Vista通过直接支持端点设备抽象简化了用户友好应用程序的设计。

某些端点设备可能永久连接到适配器设备。例如,计算机可能包含集成到系统机箱中的内部设备,如CD播放器、麦克风或扬声器。通常,用户不会从物理上删除这些端点设备。

其他端点设备可能通过音频插孔连接到音频适配器。用户插入并拔出这些外部设备。例如,音频端点设备(如外部麦克风或耳机)位于电缆的一端,电缆的另一端插入适配器设备上的插孔。

适配器通过支持即插即用(PNP)的系统总线(通常是PCI或PCI Express)或外部总线(USB或IEEE 1394)与系统处理器通信。在设备枚举过程中,即插即用管理器标识音频适配器中的设备,并注册这些设备,使其可供操作系统和应用程序使用。

与适配器与外部总线(如USB或IEEE 1394总线)之间的连接不同,端点设备与适配器设备之间的连接不支持PNP设备检测。但是,一些音频适配器支持插孔存在检测:当插头插入或拔出插孔时,硬件会生成一个中断,通知适配器驱动程序硬件配置的更改。Windows Vista中的端点管理器可以利用此硬件功能随时通知存在哪些端点设备的应用程序。这样,端点管理器的操作与即插即用管理器的操作类似,后者跟踪系统中存在的适配器设备。

在WindowsVista中,音频系统跟踪端点设备和适配器设备。端点管理器注册端点设备,即插即用管理器注册适配器设备。注册端点设备使用户友好的应用程序更容易使用户引用用户直接操作的端点设备,而不是引用可能隐藏在计算机机箱内的适配器设备。操作系统报告的端点设备忠实地跟踪具有插孔存在检测功能的音频硬件配置中的动态变化。当端点设备保持插入状态时,系统枚举该设备。当用户拔出端点设备时,系统将停止枚举它。

在之前的Windows版本,包括Windows 98、Windows ME、Windows 2000和Windows XP的系统,系统只显式地向应用程序显示PNP设备。因此,应用程序必须推断端点设备的存在。缺少对端点设备的显式支持的操作系统迫使客户端应用程序自己做更多的工作。例如,音频捕获应用程序必须执行以下步骤才能从外部麦克风捕获:

  1. 枚举以前由PNP管理器注册的所有音频捕获设备(这些是适配器设备)。
  2. 选择捕获设备后,通过调用waveInOpen函数或使用DirectSoundCaptureDirectShow API打开设备上的捕获流。
  3. 调用mixerOpen函数并使用其他mixerXxx函数查找与步骤2中打开的捕获设备对应的MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE线。这是一个有根据的猜测。
  4. 取消阻止麦克风的数据路径。如果数据路径包含静音节点,则客户端必须禁用麦克风信号的静音。如果捕获设备包含用于从多个输入中选择的多路复用器,则客户端必须选择麦克风输入。

这个过程很容易出错,因为如果执行这些操作的软件遇到其设计者没有预料到的硬件配置,或者没有对其进行测试,那么它可能会失败。

在支持端点设备的Windows Vista中,连接到同一端点设备的过程要简单得多:

  1. 从终结点设备集合中选择麦克风。
  2. 激活该麦克风上的音频捕获接口。

操作系统完成识别和启用端点设备所需的所有工作。例如,如果来自麦克风的数据路径包括多路复用器,则系统会自动选择到多路复用器的麦克风输入。

如果应用程序不是实现自己的端点识别算法,而是将端点设备的识别任务释放到操作系统中,那么音频子系统的行为就更加可靠和具有确定性。软件供应商不再需要验证他们的端点识别算法是否能与所有可用的音频硬件设备和配置一起正常工作,他们可以简单地依靠操作系统来进行端点识别。同样,硬件供应商不再需要验证每个相关的客户机应用程序是否可以轻易地识别连接到其音频适配器的任何端点设备。他们只需要验证操作系统是否可以识别连接到其音频适配器的端点设备。

以下主题提供有关音频终结点设备的其他信息:

 

英文原文链接:https://docs.microsoft.com/zh-cn/windows/desktop/CoreAudio/audio-endpoint-devices

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android Studio 中对音频进行端点检测需要使用 Android 的音频处理 API。其中,最常用的 APIAudioRecord 和 AudioTrack。 AudioRecord 用于从设备的麦克风采集音频数据,而 AudioTrack 用于播放音频数据。要进行端点检测,需要先从麦克风采集音频数据,然后对采集到的音频数据进行分析,以确定何时开始和结束语音信号。 下面是一个简单的示例代码,演示如何使用 AudioRecord API 从麦克风采集音频数据并进行端点检测: ```java private AudioRecord audioRecord; private short[] buffer; private int bufferSize; private void startRecording() { bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSize); buffer = new short[bufferSize]; audioRecord.startRecording(); while (true) { int readSize = audioRecord.read(buffer, 0, bufferSize); // 对 buffer 中的音频数据进行端点检测,如果检测到语音信号的开始和结束,则进行相应处理 // ... } } private void stopRecording() { audioRecord.stop(); audioRecord.release(); } ``` 在上面的代码中,我们首先创建了一个 AudioRecord 对象,并设置了采样率、声道配置和音频格式等参数。然后,在 startRecording() 方法中,我们启动了采集音频数据的线程,并在循环中不断读取音频数据。在循环中,我们可以对 buffer 中的音频数据进行端点检测,如果检测到语音信号的开始和结束,则进行相应的处理。最后,在 stopRecording() 方法中,我们停止了音频采集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值