目录
了解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 结果码