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…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
