Audio Processing Graphs 管理 Audio Units
Audio Processing Graphs 管理 Audio Units
- Audio Processing Graphs 管理 Audio Units
- Audio Processing Graph 拥有精确的 I/O Unit
- Audio Processing Graph 提供线程安全
- 通过 graph "pull" 音频流
Audio Processing Graphs 管理 Audio Units
audio processing graph(AUGraph)是一种基于 Core Foundation 风格的数据结构,常用来管理 audio unit 处理链。audio processing graph 可以利用多个 audio unit 与回调函数,以用来解决任意音频处理方法。
AUGraph 类型保证了音频单元的线程安全性,它使得程序员能够实时重新配置处理链。例如,在音频播放时,可以安全地插入均衡器,甚至为混音器输入交换不同的渲染回调函数。事实上,AUGraph 类型提供了 iOS 中唯一用于在音频应用程序中执行此类动态重新配置的 API。
audio processing graph API 使用另一种不透明类型 AUNode 来表示图形上下文中的单个 Audio Unit。使用 audio processing graph 时,通常与 AUNode 交互,作为其包含音频单元的代理,而不是直接与Audio Unit 交互。
然而,当我们将 graph 放在一起时,必须使用 audio unit 的 API 配置每个 audio unit,而 nodes 则不能直接配置audio unit。因此,使用 graph 必须同时使用这两套 API。
还可以通过定义 AUNode 来表示一个完整的 audio processing subgraph(音频处理子图),将 AUNode 实例用作复杂 graph 中的 element。在这种情况下,子图末尾的 I/O 单元必须是 Generic Output unit(一种不连接到设备硬件的 I/O 单元)。
宽泛地说,构建 Audio Processing Graph 需要三步:
- 向 graph 中添加 nodes。
- 通过 nodes 直接配置 audio units。
- 互相连接 nodes。
Audio Processing Graph 拥有精确的 I/O Unit
无论正在录制、播放或是同步,每个 audio processing graph 都有一个 I/O unit。
通过 AUGraphStart
与 AUGraphStop
可以开启或停止音频流。通过 AudioOutputUnitStart
与 AudioOutputUnitStop
可以开启或停止 I/O unit。通过这种方式,graph 的 I/O 单元负责 graph 中的音频流。
Audio Processing Graph 提供线程安全
audio processing graph API 采用“待办事项列表”比喻来提供线程安全。此 API 中的某些功能将工作单元添加到稍后执行的更改列表中。指定完整的更改集后,要求 graph 去实现它们。
以下是 audio processing graph API 支持的一些常见重新配置及其相关功能:
- 添加、移除 audio unit nodes(AUGraphAddNode, AUGraphRemoveNode)
- 添加、移除 nodes 间的连接(AUGraphConnectNodeInput, AUGraphDisconnectNodeInput)
- 连接 audio unit input bus 的回调函数(AUGraphSetNodeInputCallback)
下图描绘了一种架构:构建了一个包含多通道混音器单元和远程 I/O 单元的 graph,用于混合播放两个合成的声音。在输入端,把声音反馈给混音器的两个输入总线。混音器输出进入 I/O 单元的输出元素,然后进入输出音频硬件。
现在,假设用户想将均衡器插入两个音频流之一。要做到这一点,就在其中一个声音和它的混音器输入之间添加一个 iPod EQ 单元,如下图所示。
完成此实时重新配置的步骤如下:
-
通过调用
AUGraphDisconnectNodeInput
断开 mixer unit input 1 的 “beats sound” 回调。 -
将包含 iPod EQ 单元的音频单元节点添加到 graph 中。通过指定具有 AudioComponentDescription 结构的 iPod EQ 单元,然后调用 AUGraphAddNode 来做到这一点。此时,iPod EQ 单元已实例化,但未初始化。它由 graph 拥有,但尚未参与音频流。
-
配置和初始化 iPod EQ 单元。在这个例子中,这需要一些步骤:
- 调用
AudioUnitGetProperty
从 mixer 的输入端检索kAudioUnitProperty_StreamFormat
流格式。 - 调用两次
AudioUnitSetProperty
,一次设置 iPod EQ 单元的输入流格式,一次设置输出流格式。 - 调用
AudioUnitInitialize
以分配内存准备使用。这个函数是线程不安全的,但是,当 iPod EQ 单元尚未主动参与 audio processing graph 时,必须在序列时执行它,因为此时没有调用AUGraphUpdate 函数。
- 调用
-
通过调用 AUGraphSetNodeInputCallback,将 “beats sound” 回调函数添加到 iPod EQ 的输入端。
在前面的步骤中,步骤1、2 和 4 都是 AUGraph* 函数调用,它们都被添加到 graph 的“待办事项”列表中。调用 AUGraphUpdate 执行这些待处理的任务。AUGraphUpdate 功能成功返回后,graph 已被动态重新配置,iPod EQ 已到位并处理音频。
通过 graph “pull” 音频流
在 audio processing graph 中可以使用类似生产者消费者模式,消费者在需要更多音频数据时通知生产者。请求音频数据流的方向与音频流提供的方向正好相反,如下图所示:
对一组数据的每个请求都被称为渲染调用(render call),或者非正式地称为 pull。该图将渲染调用表示为灰色的“控制流”箭头。渲染调用请求的数据更恰当地称为一组音频样本帧(audio sample frames)。反过来,响应拉流而提供的一组音频样本帧被称为 slice。提供 slice 的代码称为渲染回调函数(render callback function)。
图 1-6 的 pull 实现步骤:
- 调用 AUGraphStart 函数后,虚拟输出设备会调用远程 I/O 单元输出元素的渲染回调。此调用要求一片已处理的音频数据帧。
- 远程 I/O 单元的渲染回调功能在其输入缓冲区中查找要处理的音频数据,以满足渲染调用。如果有等待处理的数据,远程I/O单元会使用它。否则,如图所示,它会调用应用程序连接到其输入的任何内容的渲染回调。在本例中,远程 I/O 单元的输入连接到效果单元的输出。因此,I/O 单元 pull 效果单元,要求提供一段音频帧。
- 效果单元的行为与远程 I/O 单元一样。当它需要音频数据时,它会从输入连接中获取。在本例中,效果单元拉动应用程序的渲染回调函数。
- 应用程序的渲染回调函数是 pull 的最终接收者。它向效果单元提供所需的帧。
- 效果单元处理应用程序渲染回调提供的 slice。然后,效果单元将之前请求的处理数据(在步骤 2 中)提供给远程 I/O 单元。
- 远程 I/O 单元处理效果单元提供的切片。然后,远程 I/O 单元将最初请求的已处理切片(在步骤 1 中)提供给虚拟输出设备。这完成了一个 pull 周期。
相关文章:

Audio Processing Graphs 管理 Audio Units
Audio Processing Graphs 管理 Audio Units Audio Processing Graphs 管理 Audio UnitsAudio Processing Graph 拥有精确的 I/O UnitAudio Processing Graph 提供线程安全通过 graph "pull" 音频流 Audio Processing Graphs 管理 Audio Units audio processing grap…...

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?
欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理? 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程: 2024年5月7日,欧盟委员会发布《通用充电器指令》指南,修订了《无线…...

thinkphp6/8 验证码
html和后台验证代码按官方来操作 ThinkPHP官方手册 注意: 如果验证一直失败,看看Session是否开启, 打印dump(session_status());结果2为正确的, PHP_SESSION_DISABLED: Session功能被禁用(返回值为0)。…...

Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)
目录 在线安装MySQL 步骤1:更新软件包列表 步骤2:安装MySQL服务器 步骤3:启动MySQL服务 步骤4:检查MySQL状态 步骤5:修改密码、权限 在线安装MySQL 步骤1:更新软件包列表 在进行任何软件安装之前&a…...

如何选择优质模型?SD3性能究竟如何?
遇到难题不要怕!厚德提问大佬答! 厚德提问大佬答12 厚德提问大佬答第十二期 你是否对AI绘画感兴趣却无从下手?是否有很多疑问却苦于没有大佬解答带你飞?从此刻开始这些问题都将迎刃而解!你感兴趣的话题,厚德…...

Linux上脚本备份数据库(升级版)
直接上代码: #!/bin/bash# 配置部分 mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4" mysql_defaults_file"/home/mysql/mysql_back/.my.cnf"backup_base_dir"/mnt/sdd/…...

【深度解析】滑动窗口:目标检测算法的基石
标题:【深度解析】滑动窗口:目标检测算法的基石 目标检测是计算机视觉领域的一个核心任务,旨在识别图像中所有感兴趣的目标,并确定它们的位置和大小。滑动窗口方法作为目标检测中的一种传统技术,虽然在深度学习时代逐…...

