windows蓝牙驱动开发-BLE音频(三)

server/2025/1/19 12:40:23/

序列

音频驱动程序初始化

当 IHV ACX 流式处理驱动程序加载并确定它支持蓝牙 LE 音频流式处理时,它应通过以下方法来显示对该技术的支持:创建 ACXFACTORYCIRCUIT 对象,并使用音频终结点模板绑定 ID 中定义的 ID 向 ACX 注册蓝牙模板绑定。

415e3ce63c9b493dbd35c9fc8bbd4d6c.png

终结点创建

1. 当 LE 音频设备与系统配对时,蓝牙 LE 音频配置文件会:

 

  • 读取远程设备的已发布音频功能。
  • 通过发送 HCI_Read_Local_Support_Codecs [v2] 和 HCI_Read_Local_Supported_Codec_Capabilities 命令来发现控制器支持的功能。
  • 使用基于蓝牙控制器和远程音频设备支持的编解码器功能设置的受支持格式创建 ACXCIRCUIT。 如果控制器不支持任何编解码器(因为编解码器支持位于音频 DSP 或音频驱动程序中),则受支持的格式将设置为远程音频设备所支持的格式。

2. 创建 ACXCIRCUIT 后,ACX 会请求 IHV ACX ACX 流式处理驱动程序的 ACX 线路工厂创建 ACXCIRCUIT 进行流处理。


3. 收到创建线路的请求时,IHV ACX 流式处理驱动程序会:

 

  • 创建 ACXCIRCUIT、ACXPIN、ACXOBJECTBAG 和 ACXSTREAMBRIDGE 对象。
  • 如果 LC3 或供应商专用编解码器托管在音频驱动程序或 DSP 中,则 IHV ACX 流式处理驱动程序会在 ACXOBJECTBAG 上设置 BluetoothLEAudio_CodecCapabilities 属性。
  • IHV ACX ACX 流式处理驱动程序可能会在 ACXOBJECTBAG 上设置 Bluetooth_DatapathID 或 Bluetooth_DatapathConfiguration(如果目前已知)。

4. 创建两条线路后,ACX 将在 IHV ACX 驱动程序的桥接引脚上调用 EvtAcxPinConnected 回调;
5. 调用 EvtAcxPinConnected 时,IHV ACX 流式处理驱动程序会:

 

  • 使用 AcxTarget... API 检索配置文件线路的桥接引脚,以检索该线路支持的格式。
  • 循环访问配置文件线路设置的 ACXDATAFORMAT 列表。 如果蓝牙音频编解码器托管在音频驱动程序或音频 DSP 中,则 IHV 音频驱动程序会使用编解码器和配置文件线路支持的格式更新其 ACXDATAFORMAT。 否则,所有格式都将复制到 IHV ACX ACX 流式处理驱动程序的主机引脚。
  • 如果为卸载流式处理创建了音频引擎,则在桥接引脚上设置更新后的格式列表。

6. 更新这些格式后,ACX 会启用这两个接口,并创建音频终结点。

 6f72b41d0ebc49e2a469ce41308cbf9a.png

流创建

1. 当应用程序请求创建音频流时,ACX 会为每个线路调用已注册的 EvtCircuitCreateStream 回调,从 IHV ACX 流式处理驱动程序开始。

2. 调用 EvtCircuitCreateStream 回调时,IHV ACX 流式处理驱动程序会:

 

  • 设置或更新 ACXOBJECTBAG 上附加到 ACXSTREAMBRIDGE 的 Bluetooth_DatapathId 和 Bluetooth_DataPathConfiguration 属性。
  • 创建一个 ACXSTREAM,其中包含为流状态转换和 RT 流处理设置的回调
  • 如果音频管道支持卸载流,请在流中创建音频引擎元素。
  • 将 ACXSTREAM 添加到其流桥。 这会调用蓝牙 LE 音频配置文件的 EvtCircuitCreateStream 回调。

