构建 Audio Unit 的流程

news2024/10/5 23:30:10

构建 Audio Unit 的流程

  • 构建 Audio Unit 的流程
    • 指定 Audio Unit 的类型
    • 创建 Audio Unit
    • 设置 Audio Unit 的属性

构建 Audio Unit 的流程

iOS 有一个用于直接处理 audio units 的 API,另一个用于处理 audio processing graphs,可以同时使用这两种 API。然而这两种 API 中有一部分功能是相同的:

  • 获取 audio units 的动态可链接库的引用。
  • 实例化 audio units。
  • 连接 audio units 并注册回调函数。
  • 启动和停止音频流。

指定 Audio Unit 的类型

// Creating an audio component description to identify an audio unit
AudioComponentDescription ioUnitDescription;
 
ioUnitDescription.componentType          = kAudioUnitType_Output;
ioUnitDescription.componentSubType       = kAudioUnitSubType_RemoteIO;
ioUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags         = 0;
ioUnitDescription.componentFlagsMask     = 0;

创建 Audio Unit

使用 audio unit API — AudioComponent 创建:

// Obtaining an audio unit instance using the audio unit API
AudioComponent foundIoUnitReference = AudioComponentFindNext (
                                          NULL,
                                          &ioUnitDescription
                                      );
AudioUnit ioUnitInstance;
AudioComponentInstanceNew (
    foundIoUnitReference,
    &ioUnitInstance
);

AudioComponentFindNext:第一个参数设置为 NULL 表示使用系统定义的顺序查找第一个匹配的 audio unit;如果你将上一个使用的 audio unit 引用传给该参数,则该函数将继续寻找下一个与之描述匹配的audio unit。

AudioComponentInstanceNew 的第二个参数类型是 AudioComponentInstance。AudioUnit 实际上就是 AudioComponentInstance,在 AudioComponent 类中有定义:

typedef AudioComponentInstance AudioUnit;

还可以使用 audio processing graph API 初始化 audio unit,即通过 AUNode 创建 Audio Unit,分为 3 步:

  1. 创建一个 AUGraph。
  2. 获取一个 AUNode。
  3. 获取一个 Audio Unit。
// Declare and instantiate an audio processing graph
AUGraph processingGraph;
NewAUGraph (&processingGraph);
 
// Add an audio unit node to the graph, then instantiate the audio unit
AUNode ioNode;
AUGraphAddNode (
    processingGraph,
    &ioUnitDescription,
    &ioNode
);
AUGraphOpen (processingGraph); // indirectly performs audio unit instantiation
 
// Obtain a reference to the newly-instantiated I/O unit
AudioUnit ioUnit;
AUGraphNodeInfo (
    processingGraph,
    ioNode,
    NULL,
    &ioUnit
);

设置 Audio Unit 的属性

Audio Unit 实际上就是一个 AudioComponentInstance 实例对象,一个 AudioUnit 由 scope 和 element 组成。

在这里插入图片描述

scope 是 Audio Unit 内部的编程上下文,其定义为枚举值:

CF_ENUM(AudioUnitScope) {
    kAudioUnitScope_Global      = 0,
    kAudioUnitScope_Input       = 1,
    kAudioUnitScope_Output      = 2,
    kAudioUnitScope_Group       = 3,
    kAudioUnitScope_Part        = 4,
    kAudioUnitScope_Note        = 5,
    kAudioUnitScope_Layer       = 6,
    kAudioUnitScope_LayerItem   = 7
};

主要使用到的输入 kAudioUnitScope_Input 和输出 kAudioUnitScope_Output。参考 Figure1-2,Input scope 表示里面的所有的 element 都需要一个输入;Output scope 表示里面的所有的 element 都会输出到某个地方;Global scope 作为整体应用于 Audio Unit 并且不与任何特定音频流相关联,它只有一个 element,用来配置一些和输入输出无关的属性。

