目录

  了解Audio Unit体系结构

  文档结构预览

  结构单元介绍

本文主要介绍AudioUnit的组成

本文由自己理解而成,如有错误,请欢迎网友们指出校正。

了解Audio Unit体系结构

开始前我们通过一个audioUnit对象来认识AudioUnit,这是一个Effect类型此类型的AudioUnit单元,这个单元由许多小的Scope(范围)组成,scope种有 element(元素),elementt种有channel(声道)模块、stream format(流格式) 和一些properties(属性)组成。

文档结构预览  

以下来自Audio Unit Component Services Reference 文档的结构组成,我们将根据这个结构进行介绍  

  

预览(overView)

音频单元组件服务参考提供c借口来操作音频单元,一个音频单元是用于处理音频的插件或者产生音频数据。使用共同的操作你可以打开关闭音频单元,详细描述在Audio Unit Component Services Reference中。

任务函数(function by tasks)

主要有三部分:初始化或者渲染音频、使用音频属性、使用音频参数。

初始化或者渲染音频:

  //初始化一个音频单元,一旦创建成功,音频的输入输出流格式都是有效的并且出去准备渲染的状态,在这个阶段系统为音频单元创建最大帧的内存。

OSStatus AudioUnitInitialize (
AudioUnit inUnit //你要初始化的音频
);

//在你改变音频单元的特性之前,例如改变输入输出流的格式或者采样率,你必须先取消其初始化。调用这个方法来释放音频对象资源。调用这个方法后你可以重新配置音频参数并且重新初始化

OSStatus AudioUnitUninitialize (
AudioUnit inUnit //你要取消初始化的对象
); //注册一个回调方法来接收音频的渲染通知。注册的事件在音频执行渲染操作(每一个预渲染比特标记被设置)和音频的渲染操作完成(每一个渲染后的比特标记被设置)时都会被调用。inProc 和inProcUserData 是被认为是识别认证的两个参数。要移除渲染监听,你必须传这两个值得给AudioUnitRemoveRenderNotify。
OSStatus AudioUnitAddRenderNotify (
AudioUnit inUnit,   //你想要接收的哪个通知的渲染对象
AURenderCallback inProc,     //你注册的回调事件
void *inProcUserData //你想要传给你的调用事件的自定义数据。例如识别渲染通知。
);
 //取消之前注册的渲染调用。