约束:对于数据的限制
主键约束 主键约束:唯一约束非空约束,该字段上的数据不能重复且不能为null 注意:一张表必须有且只有一个主键 添加主键约束 -- 方式一(推荐) CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),nick_name VARCHAR(3…...

【总线】AXI4第七课时:AXI的额外的控制信息(PROT和CACHE)
大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁…...

MAVEN 重新配置参考
【笔记04】下载、配置 MAVEN(配置 MAVEN 本地仓库)(MAVEN 的 setting.xml)-阿里云开发者社区 windows 系统环境变量 MAVEN_HOME 也可以改一下...

ByteTrack论文阅读笔记
目录 ByteTrack: Multi-Object Tracking by Associating Every Detection Box摘要INTRODUCTION — 简介BYTE算法BYTE算法用Python代码实现实验评测指标轻量模型的跟踪性能 总结SORT算法简介ByteTrack算法和SORT算法的区别 ByteTrack: Multi-Object Tracking by Associating Eve…...

LVS+Keepalived 高可用集群搭建实验
192.168.40.204lvs+keepalivedlvs-k1192.168.40.140lvs+keepalivedlvs-k2192.168.40.150nginx官方教程web-1192.168.40.151nginxepel阿里云源web-2Woo79 | LVS+Keepalived 高可用集群搭建 (图文详解小白易懂) doctor @yang | 生产环境必备的LVS+Keepalived ,超级详细的原理…...

代码随想三刷动态规划篇7
代码随想三刷动态规划篇7 198. 打家劫舍题目代码 213. 打家劫舍 II题目代码 337. 打家劫舍 III题目代码 121. 买卖股票的最佳时机题目代码 198. 打家劫舍 题目 链接 代码 class Solution {public int rob(int[] nums) {if(nums.length1){return nums[0];}if(nums.length2){…...

linux应用开发基础知识(八)——内存共享(mmap和system V)
mmap内存映射 内存共享定义 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对…...

上海小程序开发需要进行定制开发吗?
随着互联网技术与移动设备的不断成熟,小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入,小程序的开发可以为企业带来更高效的经营模式,降本增效。那么,上海小程序作为无需安装且开发门槛较低的应用&#…...

Qt开发 | qss简介与应用
文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用:实时打开关闭状态按钮五、QComboBo…...

模块一SpringBoot(一)
maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置, application.properties会覆盖默认信息: 如覆盖端口号server.port8888...

C语言 | Leetcode C语言题解之第213题打家劫舍II
题目: 题解: int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…...

Linux LVS 负载均衡群集
在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡,当有服务出现异常,也能够自动剔除。但是负载均衡服…...

onTouch()与onTouchEvent()的区别
onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景,并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法: onTouch() 方法 定义:onTouch(View v, MotionEvent event)是View.OnTouchList…...

计算机网络网络层复习题2
一. 单选题(共22题,100分) 1. (单选题)如果 IPv4 数据报太大,会在传输中被分片,对分片后的数据报进行重组的是( )。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…...

[JS]面向对象ES6
class类 ES6是基于 class关键字 创建类 <script>// 1.定义类class Person {// 公有属性name// 公有属性 (设置默认值)age 18// 构造函数constructor(name) {// 构造函数的this指向实例化对象// 构造函数的作用就是给实例对象设置属性this.name name// 动态添加属性(不…...

ctfshow web sql注入 web242--web249
web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…...

发送微信消息和文件
参考:https://www.bilibili.com/video/BV1S84y1m7xd 安装: pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好,我是PyOfficeRobot,有什么可以帮助…...

数组-螺旋矩阵
M螺旋矩阵 ||(leetcode59) /*** param {number} n* return {number[][]}*/ var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() > new Array(n).fill(0));let row 0,column 0;const d…...

GitStack详细配置与使用指南
1.引言 GitStack是一个功能强大的Git服务器管理工具,专为Windows环境设计。它提供了一个用户友好的Web界面,使得在Windows服务器上管理Git仓库变得简单高效。本文将详细介绍GitStack的安装、配置和使用方法,帮助您快速搭建自己的Git服务器。 2.GitStack安装 2.1 系统要求 Wi…...

LoadRunner-Virtual User Generator组件学习
重点知识 LR工具是拿C写的,所以它的脚本默认也是C,但是最终生成的脚本不止是C,它是支持C和Java语言的,这个大家要清楚,对本身懂代码的就很友好,你了解java,那就可以把脚本改成java,…...

NAT地址转换实验,实验超简单
实验拓扑 实验目的 将内网区域(灰色区域)的地址转换为172.16.1.0 实验过程 配置静态NAT(基于接口的静态NAT) R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…...

pip常用命令详解
pip 是 Python 的官方第三方包管理工具之一,其为 Python 包的安装与管理提供了极大的便利。本文将详细介绍 pip 的常见命令及其用法,帮助读者更好地利用这一强大的工具。 1. 安装 pip 在开始使用 pip 之前,确保您的系统中已经安装了 pip。p…...

vue3从入门到精通
CDN方式使用vue: 获取复杂数据类型: 使用结构复制语法去除vue前缀: 使用模块化开发: 需要安装插件live server: 需要访问网络地址: 简单数据类型ref的使用: 如何修改number reactive修改值不需要.value&…...