术语 element 和 bus 在 Audio Unit 中是一个含义。当 Element 是 Input/Output scope 的一部分时,它类似于物理音频设备中的信号总线。在强调信号流时使用 bus,在强调音频单元的特定功能时使用 element。

使用 scope 和 element 来设置 Audio Unit 的属性,函数原型为:

AudioUnitSetProperty( AudioUnit               inUnit,
											AudioUnitPropertyID     inID,
                      AudioUnitScope          inScope,
                      AudioUnitElement        inElement,
                      const void * __nullable inData,
                      UInt32                  inDataSize
);

各参数意义:

  • AudioUnitPropertyID:设置属性名称。有以下枚举值:

    • kAudioOutputUnitProperty_EnableIO:用于在 I/O unit 上启用或禁用输入或输出。默认情况下,输出已启用但输入已禁用。
    • kAudioUnitProperty_ElementCount:elements 的数量。
    • kAudioUnitProperty_MaximumFramesPerSlice:为了指定音频数据的最大帧数,音频单元应准备在响应渲染调用时生成。对于大多数音频单元,在大多数情况下,必须按照参考文档中所述设置此属性。如果不这样做,当屏幕锁定时,音频将停止。
    • kAudioUnitProperty_StreamFormat:指定特定 audio unit 输入或输出总线的音频流数据格式。
  • AudioUnitScope:AudioUnit 的 Scope,主要用于输入输出范围。

  • AudioUnitElement:AudioUnit 的 Element,默认用 1 表示输入总线,用 1 表示输出总线。

  • inData:输入值。

  • inDataSize:输入值的长度。

大多数属性只能在 audio unit 没有初始化时指定,但是某些特定属性可以在 audio unit 运行时设置,如 kAUVoiceIOProperty_MuteOutput 静音功能。

要测试属性的可用性,访问其值以及监视其值的更改,可以使用以下函数:

  • AudioUnitGetPropertyInfo:发现属性是否可用;如果是,可以获得其值的数据大小,以及是否可以更改该值。
  • AudioUnitGetProperty、AudioUnitSetProperty:获取、设置一个属性值,可以在 Audio Unit 运行时使用。
  • AudioUnitAddPropertyListener、AudioUnitRemovePropertyListenerWithUserData:添加或删除用于监控属性值更改的回调函数。

函数实例:

UInt32 busCount = 2;
 
