CoreAudio的編程接口分為3層弃衍,如下圖所示
Low-Level Services包含:
1.I/O Kit:驅(qū)動
2.AudioHAL:音頻硬件抽象層,為硬件提供一個設(shè)備獨(dú)立、驅(qū)動獨(dú)立的接口
3.Core MIDI:提供服務(wù)于MIDI流和設(shè)備的軟件抽象
4.Host Time Services:提供訪問計(jì)算機(jī)時鐘
Mac apps 可以被創(chuàng)建成直接應(yīng)用這些技術(shù),當(dāng)它們需要盡可能實(shí)時的性能氯质。然而,很多音頻程序并不能訪問這些層級祠斧。事實(shí)上,在iOS中核心音頻為實(shí)現(xiàn)實(shí)時音頻運(yùn)用更高層級接口提供方法拱礁。OpenAL, 舉個例子琢锋,在游戲中為實(shí)時音頻使用I/O,但是實(shí)際是確實(shí)一個小得多呢灶,轉(zhuǎn)換API適當(dāng)?shù)脑O(shè)置移動設(shè)備吴超。
在核心音頻中Middle-Level Layer,包括數(shù)據(jù)格式轉(zhuǎn)換鸯乃、硬盤的讀寫鲸阻,解析劉文建跋涣,還要插件的使用。
1.Audio Converter Services:讓應(yīng)用程序處理音頻數(shù)據(jù)格式轉(zhuǎn)換鸟悴。
2.Audio File Services:讀寫基于硬盤的音頻數(shù)據(jù)陈辱。可以解析采樣頻率细诸、碼率沛贪、時長等信息,分離音頻文件的音頻幀
3.Audio Unit Services(播放音頻數(shù)據(jù)) 和 Audio Processing Graph Services(音效處理模塊):讓應(yīng)用程序處理DSP(數(shù)字信號處理)插件震贵,像均衡器和混音器利赋。
4.Audio File Stream Services:讓你創(chuàng)建的應(yīng)用程序可以解析音頻流文件,就像通過網(wǎng)絡(luò)連接播放流文件猩系。
5.Core Audio Clock Services:支持音頻和MIDI同步以及基于時間的轉(zhuǎn)換媚送。
6.Audio Format Services(一個小的API, 在圖中并沒有展示),協(xié)助管理應(yīng)用程序中的音頻數(shù)據(jù)格式寇甸。
在iOS中核心音頻提供這些服務(wù)的一大部分:在核心音頻 High-level Services包括結(jié)合了較低層特點(diǎn)的更直接的接口塘偎。
1.Audio Queue Services提供你記錄、播放幽纷、暫停式塌、循環(huán)和同步音頻。它使用必要的編解碼器去壓縮音頻格式友浸。
2.AVAudioPlayer:為播放音頻和循環(huán)提供了一個簡單的OC接口峰尝,以及實(shí)現(xiàn)快進(jìn)和快退。高級接口收恢,可以完成整個音頻播放過程武学,但是不能實(shí)現(xiàn)混音器和均衡器功能。
3.Extended Audio File Services:結(jié)合了Audio File Services和 Aduio Converter Services的特點(diǎn)伦意。它給你提供了一個用于讀寫未壓縮和壓縮聲音文件火窒。
4.OpenAL是定位音頻的開源OpenAL標(biāo)準(zhǔn)的核心音頻的實(shí)現(xiàn)。它是建立在系統(tǒng)提供的3D混音器音頻單元的頂部驮肉。所有的應(yīng)用程序都可以使用OpenAL熏矿,盡管它最合適用于游戲開發(fā)。
音頻一般播放的流程:
1.讀取音頻文件
2.解析采樣頻率离钝、碼率票编、時長等信息,分離音頻文件的音頻幀卵渴。? ??
? ? ? ? Audio File Service 讀寫音頻數(shù)據(jù)慧域,Audio File Stream Services:對音頻進(jìn)行解碼
3.對分離出來的音頻真解碼得到PCM數(shù)據(jù)?
? ? ? ? Audio Converter services:音頻數(shù)據(jù)轉(zhuǎn)換
4.對PCM數(shù)據(jù)進(jìn)行音效處理(均衡器、混音器浪读,非必須的)?
? ? ? ? ?Audio Process Graph Services:音效處理模塊
5.把PCM數(shù)據(jù)解碼成音頻信號6.把音頻信號交給硬件播放?
? ? ? ? ?Aduio Unit Services:播放音頻數(shù)據(jù)
7.重復(fù)1-6步?
Framework
直到播放完成如上就是音頻核心API三個層級以及各個層級內(nèi)容的功能關(guān)于Framework這里只關(guān)注與iOS有關(guān)系的.
AudioToolbox.framework :Audio Session Services:作為管理你應(yīng)用程序在手機(jī)和iPod設(shè)備中的音頻行為昔榴。
AudioUnit.framework:Audio Unit Services
AVFoundation.framework:提供AVAudioPlayer class
CoreAudio.framework:提供跨核心音頻以及底層服務(wù)接口的數(shù)據(jù)類型辛藻。
OpenAL.framework:OpenAL
?iOS不支持的有:CoreAudioKit.framework ? CoreMIDI.frame ? ?CoreMIDIServer.framework
?附錄CoreAudio framework 描述了所有這些框架,以及他們包含的頭文件互订。
Proxy Objects:
核心音頻運(yùn)用代理對象的概念來表示注入文件吱肌、流、音頻播放器等等屁奏。當(dāng)你希望你的應(yīng)用程序使用磁盤上的音頻文件岩榆,舉個例子,第一步是將音頻文件對象實(shí)例化為AudioFileID類型坟瓢。這個對象在AudioFile.h頂部被聲明為一個不透明的數(shù)據(jù)結(jié)構(gòu)勇边。
typedef struct OpaqueAudioFileID *AudioFileID;
你實(shí)例化一個音頻文件對象,并且創(chuàng)建一個實(shí)際的音頻文件綁定到一個調(diào)用AduioFileCreateWithURL函數(shù)的對象折联。該函數(shù)給你一個新的音頻文件對象的引用粒褒。從那時起,你才通過代理使用真正的音頻文件诚镰。
這種機(jī)制貫穿整個核心音頻奕坟,無論是你播放音頻文件、iPhone audio sessions 更甚者是硬件設(shè)備清笨。
Properties, Scopes, and Elements
大部分核心音頻接口運(yùn)用屬性機(jī)制來管理對象狀態(tài)和精簡對象行為月杉。屬性就是鍵值對。
屬性key值是特殊的枚舉變量縮寫抠艾,諸如kAudioFileProperyFileFormar或者kAudioQueueDevicePropery_NumberChannels.
屬性value值是一個特定的數(shù)據(jù)類型苛萎,合適的目標(biāo)屬性-void、Float64检号、 AudioChannelLayout結(jié)構(gòu)等等腌歉。
這里有很多蘋果定義的屬性。你將會在Core Audio framework的頭文件中找到他們的定義齐苛。有些核心音頻的接口翘盖,如Audio Unit Services, 也讓你自己定義自己的屬性凹蜂。
核心音頻接口運(yùn)用存儲器函數(shù)取回一個對象的屬性值馍驯,如果是一個可寫的屬性,修改它的值玛痊。你也會找到一個第三方的存儲器來獲取屬性的信息泥彤。例如,Audio Unit Services的AudioUnitGetProperyInfo告訴你一個給定的屬性值的數(shù)據(jù)類型大小以及是否可以修改它卿啡。Audio Queue Services的AudioQueueGetPropertySize獲取指定屬性值得大小。
核心音頻接口提供一個通知你app屬性值是否改變的機(jī)制菱父。你可以在Callback Functions:Interacting with Core Audio中讀到颈娜。
在某些情況下剑逃,屬性應(yīng)用于作為整體的音頻對象。例如官辽,在回放的音頻隊(duì)列中計(jì)算音頻level(啥意思蛹磺。。level???)同仆,你可以設(shè)置他的kAudioQueueProperty_EnableLabelMetering 的屬性為true.
其他核心音頻對象有內(nèi)部的結(jié)構(gòu)萤捆,每一個都有他們特殊的的屬性設(shè)置。例如俗批,一個音頻單元有輸入俗或、輸出和全局范圍。一個音頻單元的輸入或者輸出都由一個或者多個屬性組成岁忘,每一個元素類似于音頻硬件中的信道總線辛慰。當(dāng)你用kAudioUnitPropery_AudioChannelLayout屬性調(diào)用AudioUnitGetPropery函數(shù),你不僅指定你想要的音頻單元信息而且是范圍和元素干像。