3. 调用 EvtAcxCircuitCreateStream 回调时,蓝牙 LE 音频配置文件会:

 

  • 从 IHV ACX ACX 流式处理驱动程序设置的 ACXOBJECTBAG 本地保存属性,以用于将来的流转换回调。
  • 如果音频终结点用于单播流式传输蓝牙 LE 音频配置文件:
  • 执行 BAP 规范中定义的配置编解码器操作。 该操作的参数派生自 EvtAcxCircuitCreateStream 回调中指定的 ACXDATAFORMAT,以及 ACXOBJECTBAG 中的其他流参数或蓝牙控制器支持的编解码器功能。
  • 使用用于配置远程音频设备的值设置 ACXOBJECTBAG 上的 BluetoothLEAudio_CodecConfiguration 属性。

4. 如果 IHV ACX 流式处理驱动程序需要根据配置文件设置的对象包值更新其数据路径 ID 或数据路径配置,则它可以调用 KSPROPERTY 集操作来更新配置文件线路所存储的值。
创建一个 ACXSTREAM,其中包含为流状态转换设置的回调。

6b494bf294184e968457a2e9d4360ed2.png

流状态转换

ACX 根据音频流决定流状态转换的线路顺序,以及状态是转换为更活跃还是不太活跃的状态。

  • 对于从不太活跃的状态转换为更活跃的状态的呈现流,配置文件线路首先接收事件,然后是流式传输线路。
  • 对于从更活跃的状态转换为不太活跃的状态的呈现流,流式传输线路首先接收事件,然后是配置文件线路。 
  • 对于从不太活跃的状态转换为更活跃的状态的捕获流,流式传输线路首先接收事件,然后是配置文件线路。 
  • 对于从更活跃的状态转换为不太活跃的状态的捕获流,配置文件线路首先接收事件,然后是流式传输线路。

准备流

调用 EvtAcxStreamPrepareHardware 回调时,蓝牙 LE 音频配置文件会:

1. 通过以下方式为单播流分配资源:

  • 使用 HCI_LE_Set_CIG_Parameters 命令配置 CIG。
  • 发送 ASCS 配置 QoS 操作以将设置与远程设备同步。

424e280e56a640ebba6b7dfe8f3312fe.png

调用 EvtAcxStreamPrepareHardware 回调时,IHV ACX 流式处理驱动程序会分配必要的流式处理资源,并初始化要处于获取状态的音频管道。

20abc7c4ba13485f95c31f6382375609.png

启动流

调用 EvtAcxStreamRun 回调时,蓝牙 LE 音频配置文件会:

1. 使用 HCI_Configure_Data_Path 命令在流创建过程中应用 ACX 流式处理驱动程序设置的所有数据路径配置设置。
2. 通过以下方式开始流启动过程:
执行单播流的 BAP 单播流启用过程:
将“启用”操作发送到远程终结点。
如果尚未使用 HCI_LE_Create_CIS 命令创建 CIS,则创建 CIS。
3. 如果尚未配置数据路径,蓝牙 LE 音频配置文件会:
使用 HCI_LE_Setup_ISO_Data_Path 命令建立 ISO 数据路径
如果 IHV ACX 流式处理驱动程序设置 BluetoothLEAudio_CodecCapabilities 属性,则 HCI_LE_Setup_ISO_Data_Path 中 Codec_ID 字段的值应设置为透明 (0x3),如蓝牙分配号码中定义。 否则,该值应与流创建过程中配置编解码器操作中使用的编解码器 ID 相同。
4. 如果音频流是单播捕获流,则蓝牙 LE 音频配置文件会执行 BAP 接收器启动就绪操作。

db84ca3932204e65905b6bce83264300.png

调用 EvtAcxStreamRun 回调时,IHV ACX 流式处理驱动程序将开始处理来自 Windows 音频系统(呈现)或蓝牙控制器(捕获)的传入音频数据。

eebff44054cc4b1cb7f8455079cf0248.png

暂停流

调用 EvtAcxStreamPause 回调时,蓝牙 LE 音频配置文件会:

  • 执行 BAP 单播流禁用过程。
  • 使用 HCI_LE_Remove_ISO_Data_Path 命令移除 ISO 数据路径。
  • 如果音频流是单播捕获流,则执行 ASCS 接收器停止就绪过程。

f52beea77abe47ba9d5e07d7256832d5.png

调用 EvtAcxStreamPause 回调时,IHV ACX 流式处理驱动程序会暂停其音频处理管道。

9409b5ae01bc4ae1b9f4a63468c40ab1.png