OSStatus result = AudioUnitSetProperty (
    mixerUnit,
    kAudioUnitProperty_ElementCount,   // the property key
    kAudioUnitScope_Input,             // the scope to set the property on
    0,                                 // the element to set the property on
    &busCount,                         // the property value
    sizeof (busCount)
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十四章 路由器 OSPF 动态路由配置

实验目的 掌握 OSPF 协议的配置方法: 掌握查看通过动态路由协议 OSPF 学习产生的路由; 熟悉广域网线缆的链接方式; 实验背景 假设校园网通过一台三层交换机连到校园网出口路由器上, 路由器再和校园外的另一台路由器连接。…

【C++题解】1456. 淘淘捡西瓜

问题:1456. 淘淘捡西瓜 类型:贪心 题目描述: 地上有一排西瓜,每个西瓜都有自己的重量。淘淘有一个包,包的容量是固定的,淘淘希望尽可能在包里装更多的西瓜(当然要装整个的,不能切开…

开放签电子签章,让签字有迹可循

开放签(企业版)V2.0.5版本上线后,系统支持一键查询电子文件的签署操作记录,支持一键生成详细的签署记录报告,详细请看下图: 1、操作记录详情: 从合同发起、填写、签署、撤销等环节全流程展示操…

创新与增长:eBest完美收官FBIF2024食品创新展

FBIF2024食品创新展今天在上海会展中心圆满落幕。此次大会以食品创新、渠道创新、营销创新及科技创新为主题,为众多参展企业及来宾带来一场蕴含创新思维的盛宴。 为什么要“破卷出新”?如今中国食品品牌面临的最大挑战就是在国内饱和的市场里出爆品&…

CTFHUB-SSRF-Redis协议

本题需要用到: 在线编码网址:https://icyberchef.com/ gopherus工具:https://mp.csdn.net/mp_blog/creation/editor/139440201 开启题目,页面空白 和上一个题FastCGI协议一样,还是使用gopherus攻击redis ./gopheru…

【操作与配置】VSCode配置Python

Python环境配置 可以参见:【操作与配置】Python:CondaPycharm_pycharmconda-CSDN博客 官网下载Python:http://www.python.org/download/官网下载Conda:Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

端口聚合基础知识

一、什么是端口聚合 端口聚合是将多个物理端口捆绑在一起,形成一个逻辑链路,以实现带宽增加、提高冗余和负载均衡的技术。端口聚合,也称为以太通道(Ethernet Channel),主要用于交换机之间的连接。在具有多…

我爱服务器——LVM实战学习

后来呀,天亮之前毕业后踏入服务器领域了。。。。。。 LVM(Logical Volume Manager)是一个高级的磁盘管理框架,它允许用户将多个物理硬盘组合成一个逻辑卷,从而提供更大的存储空间、更高的灵活性和更好的数据管理能力。…

系统安全与应用

目录 1. 系统账户清理 2. 密码安全性控制 2.1 密码复杂性 2.2 密码时限 3 命令历史查看限制 4. 终端自动注销 5. su权限以及sudo提权 5.1 su权限 5.2 sudo提权 6. 限制更改GRUB引导 7. 网络端口扫描 那天不知道为什么,心血来潮看了一下passwd配置文件&am…

分布式锁的详细解析

分布式锁工具 一、背景 当前问题:项目中会使用到分布式锁用于定时任务、接口幂等性处理,但是分布式锁的实现较简单,会出现执行超时、加解锁失败等场景。分布式锁都有哪些实现,他们的优劣势是什么呢? 二、现有技术 分…

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图,现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图,你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息:2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

让围绕数据库构建大模型应用更简单方便--DB-GPT

DB-GPT的目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单,更方便。 1 处理流程 DB-GPT系…

《涅朵奇卡:一个女人的一生》读后感

这周的计划是看完海明威的《丧钟为谁而鸣》,但是因为下班晚,而且书的体量大,所以只看了一半。本来以为这周的阅读计划完不成了,不料昨天加完班后拿起新到的《涅朵奇卡:一个女人的一生》,不自觉就陷进去了&a…

Zynq系列FPGA实现SDI视频编解码+图像缩放,基于GTX高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB纯V…

音乐播放器小程序的设计

管理员账户功能包括:系统首页,个人中心,歌曲信息管理,会员优惠管理,用户管理,会员办理管理,歌曲分类管理,会员信息管理 微信端账号功能包括:系统首页,歌曲信息…

机器学习 C++ 的opencv实现SVM图像二分类的训练 (二)【附源码】

本节讲机器学习 C 的opencv实现SVM图像二分类的训练&#xff0c;下节讲测试&#xff1a; 数据集合data内容如下&#xff1a; 下载地址为&#xff1a;https://download.csdn.net/download/hgaohr1021/89506900 #include <stdio.h> #include <time.h> #include…

时钟切换的代码

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&…

中控室监控台在水处理行业的作用

随着工业化和城市化的快速推进&#xff0c;水处理行业的重要性日益凸显。作为确保水质安全、提高水资源利用效率的关键环节&#xff0c;水处理厂需要高效、稳定地运行。在这个过程中&#xff0c;中控室监控台发挥着不可或缺的作用。本文将从以下几个方面&#xff0c;详细阐述中…

Go语言--运算符

算术运算符 关系运算符 不能写0<a<10&#xff0c;要判断必须0<a&&a<10。因为int和bool不兼容 逻辑运算符 位运算符 赋值运算符 其他 运算符的优先级