OSStatus AudioUnitRemoveRenderNotify (
AudioUnit inUnit,
AURenderCallback inProc,
void *inProcUserData
); //为一个音频单元初始化一个渲染循环。
OSStatus AudioUnitRender (
AudioUnit inUnit,      //你想要访问的渲染对象
AudioUnitRenderActionFlags *ioActionFlags,  //配置渲染操作的对象
const AudioTimeStamp *inTimeStamp, //音频渲染操作的时间戳。每个时间戳必须包含有效的单调递增的采样时间。下一个时间戳 inTimeStamp =inTimeStamp + inNumberFrames 如果采样时间不持续增加那么他们将会呈现间断现象。
  UInt32 inOutputBusNumber, //要渲染的输出缓冲区间 UInt32 inNumberFrames, //要渲染的音频帧数 AudioBufferList *ioData );
 //重置音频的渲染状态。

OSStatus AudioUnitReset (
AudioUnit inUnit,
AudioUnitScope inScope, //scope范围一般是kAudioUnitScope_Global
AudioUnitElement inElement //element 范围一般是0
);

使用音频属性


//Registers a callback to receive audio unit property change notifications.


OSStatus AudioUnitAddPropertyListener (
AudioUnit inUnit,
AudioUnitPropertyID inID,
AudioUnitPropertyListenerProc inProc,
void *inProcUserData
);

//Unregisters a previously-registered property listener callback function.

OSStatus AudioUnitRemovePropertyListenerWithUserData (
AudioUnit inUnit,
AudioUnitPropertyID inID,
AudioUnitPropertyListenerProc inProc,
void *inProcUserData
);

//Gets the value of an audio unit property.

OSStatus AudioUnitGetProperty (
AudioUnit inUnit,
AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
void *outData,
UInt32 *ioDataSize
);

//Gets information about an audio unit property.

OSStatus AudioUnitGetPropertyInfo (
AudioUnit inUnit,
AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
UInt32 *outDataSize,
Boolean *outWritable
);

//Sets the value of an audio unit property.

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

使用音频参数


//Gets the value of an audio unit parameter.


OSStatus AudioUnitGetParameter (
AudioUnit inUnit,
AudioUnitParameterID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
AudioUnitParameterValue *outValue
);

//Sets the value of an audio unit parameter.

OSStatus AudioUnitSetParameter (
AudioUnit inUnit,
AudioUnitParameterID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
AudioUnitParameterValue inValue,
UInt32 inBufferOffsetInFrames
);

//Schedules changes to the value of an audio unit parameter.

OSStatus AudioUnitScheduleParameters (
AudioUnit inUnit,
const AudioUnitParameterEvent *inParameterEvent,
UInt32 inNumParamEvents
);

功能函数

 

任务回调

回调

数据类型

 


AudioUnit
typedef AudioComponentInstance AudioUnit; //AudioUnit 是 AudioComponentInstance 类型。
//类型分为:
enum {
   kAudioUnitType_Output            = 'auou',
kAudioUnitType_MusicDevice = 'aumu',
kAudioUnitType_MusicEffect = 'aumf',
kAudioUnitType_FormatConverter = 'aufc',
kAudioUnitType_Effect = 'aufx',
kAudioUnitType_Mixer = 'aumx',
kAudioUnitType_Panner = 'aupn',
kAudioUnitType_OfflineEffect = 'auol',
kAudioUnitType_Generator = 'augn',
}; 此类型有四种:

Converter Audio Unit Subtypes  //转换类型

enum {
kAudioUnitSubType_AUConverter = 'conv',
kAudioUnitSubType_NewTimePitch = 'nutp',
kAudioUnitSubType_TimePitch = 'tmpt',
kAudioUnitSubType_DeferredRenderer = 'defr',
kAudioUnitSubType_Splitter = 'splt',
kAudioUnitSubType_Merger = 'merg',
kAudioUnitSubType_Varispeed = 'vari',
kAudioUnitSubType_AUiPodTime = 'iptm',
kAudioUnitSubType_AUiPodTimeOther = 'ipto'
};

Effect Audio Unit Subtypes //效果类型。

Effect (digital signal processing) audio unit subtypes for audio units provided by Apple.

enum {
kAudioUnitSubType_PeakLimiter = 'lmtr',
kAudioUnitSubType_DynamicsProcessor = 'dcmp',
kAudioUnitSubType_Reverb2 = 'rvb2',
kAudioUnitSubType_LowPassFilter = 'lpas',
kAudioUnitSubType_HighPassFilter = 'hpas',
kAudioUnitSubType_BandPassFilter = 'bpas',
kAudioUnitSubType_HighShelfFilter = 'hshf',
kAudioUnitSubType_LowShelfFilter = 'lshf',
kAudioUnitSubType_ParametricEQ = 'pmeq',
kAudioUnitSubType_Delay = 'dely',
kAudioUnitSubType_Distortion = 'dist',
kAudioUnitSubType_AUiPodEQ = 'ipeq',
kAudioUnitSubType_NBandEQ = 'nbeq'
};

Mixer Audio Unit Subtypes  //混合类型

Audio mixing audio unit subtypes for audio units provided by Apple.

enum {
kAudioUnitSubType_MultiChannelMixer = 'mcmx',
kAudioUnitSubType_MatrixMixer = 'mxmx',
kAudioUnitSubType_AU3DMixerEmbedded = '3dem',
};

Input/Output Audio Unit Subtypes  //输入输出类型

enum {
kAudioUnitSubType_GenericOutput = 'genr',
kAudioUnitSubType_RemoteIO = 'rioc',
kAudioUnitSubType_VoiceProcessingIO = 'vpio'
};

Music Instrument Audio Unit Subtypes

Audio units that can be played as musical instruments via MIDI control.

enum {
kAudioUnitSubType_Sampler = 'samp'
};

AudioUnitScope

typedef UInt32 AudioUnitScope;// AudioUnitScope 类型为UInt32
enum {
kAudioUnitScope_Global = 0,
kAudioUnitScope_Input = 1,
kAudioUnitScope_Output = 2,
kAudioUnitScope_Group = 3,
kAudioUnitScope_Part = 4,
kAudioUnitScope_Note = 5
};

AudioUnitElement

typedef UInt32 AudioUnitElement;  //AudioUnitElement 类型为UInt32
AudioUnitElement 根据Scope值来设定,在输入输出scope时,他根据硬件的数字信号缓冲区来确定。Global scope恒为0.

Channels
core Audio SDK 中用Buffer 来代替Channel


多个buffers 可以用bufferlist



stream format 

AudioUnitParameter

struct AudioUnitParameter {
AudioUnit mAudioUnit;
AudioUnitParameterID mParameterID;
AudioUnitScope mScope;
AudioUnitElement mElement;
};
typedef struct AudioUnitParameter AudioUnitParameter; //结构类型 有Setter和Getter方法。

AudioUnitParameterID

typedef UInt32 AudioUnitParameterID;

AudioUnitParameterValue

typedef Float32 AudioUnitParameterValue;

AudioUnitProperty

为一个 audio unit用一个key-value 值定义一个 attribute 或者 behavior .

struct AudioUnitProperty {
AudioUnit mAudioUnit;
AudioUnitPropertyID mPropertyID;
AudioUnitScope mScope;
AudioUnitElement mElement;
};
typedef struct AudioUnitProperty AudioUnitProperty;
有Setter和Getter方法。

AudioUnitPropertyID

typedef UInt32 AudioUnitPropertyID;

AudioUnitParameterEvent

A scheduled change to an audio unit parameter’s value.

struct AudioUnitParameterEvent {
AudioUnitScope scope;
AudioUnitElement element;
AudioUnitParameterID parameter;
AUParameterEventType eventType;
union {
struct {
SInt32 startBufferOffset;
UInt32 durationInFrames;
AudioUnitParameterValue startValue;
AudioUnitParameterValue endValue;
} ramp;
struct {
UInt32 bufferOffset;
AudioUnitParameterValue value;
} immediate;
} eventValues;
};
typedef struct AudioUnitParameterEvent AudioUnitParameterEvent;

Audio Unit Parameter Event Types

Audio unit parameter event types.

enum {
kParameterEvent_Immediate = 1,
kParameterEvent_Ramped = 2
};
typedef UInt32 AUParameterEventType;

Audio Unit Render Flags

配置 audio unit rendering 标记

enum {
kAudioUnitRenderAction_PreRender = (1 << 2),
kAudioUnitRenderAction_PostRender = (1 << 3),
kAudioUnitRenderAction_OutputIsSilence = (1 << 4),
kAudioOfflineUnitRenderAction_Preflight = (1 << 5),
kAudioOfflineUnitRenderAction_Render = (1 << 6),
kAudioOfflineUnitRenderAction_Complete = (1 << 7),
kAudioUnitRenderAction_PostRenderError = (1 << 8),
kAudioUnitRenderAction_DoNotCheckRenderArgs = (1 << 9)
};
typedef UInt32 AudioUnitRenderActionFlags;

General Audio Unit Function Selectors

相应audio unit单元组成,产生 audio unit 组成方法。

enum {
kAudioUnitRange = 0x0000,
kAudioUnitInitializeSelect = 0x0001,
kAudioUnitUninitializeSelect = 0x0002,
kAudioUnitGetPropertyInfoSelect = 0x0003,
kAudioUnitGetPropertySelect = 0x0004,
kAudioUnitSetPropertySelect = 0x0005,
kAudioUnitAddPropertyListenerSelect = 0x000A,
kAudioUnitRemovePropertyListenerSelect = 0x000B,
kAudioUnitRemovePropertyListenerWithUserDataSelect = 0x0012,
kAudioUnitAddRenderNotifySelect = 0x000F,
kAudioUnitRemoveRenderNotifySelect = 0x0010,
kAudioUnitGetParameterSelect = 0x0006,
kAudioUnitSetParameterSelect = 0x0007,
kAudioUnitScheduleParametersSelect = 0x0011,
kAudioUnitRenderSelect = 0x000E,
kAudioUnitResetSelect = 0x0009,
kAudioUnitComplexRenderSelect = 0x0013,
kAudioUnitProcessSelect = 0x0014,
kAudioUnitProcessMultipleSelect = 0x0015
};

常量

Result Codes 结果码

音频单元组件服务参考(Audio Unit Component Services Reference)的更多相关文章

  1. [小程序开发] 微信小程序audio音频播放组件+api_wx.createAudioContext

    引言: audio是微信小程序中的音频组件,可以轻松实现小程序中播放/停止音频等自定义动作. 附上微信小程序audio组件的相关属性说明:https://mp.weixin.qq.com/debug/ ...

  2. iOS 实时音频采集与播放Audio Unit使用

    前言 在iOS中有很多方法可以进行音视频采集.如 AVCaptureDevice, AudioQueue以及Audio Unit.其中 Audio Unit是最底层的接口,它的优点是功能强大,延迟低; ...

  3. IOS音频架构之Audio Unit

    在前面的章节部分我们已经对IOS音频结构有了一个清晰的认识,知道Audio Unit是位于整个音频结构的最底层,这一层非常多API已经開始和硬件打交道了.所以比較复杂,有了前面的基础再来看这个部分就比 ...

  4. 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力

    音频编辑服务(Audio Editor Kit)是华为为开发者开放的各类场景音频处理能力的集合,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务提供基础编辑.伴奏提取.空间渲染.变声降噪等 ...

  5. Audio Unit 基础

    如图所示,所有 iOS 音频技术都是基于 audio units.此处显示的更高级别的技术,如 Media Player,AV Foundation,OpenAL,AudioToolbox,是对 au ...

  6. Audio Unit 介绍

    关于 Audio Unit iOS 提供了音频处理插件,支持混音,声音均衡,格式转化,以及用于录音,回放,离线渲染,实时对话的输入输出.可以动态载入和使用这些强大而灵活的插件,在 iOS 应用中这些插 ...

  7. windows服务参考

    dll文件 aaclient.dll 何时何地都可以访问客户端 accessibilitycpl.dll 轻松访问控制面板 acledit.dll 访问控制列表编辑器 aclui.dll 安全描述符编 ...

  8. linux音频 DAPM之二:audio paths与dapm kcontrol

    转:https://blog.csdn.net/wh_19910525/article/details/12749293 在用alsa_amixer controls时,除了我们之前提到的snd_so ...

  9. react第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件)

    第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件) #受控组件 简而言之,就是受到状态state控制的表单,表单的值改变则state值也改变,受控组件必须要搭配onc ...