发布流

调用 EvtAcxStreamReleaseHardware 回调时,蓝牙 LE 音频配置文件会通过以下方式执行 BAP 单播流发布过程:

  • 将 ASCS 发布操作发送到远程蓝牙 LE 音频设备
  • 如果 CIS 未由另一个活动流使用,则断开 CIS 的连接。
  • 如果所有 CIS 均已断开连接,则移除 CIG。

b8d56e58a8254712be4448c00346a243.png

调用 EvtAcxStreamReleaseHardware 回调时,IHV ACX ACX 流式处理驱动程序会释放其音频管道资源 

0a4e32f2df5a420ab69c085e363b9dbc.png

终结点断开连接

在以下情况下,Windows 蓝牙 LE Audio 配置文件会更新终结点的连接状态:远程单播设备没有与电脑的 LE-ACL 连接,或者它正在通过其 PACS 可用的音频上下文报告它无法进行流式处理。 当终结点断开连接时,Windows 音频服务会使终结点的所有活动流失效。 这会导致流暂停和释放序列。

终结点移除

当配置文件线路或流式传输线路被销毁时,将从系统中移除蓝牙 LE 音频终结点。 从 Windows 中移除远程单播设备的配对或禁用蓝牙无线电时,可能会移除配置文件线路。

  • 当 Windows 蓝牙 LE 音频配置文件移除其线路时,ACX 会禁用其终结点接口,以向 Windows 音频服务发出指示应移除该终结点的信号。
  • 禁用这些接口后,Windows 音频服务会使蓝牙 LE 音频终结点的所有活动流失效,此操作会导致在流式传输线路上调用流暂停和释放回调。
  • 若要完成终结点移除,ACX 会使 IHV ACX 流式处理驱动程序的线路失效,这会导致 WDF 调用线路的清理回调。
  • 调用清理回调时,IHV ACX 流式处理驱动程序会释放其线路。

5735d3211af64cdcbface62caae7a4e6.png

 


http://www.ppmy.cn/server/159629.html

相关文章

【AIGC-ChatGPT进阶提示词指令】心灵修复师:一个基于情感共鸣的智慧对话系统设计

引言 在当今快节奏的生活中,心理健康问题日益凸显。如何借助人工智能技术,构建一个既富有温度又专业可靠的心理支持系统,成为了一个值得深入探讨的课题。本文将详细介绍一个名为"心灵修复师"的对话系统设计,这个系统通…

人脸识别【python-基于OpenCV】

1. 导入并显示图片 #导入模块 import cv2 as cv#读取图片 imgcv.imread(img/wx(1).jpg) #路径名为全英文,出现中文 图片加载失败,"D:\picture\wx.jpg" #显示图片 (显示标题,显示图片对象) cv.imshow(read_picture,im…

Debian终端高亮(显示不同颜色)

起因 Debian终端与CentOS不一样,CentOS终端默认自带高亮显示,不同文件类型的文件显示颜色不一样,而Debian默认都显示为一样的颜色。 解决方法 为了debian终端显示有颜色有如下方法: 方法一:单次有效 ls --colorau…

【Leetcode 热题 100】295. 数据流的中位数

问题背景 中位数 是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 a r r [ 2 , 3 , 4 ] arr [2,3,4] arr[2,3,4] 的中位数是 3 3 3。例如 a r r [ 2 , 3 ] arr [2,3] arr[2,3] 的中位数是 ( …

网络编程 | UDP广播通信

1、什么是广播 在上一篇博客文章中已经对UDP进行了详细的说明介绍及如何编程实现。本文将接着上一文的内容,在其基础上,对UDP的知识体系进一步深入的讲解。 网络编程 | UDP套接字通信及编程实现经验教程-CSDN博客 例子:在一些中小学的操场中&…

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、线程概念 📖 回顾进程 📖 引入线程 📖 总结 &a…

牛客---mysql

查找学校是北大的学生信息_牛客题霸_牛客网 题目:现在运营想要筛选出所有北京大学的学生进行用户调研,请你从用户信息表中取出满足条件的数据,结果返回设备id和学校。 示例:user_profile iddevice_idgenderageuniversityprovinc…

精选了几道MySQL的大厂面试题,被提问的几率很高!

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…