接觸過IOS音頻開發的同學都知道,Core Audio 是IOS和 MAC 的關於數字音頻處理的基礎,它提供應用程式用來處理音訊一組軟體架構,所有關於IOS音頻開發的介面都是由Core Audio來提供或者經過它提供的介面來進行封裝的,按照官方的說法是集播放,音頻處理錄製為一體的專業技術,通過它我們的程式可以同時錄製,播放一個或者多個音頻流,自動適應耳機,藍芽耳機等硬體,響應各種電話中斷,靜音,震動等,甚至提供3D效果的音樂播放。
Core Audio 的API結構分三層,如:
Low-Level 層是關於硬體介面的API層,這個層次的API主要是提供給MAC用來編寫需要即時效能音頻處理的介面,一般的應用程式都不會使用這一層次的API,Core Audio為IOS這個移動平台提供了一個更高層次的API來處理即時音頻,這個API更加緊湊,高效。
Mid-Level 層的功能比較齊全,包括音頻資料格式轉換,音頻檔案讀寫,音頻流解析,外掛程式工作支援等
Audio Convert Services API 負責音頻資料格式的轉換
Audio File Services API 負責音頻資料的讀寫
Audio Unit Services 和 Audio Processing Graph Services 支援均衡器和混音器等數字訊號處理的外掛程式。
Audio File Scream Services 負責流解析
Core Audio Clock Services 負責音頻音頻時鐘同步
High-Level層是一組從低層介面組合起來的高層應用,基本上我們很多關於音頻開發的工作在這一層就可以完成
Audio Queue Services 提供錄製、播放、暫停、迴圈、和同步音頻它自動採用必要的轉碼器處理壓縮的音頻格式。
AVAudioPlayer是專為IOS平台提供的基於Objective-C介面的音頻播放類,可以支援iOS所支援的所有音訊播放。
OpenAL是CoreAudio對OpenAL標準的實現,可以播放3D混音效果。
CoreAudio 的API並不是封裝成一個單獨的framework,它的介面散落到不同的framework,例如:
AudioToolbox.framework提供coreAudio的中進階別的API服務,我們經常會打交道的AVAudioSession類就是包含在這個庫中,用來處理應用程式的關於音訊裝置內容相關的控制。通過它可以設定程式的音頻能力,處理電話和其他高優先順序語音處理而導致的中斷和恢複操作等。
AudioUnit.framework這個庫提供DSP數字訊號處理相關的外掛程式,包括編解碼,混音,音頻均衡等。
AVFoundation.framework這個庫提供一個精簡的音樂播放類,可以播放所有IOS支援的音頻。
OpenAL.framework提供3D音效播放
CoreAudio在設計上主要採用屬性對機制來管理和操作音頻對象的狀態和行為,我們在各個類中都能看這樣的工作方式:
1、一個屬性KEY通常是一個助記名字定義的枚舉常量,比如 kAudioFilePropertyFileFormat或kAudioQueueDeviceProperty_NumberChannels。
2、一個屬性value 通常是一個特定的適合於描述該屬性的資料類型,例如void *,aFloat64,一個AudioChannel 資料結構等
CoreAudio通過訪問函數來擷取Key 對應的屬性值,如果該屬性值可寫的話,還可以通過Key來修改key對應的屬性,當然,CoreAudio也提供普通的介面來擷取對象的值。例如通過kAudioSessionProperty_OverrideCategoryDefaultToSpeaker來設定程式音頻切換成外放模式
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(audioRouteOverride), &audioRouteOverride);
CoreAudio介面提供一個回調機制在音頻對象的某個屬性變化時候通知你的應用程式,應用程式在使用AudioQueue類進行音樂播放的時候,實現這個回呼函數,並且設定給AudioQueue對象,那麼AudioQueue對象在執行完音頻播放操作之後調用該函數。
typedef void (*AudioQueuePropertyListenerProc) (
void * inUserData,
AudioQueueRef inAQ,
AudioQueuePropertyID inID
);