接觸過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層是一組從低層接口組合起來的高層應用,基本上我們很多關於音頻開發的工作在這一層就可以完成
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
);