随机推荐

  1. Django中间件、Auth认证

    中间件 一:什么是中间件 是介于request与response处理之间的一道处理过程 二:中间件的作用 如果你想修改请求,例如被传送到view中的HttpRequest对象. 或者你想修改view返 ...

  2. 九度oj 题目1494:Dota

    题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...

  3. python操redis

    Python操作redis python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redi ...

  4. 项目记事【SpringMVC-2】:将后台的对象,转成JSON报文

    Spring版本:3.2.7 Jackson版本: <!--Jackson --> <dependency> <groupId>com.fasterxml.jack ...

  5. 许式伟看 Facebook 发币(上): 区块链, 比特币与 Libra 币

    你好,我是七牛云许式伟. Facebook(脸书)于6月18日发布了其加密数字货币项目白皮书.该数字货币被命名为 Libra(天秤座),象征着平衡与公正.此前,BBC 报道说这个数字货币叫 Globa ...

  6. [USACO Section 3.2] 01串 Stringsobits (动态规划)

    题目链接 Solution 贼有意思的 DP, 也可以用组合数学做. \(f[i][j]\) 代表前 \(i\) 位,有 \(j\) 个 \(1\) 的方案数. 转移方程很简单 : \(f[i][j] ...

  7. 【基础操作】2-sat

    $2-sat$ 是一个很不怎么考的内容($NOI2017$ 除外) 例题

  8. ubuntu14.04 python + opencv 傻瓜式安装解决方案

    ubuntu14.04  python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...

  9. 如何循序渐进向.NET架构师发展

    微软的DotNet开发绝对是属于那种入门容易提高难的技术.而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的.特别是在大型软件项目中,架构师是项目核心成员,承上启下,因此RUP ...

  10. SpringCloud 分布式事务解决方案

    目录 TX-LCN分布式事务框架 TX-LCN分布式事务框架 随着互联化的蔓延,各种项目都逐渐向分布式服务做转换.如今微服务已经普遍存在,本地事务已经无法满足分布式的要求,由此分布式事务问题诞生. 分 ...