本文主要介紹AudioUnit的組成
本文由自己理解而成,如有錯誤,請歡迎網友們指出校正。
瞭解Audio Unit體繫結構
開始前我們通過一個audioUnit對象來認識AudioUnit,這是一個Effect類型此類型的AudioUnit單元,這個單元由許多小的Scope(範圍)組成,scope種有 element(元素),elementt種有channel(聲道)模組、stream format(流格式) 和一些properties(屬性)組成。
文檔結構預覽
以下來自Audio Unit Component Services Reference 文檔的結構組成,我們將根據這個結構進行介紹
預覽(overView)
任務函數(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);
功能函數 任務回調回調資料類型
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'};
typedef UInt32 AudioUnitScope;// AudioUnitScope 類型為UInt32
enum { kAudioUnitScope_Global = 0, kAudioUnitScope_Input = 1, kAudioUnitScope_Output = 2, kAudioUnitScope_Group = 3, kAudioUnitScope_Part = 4, kAudioUnitScope_Note = 5};
typedef UInt32 AudioUnitElement; //AudioUnitElement 類型為UInt32
AudioUnitElement 根據Scope值來設定,在輸入輸出scope時,他根據硬體的數字訊號緩衝區來確定。Global scope恒為0.
core Audio SDK 中用Buffer 來代替Channel
多個buffers 可以用bufferlist
struct AudioUnitParameter { AudioUnit mAudioUnit; AudioUnitParameterID mParameterID; AudioUnitScope mScope; AudioUnitElement mElement;};typedef struct AudioUnitParameter AudioUnitParameter; //結構類型
有Setter和Getter方法。
AudioUnitParameterID
typedef UInt32 AudioUnitParameterID;
AudioUnitParameterValue
typedef Float32 AudioUnitParameterValue;
為一個 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;
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 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;
相應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};
常量