目錄
了解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 結果碼

