Audio Unit(三):Audio Unit Development Fundamentals
當(dāng)您開始創(chuàng)建音頻單元時,Core audio的音頻單元框架的強大功能和靈活性使您能夠隨時隨地播放聲音。然而,這種力量和靈活性也意味著,要想從正確的方向開始,還有很多東西需要學(xué)習(xí)。在本章中,您將鳥瞰這一前沿技術(shù),為您邁向成為音頻單元開發(fā)人員的第一步服務(wù)。
從這里開始,您可以快速了解音頻單元的開發(fā)周期。然后,您將重點介紹什么是音頻單元,并了解核心音頻SDK在音頻單元開發(fā)中的重要作用。您將了解音頻單元在OSX中如何作為插件工作,以及如何與使用它們的應(yīng)用程序協(xié)同工作。最后,介紹音頻單元規(guī)范,以及它如何定義音頻單元開發(fā)人員和應(yīng)用程序開發(fā)人員都要編寫的插件API。
閱讀本章后,您將準(zhǔn)備深入了解音頻單元中介紹的架構(gòu)和開發(fā)細(xì)節(jié)。
如果您想立即著手構(gòu)建音頻單元,現(xiàn)在可以跳過本章,直接轉(zhuǎn)到教程:使用通用視圖構(gòu)建簡單效果單元。在構(gòu)建音頻單元時,您可以參考本章以及本文檔中的其他章節(jié),了解與您所做工作相關(guān)的概念信息。
音頻單元開發(fā)周期
音頻單元開發(fā)通常遵循以下步驟:
與任何軟件開發(fā)一樣,這些步驟通常都需要迭代。
本文檔后面的教程“教程:使用常規(guī)視圖構(gòu)建簡單效果單元”將引導(dǎo)您完成其中大部分步驟。
什么是音頻單元?
音頻單元(在頭文件和其他地方通常縮寫為AU)是一個OS X插件,用于增強數(shù)字音頻應(yīng)用程序,如Logic Pro和GarageBand。您還可以使用音頻單元將音頻功能構(gòu)建到自己的應(yīng)用程序中。以編程方式,音頻單元打包為捆綁包,并配置為OSX組件管理器定義的組件。
在更深的層次上,根據(jù)你的觀點,音頻單元是兩種截然不同的東西之一。
從內(nèi)部看,音頻單元開發(fā)人員可以看到,音頻單元是標(biāo)準(zhǔn)插件API中的可執(zhí)行實現(xiàn)代碼。API是標(biāo)準(zhǔn)的,因此任何設(shè)計用于音頻單元的應(yīng)用程序都知道如何使用您的API。API由音頻單元規(guī)范定義。
音頻單元開發(fā)人員可以通過音頻單元參數(shù)機制為用戶或應(yīng)用程序添加實時控制音頻單元的能力。參數(shù)是自描述的;它們的值和功能對使用音頻單元的應(yīng)用程序可見。
從外部看,從使用音頻單元的應(yīng)用程序來看,音頻單元只是其插件API。此插件API允許應(yīng)用程序查詢音頻單元的特定功能,這些功能由音頻單元開發(fā)人員定義為參數(shù)和屬性。
由于這種封裝,如何實現(xiàn)音頻單元取決于您自己。最快的方法,蘋果所認(rèn)可的,以及在本文中描述的,是對可自由下載的核心音頻SDK的適當(dāng)C++類的子類進行分類。
音頻單元編程結(jié)構(gòu)和生命周期
下圖表示使用SDK構(gòu)建的正在運行的音頻單元。此圖在上下文中顯示音頻單元及其視圖和使用音頻單元的主機應(yīng)用程序:
此圖顯示音頻單元束的兩個不同內(nèi)部部分:左側(cè)為音頻單元本身,右側(cè)為音頻單元視圖。音頻單元執(zhí)行音頻工作。該視圖為音頻單元提供圖形用戶界面,如果您提供,還支持參數(shù)自動化。(請參閱Supporting Parameter Automation。)當(dāng)您創(chuàng)建一個音頻單元時,通常會將這兩個部分打包在同一個捆綁包中,就像您稍后學(xué)習(xí)的那樣,但它們在邏輯上是獨立的代碼。
音頻單元、其視圖和主機應(yīng)用程序通過主機應(yīng)用程序設(shè)置的通知中心相互通信。這允許所有三個實體保持同步。通知中心的功能是核心音頻單元事件API的一部分。
當(dāng)用戶第一次啟動主機應(yīng)用程序時,音頻單元及其視圖都不會實例化。在此狀態(tài)下,除主機應(yīng)用程序外,圖1-1中所示的所有部件均不存在。
音頻單元及其視圖以兩種方式之一存在并發(fā)揮作用:
- 通常,用戶向主機應(yīng)用程序指示他們希望使用音頻單元。例如,用戶可以要求主機對音頻通道應(yīng)用混響效果。
- 對于為自己的應(yīng)用程序添加功能而提供的音頻單元,應(yīng)用程序可能會在應(yīng)用程序啟動時直接打開音頻單元。
當(dāng)主機打開音頻單元時,它會將音頻單元掛接到圖中淡黃色(音頻數(shù)據(jù))箭頭所示的主機音頻數(shù)據(jù)鏈上。這個連接有兩個部分:向音頻單元提供新的音頻數(shù)據(jù),以及從音頻單元檢索處理過的音頻數(shù)據(jù)。 - 為了向音頻單元提供新的音頻數(shù)據(jù),主機定義了一個回調(diào)函數(shù)(由音頻單元調(diào)用),該函數(shù)一次提供一個片段的音頻數(shù)據(jù)。片是音頻數(shù)據(jù)的若干幀。幀是所有通道中音頻數(shù)據(jù)的一個樣本。
- 要從音頻單元檢索處理過的音頻數(shù)據(jù),主機將調(diào)用音頻單元的渲染方法。
以下是音頻數(shù)據(jù)流如何在主機應(yīng)用程序和音頻單元之間進行:
在圖1-1中音頻單元的描述中,外部立方體表示插件API。Apple提供了音頻單元規(guī)范,該規(guī)范定義了各種音頻單元類型的插件API。當(dāng)您按照此規(guī)范開發(fā)音頻單元時,它將與任何也遵循此規(guī)范的主機應(yīng)用程序一起工作。
在內(nèi)部,音頻單元包含編程支架,用于將插件API連接到自定義代碼。當(dāng)使用核心音頻SDK來構(gòu)建音頻單元時,這個腳手架以組件代碼的形式粘貼到組件管理器中,并提供C++類層次結(jié)構(gòu)。圖1-1(相當(dāng)形象地)將您的自定義代碼表示為音頻單元中的內(nèi)部多維數(shù)據(jù)集,并將SDK的類和粘合代碼表示為將內(nèi)部多維數(shù)據(jù)集連接到外部多維數(shù)據(jù)集的struts。
您可以在不使用Core audio SDK的情況下構(gòu)建音頻單元,但這樣做需要做更多的工作。Apple建議您使用Core Audio SDK進行除最專業(yè)的音頻單元開發(fā)之外的所有開發(fā)。
要了解音頻單元的內(nèi)部架構(gòu),請閱讀音頻單元中的音頻單元架構(gòu)。
音頻單元文件結(jié)構(gòu)
OS X文件系統(tǒng)中的音頻單元如下所示:
當(dāng)您使用Xcode和提供的音頻單元模板構(gòu)建音頻單元時,您的Xcode項目負(fù)責(zé)適當(dāng)?shù)卮虬羞@些部分。
作為一個組件,音頻單元具有以下文件系統(tǒng)特征:
- 它是一個具有.component文件擴展名的捆綁包
- 它是一個包裹;用戶在Finder中查看捆綁包時,會將其視為不透明的
捆綁包頂級內(nèi)容文件夾中的信息屬性列表(Info.plist)文件為系統(tǒng)和希望使用音頻單元的主機應(yīng)用程序提供關(guān)鍵信息。例如,此文件提供: - 反向域名(或統(tǒng)一類型標(biāo)識符)形式的唯一捆綁標(biāo)識字符串。例如,對于Core audio SDK中提供的FilterDemo音頻單元,該標(biāo)識符為com.apple.demo.audiounit.FilterDemo。
- 捆綁包中的文件名,即音頻單元本身。此文件位于捆綁包中的MacOS文件夾中。
音頻單元包可以包含一個稱為視圖的自定義用戶界面。視圖的標(biāo)準(zhǔn)位置在audio unit bundle的Resources文件夾中。圖1-2所示的音頻單元包括這樣一個視圖,它本身打包為一個不透明的包。查看audio unit view bundle內(nèi)部顯示了view bundle文件結(jié)構(gòu):
當(dāng)主機應(yīng)用程序打開音頻單元時,它可以詢問音頻單元是否具有自定義視圖。如果有,音頻單元可以通過提供視圖束的路徑進行響應(yīng)。您可以將視圖包放在任何位置,包括網(wǎng)絡(luò)位置。但是,視圖通常按此處所示進行打包。
音頻單元束通常包含一個音頻單元,如本節(jié)所述。但是單個音頻單元捆綁包可以包含任意數(shù)量的音頻單元。例如,蘋果將其所有音頻單元打包在一個捆綁包中,即System/Library/Components/CoreAudio.component。CoreAudio.component捆綁包包括一個包含所有Apple音頻單元的可執(zhí)行代碼文件,以及另一個包含所有提供的自定義視圖的文件:
一些基本術(shù)語
要理解本文檔,必須理解術(shù)語“音頻單元”、“音頻單元視圖”和“音頻單元束”,以及它們之間的關(guān)系。
“音頻單元”通常指音頻單元包中MacOS文件夾內(nèi)的可執(zhí)行代碼,如圖1-2所示。這是執(zhí)行音頻工作的部分。有時,如本文檔標(biāo)題所示,“音頻單元”在上下文中指整個音頻單元包及其內(nèi)容。在這種情況下,術(shù)語“音頻單元”對應(yīng)于OS X文件系統(tǒng)中插件的用戶視圖。
“音頻單元視圖”指音頻單元的圖形用戶界面,如音頻單元視圖中所述。如圖1-2所示,自定義視圖的代碼通常位于音頻單元捆綁包內(nèi)Resources文件夾中自己的捆綁包中。視圖是可選的,因為AudioUnit框架允許主機應(yīng)用程序基于參數(shù)創(chuàng)建通用視圖音頻單元中的er和屬性代碼。
“音頻單元捆綁包”是指包含音頻單元和自定義視圖(可選)的文件系統(tǒng)打包。當(dāng)本文檔使用“音頻單元捆綁包”時,“重要的是包裝的特性,如文件擴展名和Info.plist文件。有時,如在安裝音頻單元的說明中,“音頻單元包”指的是內(nèi)容以及包裝。在這種情況下,它類似于談?wù)撐募A,而指的是文件夾及其內(nèi)容。
音頻單元作為插件
在本節(jié)中,您將從外向內(nèi)了解音頻單元。首先,您將了解在Apple的AU Lab主機應(yīng)用程序中使用音頻單元的情況。從中,您將了解音頻單元如何在OS X中作為組件發(fā)揮作用。
插件的性質(zhì)
插件是具有某些特殊特性的可執(zhí)行代碼。作為庫而不是程序,插件無法自行運行。相反,插件的存在是為了向主機應(yīng)用程序提供功能。例如,音頻單元可以為GarageBand提供向音頻信號添加管放大器失真的能力。
OSX提供了兩種插件技術(shù):核心基金會的CpPuLuin架構(gòu)和組件管理器。音頻單元是基于組件管理器的插件。稍后在本節(jié)中,您將了解到在音頻單元中支持組件管理器。
主機應(yīng)用程序可以附帶插件,在這種情況下,插件的使用對用戶是透明的。在其他情況下,用戶可以獲取插件并將其顯式添加到正在運行的應(yīng)用程序中。
插件相對于其他代碼庫的特殊之處在于它們能夠動態(tài)地為運行的主機應(yīng)用程序提供功能。這可以在AU Lab應(yīng)用程序(Xcode Tools安裝的一部分)中看到。
教程:在主機應(yīng)用程序中使用音頻單元
本迷你教程通過以下方式說明插件的動態(tài)特性:
- 將音頻單元添加到正在運行的主機應(yīng)用程序
- 使用音頻單元
- 從正在運行的主機應(yīng)用程序中卸下音頻單元
在此過程中,本教程將向您展示如何開始使用非常有用的AU Lab應(yīng)用程序。
確保配置與圖中所示的設(shè)置相匹配:音頻設(shè)備的內(nèi)置音頻、輸入源的線路輸入和輸出通道的立體聲。保持窗口的“輸入”選項卡未配置;稍后將指定輸入。單擊“確定”。
將打開一個新的AU Lab窗口,顯示您指定的輸出通道。
此時,AU Lab已經(jīng)實例化了您計算機上所有可用的音頻單元,查詢它們以了解如何將它們與其他音頻單元結(jié)合使用,然后再次關(guān)閉它們。
(更準(zhǔn)確地說,OS X組件管理器代表AU Lab調(diào)用了音頻單元的實例化和關(guān)閉。下面的音頻單元組件管理器要求對此進行了解釋。)
在該對話框中,確保在生成器彈出窗口中選擇了AUAudioFilePlayer生成器。要遵循此示例,請將組名更改為Player。單擊“確定”。
您可以通過在AU實驗室窗口中雙擊組名隨時更改組名。
AU Lab窗口現(xiàn)在顯示立體聲輸入軌跡。此外,發(fā)電機組的檢查器窗口已打開。如果關(guān)閉檢查器,可以通過單擊播放器軌跡頂部附近的矩形“AU”按鈕重新打開它。
現(xiàn)在,AU Lab已配置完畢,可供您添加音頻單元。
將打開一個菜單,列出系統(tǒng)上可用的所有音頻單元,按類別和制造商排列。AU Lab從組件管理器獲取此列表,該管理器維護已安裝音頻單元的注冊表。
從彈出窗口中選擇一個音頻單元。要遵循此示例,請從Apple子菜單中選擇AUParametercEQ音頻單元。(該音頻單元作為OS X的一部分提供,是一個單波段均衡器,具有中心頻率、增益和Q值的控制。)
AU實驗室要求組件管理器實例化您選擇的音頻單元。AU實驗室然后初始化音頻單元。AU Lab還會打開音頻單元的Cocoa通用視圖,該視圖顯示為一個實用程序窗口:
現(xiàn)在,您已將AUParametericEQ音頻單元動態(tài)添加到正在運行的AU Lab主機應(yīng)用程序中。
從彈出菜單中,選擇Remove AUParametericEQ。
組件管理器代表AU Lab關(guān)閉音頻單元。您現(xiàn)在已從正在運行的AU Lab主機應(yīng)用程序中動態(tài)刪除音頻單元及其功能。
核心音頻SDK的作用
當(dāng)您使用Core audio SDK構(gòu)建音頻單元時,您可以免費獲得組件管理器支架。您還可以獲得對大多數(shù)音頻單元規(guī)格的全面支持。這使您能夠集中精力于音頻單元開發(fā)中更有趣的方面:音頻處理和用戶界面。
通過在SDK的音頻單元C++類層次中對適當(dāng)?shù)念愡M行子類化,創(chuàng)建基于SDK的音頻單元。附錄:音頻單元類層次結(jié)構(gòu)顯示了該層次結(jié)構(gòu)。
主機應(yīng)用程序通過插件API和組件管理器與音頻單元通信。總共有六個代碼體,它們相互配合以支持運行的音頻單元:
- 音頻單元包。捆綁包包裝音頻單元及其視圖(如果提供自定義視圖),并提供音頻單元的標(biāo)識,以便OS X和組件管理器使用音頻單元。
- 音頻單元本身。按照建議,使用核心音頻SDK構(gòu)建音頻單元時,音頻單元繼承自SDK的類層次結(jié)構(gòu)。
- 音頻單元視圖。
- 核心音頻API框架。
- 組件管理器。
- 主機應(yīng)用程序。
如果您想了解SDK的其余部分,請參考核心音頻SDK的快速教程。
音頻單元的組件管理器要求
組件管理器充當(dāng)主機應(yīng)用程序和它使用的音頻單元的中間人,以主機的名義查找、打開、實例化和關(guān)閉音頻單元。
要讓OS X識別您的音頻單元,它們必須滿足某些要求。他們必須:
- 按照組件管理器的定義打包為組件
- 具有組件管理器可以識別的單個入口點
- 具有指定系統(tǒng)范圍唯一標(biāo)識符和版本字符串的資源(.rsrc)文件
- 響應(yīng)組件管理器調(diào)用
從頭開始滿足這些需求是一項重要的工作,需要對組件管理器API有很強的掌握。但是,核心音頻SDK將您與此隔離。正如“教程:使用通用視圖構(gòu)建簡單效果單元”一章所示,在使用SDK時,適應(yīng)組件管理器只需要很少的工作。
音頻單元安裝和注冊
OSX組件管理器在某些特定位置查找音頻單元,其中一個是為蘋果保留的。
在開發(fā)或部署期間安裝音頻單元時,通常會將其放在以下兩個位置之一:
- ~/Library/Audio/Plug-Ins/Components/
此處安裝的音頻單元只能由主文件夾的所有者使用 - /Library/Audio/Plug-Ins/Components/
安裝在此處的音頻單元可供計算機上的所有用戶使用
這取決于您使用或向用戶推薦這些位置中的哪一個。
OS X預(yù)裝的音頻單元位于為蘋果公司保留的位置:
組件管理器在這些位置(以及在其他標(biāo)準(zhǔn)位置找到的任何其他插件)維護音頻單元的緩存注冊表。只有注冊的音頻單元可用于宿主應(yīng)用程序。組件管理器在系統(tǒng)啟動、用戶登錄以及三個組件文件夾之一的修改時間戳更改時刷新注冊表。
主機應(yīng)用程序可以使用組件管理器的RegisterComponent、RegisterComponentResource或RegisterComponentResourceFile函數(shù)顯式注冊安裝在任意位置的音頻單元。以這種方式注冊的音頻單元僅對調(diào)用注冊的主機應(yīng)用程序可用。這使您可以使用音頻單元向正在開發(fā)的主機應(yīng)用程序添加功能,而無需將音頻單元提供給其他主機。
音頻單元識別
系統(tǒng)上的每個音頻單元都必須具有唯一的簽名。音頻單元規(guī)范利用這一點,讓主機應(yīng)用程序根據(jù)其簽名了解任何音頻單元的插件API。本節(jié)介紹了該方法的工作原理。
Component Manager通過四個字符的三元組代碼識別音頻單元:
- “類型”指定音頻單元提供的功能的一般類型。這樣,類型還標(biāo)識音頻單元的插件API。這樣,類型代碼在編程上具有重要意義。例如,主機應(yīng)用程序知道任何類型為“aufx”(表示“音頻單元效果”)的音頻單元都提供DSP功能。
音頻單元規(guī)范指定了音頻單元的可用類型代碼,以及每個音頻單元類型的插件API。 - “子類型”更準(zhǔn)確地描述了音頻單元的功能,但對音頻單元的編程意義不大。
例如,OSX包含一個子類型“l(fā)pas”的效果單元,其名稱表示它提供低通過濾。對于音頻單元,如果使用音頻單元框架中AUComponent.h頭文件中列出的子類型之一(如“l(fā)pas”),則向音頻單元的用戶建議其行為類似于命名的子類型。但是,主機應(yīng)用程序不會根據(jù)音頻單元的子類型對其進行假設(shè)。您可以自由使用任何子類型代碼,包括僅以小寫字母命名的子類型。 - “制造商代碼”標(biāo)識音頻單元的開發(fā)者。
蘋果希望每個開發(fā)者在數(shù)據(jù)類型注冊頁面上注冊一個制造商代碼作為“創(chuàng)建者代碼”。制造商代碼必須至少包含一個大寫字符。注冊后,您可以對所有音頻單元使用相同的制造商代碼。
除了這四個字符的代碼外,每個音頻單元都必須指定格式正確的版本號。當(dāng)組件管理器注冊音頻單元時,如果系統(tǒng)上存在多個音頻單元,它會選擇最新的版本。
作為一個組件,音頻單元在其資源(.rsrc)文件中將其版本標(biāo)識為八位十六進制數(shù)。正如您將在教程:使用通用視圖構(gòu)建簡單效果單元中看到的,您可以使用Xcode指定此信息。
下面是一個如何構(gòu)造版本號的示例。它使用一個人為的大數(shù)字來明確說明格式。對于十進制版本號29.33.40,十六進制等效值為0x001d2128。此數(shù)字的格式如下所示:
四個最有效的十六進制數(shù)字表示主要版本號。下兩個代表次要版本號。兩個最低有效位代表dot發(fā)行編號。
發(fā)布新版本的音頻單元時,必須確保其版本號的值高于上一版本,不等于上一版本,且不低于上一版本。否則,安裝了舊版本音頻單元的用戶將無法使用新版本。
音頻單元的插件API要求
如上音頻單元標(biāo)識中所述,輸入音頻單元。當(dāng)主機應(yīng)用程序看到音頻單元的類型時,它知道如何與之通信。
從頭開始為任何給定類型的音頻單元實現(xiàn)插件API是一項重要的工作。它需要對音頻單元和音頻工具箱框架API以及音頻單元規(guī)范有很強的掌握。然而,Core Audio SDK也將您與此隔離開來。使用SDK,您只需要實現(xiàn)與音頻單元相關(guān)的方法和屬性。(您將在下一章“音頻單元”中了解音頻單元屬性機制。)
音頻單元規(guī)格
音頻單元規(guī)范定義了音頻單元開發(fā)人員和主機應(yīng)用程序開發(fā)人員必須支持的通用接口。
注:音頻單元規(guī)范文件目前正在編制中。以下頭文件包含與音頻單元規(guī)范相關(guān)的信息:AUComponent.h、AudioUnitProperties.h、MusicDevice.h和OutputUnit.h。
此外,以下教程文件包含與音頻單元規(guī)范相關(guān)的信息:AUPannerUnits.text、OfflineRendering.rtf和offlinepiadditions.text。
音頻單元規(guī)范描述了:
- 為音頻單元定義的各種Apple類型,如音頻單元框架中AUComponent.h頭文件中的“AudioUnit組件類型和子類型”枚舉中所列
- 每種類型音頻單元的功能和行為要求
- 每種類型音頻單元的插件API,包括必需和可選屬性
您開發(fā)的音頻單元符合音頻單元規(guī)格。然后使用auval命令行工具測試此一致性,將在下一節(jié)中介紹。
音頻單元規(guī)范定義了以下音頻單元類型的插件API: - 效果單元(“aufx”),如音量控制、均衡器和混響,用于修改音頻數(shù)據(jù)流
- 音樂效果單元(“aumf”),如活套,它將樂器單元的功能(如啟動和停止樣本)與效果單元的功能相結(jié)合
- 離線效果單元(“auol”),它允許您對音頻進行實時不實用的操作,例如時間反轉(zhuǎn)或前瞻級別的標(biāo)準(zhǔn)化
- 樂器單元(“aumu”),將MIDI和聲庫數(shù)據(jù)作為輸入,并提供音頻數(shù)據(jù)作為輸出,讓用戶播放虛擬樂器
- 生成器單元(“augn”),以編程方式生成音頻數(shù)據(jù)流或從文件播放音頻
- 數(shù)據(jù)格式轉(zhuǎn)換器單元(“aufc”),用于改變音頻數(shù)據(jù)流的特性,如位深度、采樣率或播放速度
- 組合音頻數(shù)據(jù)流的混音器單元(“aumx”)
- Panner單元(“aupn”),使用空間化算法將一組輸入通道分配給一組輸出通道
音頻單元作為模型-視圖-控制器設(shè)計模式的實例
蘋果的核心音頻團隊圍繞一種更流行的軟件設(shè)計模式,即模型-視圖-控制器(MVC),設(shè)計了音頻單元技術(shù)。有關(guān)此模式的詳細(xì)信息,請參見模型視圖控制器。
在構(gòu)建音頻單元時,請記住MVC模式:
- 音頻單元作為模型,封裝了執(zhí)行音頻工作所需的所有知識
- 音頻單元的視圖自然作為視圖,顯示音頻單元的當(dāng)前設(shè)置并允許用戶更改它們
- 音頻單元事件API以及音頻單元及其視圖中調(diào)用此API的代碼與控制器相對應(yīng),支持音頻單元、其視圖和主機應(yīng)用程序之間的通信
音頻單元工作
打開和關(guān)閉音頻單元
主機應(yīng)用程序在組件管理器的幫助下負(fù)責(zé)查找、打開和關(guān)閉音頻單元。反過來,音頻單元需要是可查找、可打開和可關(guān)閉的。當(dāng)您從Core audio SDK構(gòu)建音頻單元并使用Xcode音頻單元模板時,您的音頻單元將獲得這些屬性。
音頻單元在主機中可用的順序分為兩步。這兩個步驟是打開和初始化。打開音頻單元相當(dāng)于實例化音頻單元的主類的對象。初始化相當(dāng)于分配資源,以便音頻單元準(zhǔn)備好工作。
要成為性能良好、主機友好的插件,音頻單元的實例化必須快速且輕量級。音頻單元的資源密集型啟動工作進入初始化步驟。例如,使用大量樣本數(shù)據(jù)的儀器單元應(yīng)該在初始化時加載,而不是在實例化時加載。
有關(guān)作為音頻單元開發(fā)人員查找、打開和關(guān)閉音頻單元的更多信息,請參閱音頻單元中的音頻單元初始化和取消初始化以及關(guān)閉。
添加拷貝保護
如果您選擇將復(fù)制保護添加到音頻單元,那么考慮音頻單元的打開順序尤為重要。復(fù)制保護的時間是在音頻單元初始化期間,而不是實例化期間。因此,您將復(fù)制保護代碼放入SDK的AUBase超類的Initialize方法重寫中。您不會將復(fù)制保護代碼放入音頻單元的構(gòu)造函數(shù)中。
這是一個重要的場景。假設(shè)用戶沒有(受拷貝保護的)音頻單元所需的硬件加密狗。也許他們把筆記本電腦帶到演出現(xiàn)場時把它忘在家里了。如果音頻單元在實例化時調(diào)用其復(fù)制保護,則可能會阻止主機應(yīng)用程序打開。如果您的音頻單元按照建議在初始化時調(diào)用其復(fù)制保護,則執(zhí)行者至少可以使用主機應(yīng)用程序。
多重實例化
音頻單元可以由主機應(yīng)用程序和任意數(shù)量的主機實例化任意次數(shù)。更準(zhǔn)確地說,組件管理器代表主機應(yīng)用程序調(diào)用音頻單元實例化。Component Manager基礎(chǔ)結(jié)構(gòu)確保每個音頻單元實例獨立存在和運行。
您可以在AU Lab中演示多個實例化。首先將AuParametericEq效果單元的一個實例添加到AU Lab文檔中,如教程:在主機應(yīng)用程序中使用音頻單元中所述。然后調(diào)用播放器曲目中特效部分其他行中的彈出菜單。可以向軌跡添加任意多個單波段參數(shù)化均衡器。音頻單元的每個實例都獨立運行,如圖中不同的設(shè)置所示:
音頻處理圖與Pull模型
主機應(yīng)用程序可以將音頻單元相互連接,以便一個音頻單元的輸出為下一個音頻單元的輸入提供反饋。這樣的音頻處理單元系列稱為互連的音頻圖形。在圖形的上下文中,每個連接的音頻單元稱為節(jié)點。
在本章前面的教程:在主機應(yīng)用程序部分中使用音頻單元時,AU Lab應(yīng)用程序為您構(gòu)建了一個音頻處理圖。該圖由AUAudioFilePlayer生成器單元、AUParametericEQ效果單元和最終(未在AU實驗室的用戶界面中顯示)由蘋果提供的AUHAL I/O單元組成,該單元與外部硬件(如揚聲器)接口。
音頻處理圖形連接提供了有關(guān)這些連接如何工作的詳細(xì)信息。
音頻工具箱框架中聲明的音頻處理圖API提供了用于幫助主機應(yīng)用程序創(chuàng)建和管理音頻處理圖的接口。當(dāng)主機應(yīng)用程序使用此API時,它使用一種不透明的數(shù)據(jù)類型,稱為圖形對象(類型為AUGraph)。
某些應(yīng)用程序(如AU Lab)在互連音頻單元時始終使用圖形對象。其他的,如Logic,直接將音頻單元相互連接。但是,單個音頻單元不知道其連接是由代表主機應(yīng)用程序的圖形對象管理,還是由主機直接管理。
圖形中的音頻數(shù)據(jù)流從第一個(輸入)節(jié)點到最后一個(輸出)節(jié)點,正如您所期望的那樣。但是,控制從最后一個節(jié)點流回第一個節(jié)點。在核心音頻中,這稱為拉動模式。宿主應(yīng)用程序負(fù)責(zé)調(diào)用pull。
你可以用一杯水里的吸管來想象拉動模型。玻璃杯中的水代表等待處理的新鮮音頻數(shù)據(jù)。吸管表示音頻處理圖,甚至表示單個音頻單元。作為主機應(yīng)用程序,您可以通過在吸管末端“拉”(啜飲)開始音頻數(shù)據(jù)流。具體地說,主機應(yīng)用程序通過調(diào)用圖形中最后一個節(jié)點的呈現(xiàn)方法來啟動音頻數(shù)據(jù)流。通過吸管執(zhí)行的每個sip都對應(yīng)于音頻數(shù)據(jù)幀片段的另一次拉取,以及對最終節(jié)點渲染方法的另一次調(diào)用。
在音頻或控制流啟動之前,主機應(yīng)用程序執(zhí)行將音頻單元彼此連接起來的工作。在如圖所示的情況下,主機還與音頻處理圖建立連接。但主機不一定要將音頻數(shù)據(jù)提供給它們使用的圖形。在圖形中的第一音頻單元是發(fā)生器單元的情況下,不存在輸入連接;生成器通過算法或播放文件提供音頻數(shù)據(jù)。
圖1-7顯示了主機應(yīng)用程序按順序使用兩個效果單元的特定情況下的拉動模型。
以下是圖1-7中的拉動過程:
音頻單元通常不知道其輸入和輸出是否連接到其他音頻單元、主機應(yīng)用程序或其他設(shè)備。音頻單元只響應(yīng)渲染調(diào)用。主機負(fù)責(zé)建立連接,而超類(對于使用核心音頻SDK構(gòu)建的音頻單元)負(fù)責(zé)實現(xiàn)pull。
作為音頻單元開發(fā)人員,您不需要直接使用音頻處理圖,只需要確保您的音頻單元能夠很好地使用它們。在一定程度上,您可以通過確保您的音頻單元通過蘋果的驗證測試來實現(xiàn)這一點,如auval工具的音頻單元驗證中所述。您還應(yīng)該通過使用主機應(yīng)用程序在各種處理圖中連接音頻單元來執(zhí)行測試,如音頻單元測試和主機應(yīng)用程序中所述。
處理:問題的核心
當(dāng)然,音頻單元處理音頻數(shù)據(jù)。他們還需要知道如何優(yōu)雅地停止處理,以及如何根據(jù)用戶調(diào)整修改處理。本節(jié)簡要討論這些內(nèi)容。音頻單元更詳細(xì)地描述處理。
處理
處理音頻數(shù)據(jù)的音頻單元(如效果單元)按渲染周期工作。在每個渲染周期中,音頻單元:
- 獲取要處理的新音頻數(shù)據(jù)幀片段。它通過調(diào)用已在音頻單元中注冊的呈現(xiàn)回調(diào)函數(shù)來實現(xiàn)這一點。
- 處理音頻數(shù)據(jù)幀。
- 將生成的音頻數(shù)據(jù)幀放入音頻單元的輸出緩沖區(qū)。
音頻單元在其主機應(yīng)用程序的控制和調(diào)用下完成這項工作。主機應(yīng)用程序還設(shè)置每個片段的音頻數(shù)據(jù)幀數(shù)。例如,AU Lab默認(rèn)使用每個切片512幀,您可以將此數(shù)字從24更改為4096。參見AU實驗室的測試。
渲染下一幀片段的編程調(diào)用可以從以下兩個位置之一到達: - 從主機應(yīng)用程序本身,如果主機直接使用音頻單元
- 如果音頻單元是音頻處理圖的一部分,則來自音頻單元的下游鄰居
無論調(diào)用上下文是主機應(yīng)用程序還是請求音頻數(shù)據(jù)的下游音頻單元,音頻單元的行為都完全相同。
重置
音頻單元還需要能夠優(yōu)雅地停止渲染。例如,實現(xiàn)IIR濾波器的音頻單元使用采樣的內(nèi)部緩沖區(qū)。將頻率曲線應(yīng)用于正在處理的樣本時,它使用這些緩沖樣本的值。假設(shè)這樣一個音頻單元的用戶停止播放音頻文件,然后在文件中的不同點重新開始播放。在這種情況下,音頻單元必須從一個空的處理緩沖區(qū)開始,以避免產(chǎn)生偽影。
當(dāng)您開發(fā)音頻單元的DSP代碼時,您會實現(xiàn)一種重置方法,將音頻單元的DSP狀態(tài)恢復(fù)到音頻單元首次初始化時的狀態(tài)。主機應(yīng)用程序根據(jù)需要調(diào)用重置方法。
渲染時的調(diào)整
當(dāng)音頻單元渲染時,用戶可以使用音頻單元的視圖調(diào)整渲染行為。例如,在參數(shù)濾波器音頻單元中,用戶可以調(diào)整中心頻率。主機應(yīng)用程序也可以使用參數(shù)自動化更改渲染,這將在下一節(jié)中介紹。
支持參數(shù)自動化
參數(shù)允許用戶調(diào)整音頻單位。例如,蘋果的低通濾波器音頻單元具有截止頻率和共振參數(shù)。
參數(shù)自動化允許用戶沿時間線編程參數(shù)調(diào)整。例如,用戶可能希望使用低通濾波器音頻單元來提供類似吉他哇哇踏板的效果。通過參數(shù)自動化,用戶可以錄制華華效果,并將其作為音樂作品的一部分。主機應(yīng)用程序記錄手動更改以及同步信息,將更改與音頻曲目的時間標(biāo)記綁定。然后,主機可以回放參數(shù)更改,以自動控制音頻單元。
主機應(yīng)用程序還可以為用戶提供間接指定參數(shù)操作的能力。例如,主機可以讓用戶沿音頻軌跡的波形表示繪制增益或平移曲線。然后,主機可以將此類圖形輸入轉(zhuǎn)換為參數(shù)自動化數(shù)據(jù)。
參數(shù)自動化依賴于三件事:
- 音頻單元根據(jù)主機應(yīng)用程序的請求以編程方式更改其參數(shù)值的能力
- 音頻單元視圖能夠在用戶更改參數(shù)值時發(fā)布通知
- 主機應(yīng)用程序支持參數(shù)自動化數(shù)據(jù)記錄和回放的能力
一些支持音頻設(shè)備參數(shù)自動化的主機是Logic Pro、Ableton Live和Sagan Metro。
參數(shù)自動化使用AudioUnitUtilities.h頭文件中聲明的AudioUnitEventAPI作為AudioToolbox框架的一部分。此線程安全API提供了一種通知機制,支持保持音頻單元、它們的視圖和主機同步。
要支持音頻單元中的參數(shù)自動化,必須創(chuàng)建自定義視圖。您可以向視圖的可執(zhí)行代碼添加自動化支持,利用音頻單元事件API支持以下部分或全部事件類型: - 參數(shù)手勢,包括kAudioUnitEvent_BeginParameterChange手勢和kAudioUnitEvent_EndParameterChange手勢事件類型
- 參數(shù)值更改,由kAudioUnitEvent\u參數(shù)值更改事件類型標(biāo)識
- 屬性更改,由kAudioUnitEvent_PropertyChange事件類型標(biāo)識
在某些特殊情況下,您可能需要為音頻單元本身添加參數(shù)自動化支持。例如,您可以創(chuàng)建具有可調(diào)上下角頻率的帶通濾波器。然后,您的音頻單元需要確保上限頻率永遠不會低于下限頻率。在這種情況下,當(dāng)音頻單元調(diào)用參數(shù)更改時,它需要發(fā)出參數(shù)更改通知。
音頻單元視圖以及定義和使用參數(shù)提供了有關(guān)參數(shù)自動化的更多信息。
音頻單元驗證和測試
使用auval工具進行音頻單元驗證
Apple強烈建議在開發(fā)過程中使用auval命令行工具驗證音頻單元。auval工具(命名為“音頻單元驗證”的縮寫)隨OS X提供。它在以下方面執(zhí)行一套全面的測試:
- 音頻單元的插件API,由其編程類型定義
- 音頻單元的基本功能包括音頻數(shù)據(jù)通道配置可用、實例化音頻單元所需的時間以及音頻單元呈現(xiàn)音頻的能力
auval工具僅測試音頻單元本身。它不測試以下任何一項: - 音頻單元視圖
- 音頻單元架構(gòu),使用推薦的模型-視圖-控制器設(shè)計模式分離關(guān)注點
- 正確使用音頻單元事件API
- DSP質(zhì)量、音頻生成質(zhì)量或音頻數(shù)據(jù)格式轉(zhuǎn)換質(zhì)量
auval工具可以驗證Apple定義的每種類型的音頻單元。當(dāng)您運行它時,它會輸出一個測試日志,并用“通過”或“失敗”指示總結(jié)結(jié)果。
有關(guān)詳細(xì)信息,請參閱auval內(nèi)置幫助系統(tǒng)。要查看auval幫助文本,請在終端應(yīng)用程序中的提示下輸入以下命令:
音頻單元測試和主機應(yīng)用
當(dāng)您按照音頻單元規(guī)格進行構(gòu)建時,您做了正確的事情。這樣的音頻單元應(yīng)該與所有主機一起工作。但實際上,在商業(yè)應(yīng)用中測試音頻單元之前,開發(fā)是不完整的。原因包括:
- 核心音頻框架和SDK的發(fā)展
- 主機應(yīng)用程序版本之間的差異
- 某些主機應(yīng)用程序?qū)崿F(xiàn)中的特性
隨著識別音頻單元的主機應(yīng)用程序的激增,在所有潛在主機中測試音頻單元的任務(wù)變得更加復(fù)雜。
這種情況在某種程度上類似于在各種瀏覽器中測試網(wǎng)站:您的代碼可能完全符合相關(guān)規(guī)范,但在一個或另一個瀏覽器中出現(xiàn)不符合要求的情況需要您進行補償。
考慮到這一點,以下各節(jié)概述了基于主機的音頻單元測試。
AU Lab測試
AU Lab是您在教程“在主機應(yīng)用程序中使用音頻單元”中使用的應(yīng)用程序,它是參考音頻單元主機。蘋果的核心音頻團隊正在積極開發(fā)。他們將其與auval工具、核心音頻框架和SDK以及OSX本身保持同步。這使得AU實驗室成為測試音頻單元的第一個地方。
你可以用AU實驗室測試什么
使用AU Lab測試音頻單元可以測試:
- 被主機發(fā)現(xiàn)、顯示在菜單中并打開的行為
- 視圖,包括常規(guī)視圖和自定義視圖
- 音響性能
- 放置在音頻處理圖中時與其他音頻單元的交互
I/O功能,如側(cè)鏈和多輸出,以及單聲道和立體聲操作的基本測試
在OS X v10.4“Tiger”中,AU Lab允許您測試以下類型的音頻單元: - 轉(zhuǎn)爐裝置
- 效應(yīng)單位
- 發(fā)電機組
- 儀器裝置
改變主機應(yīng)用程序的特性
AU Lab可以讓你控制它的一些主機特性,讓你在不同的條件下測試你的音頻單元的行為。例如,可以更改每個渲染周期中要處理的音頻數(shù)據(jù)的幀數(shù)。您可以使用設(shè)備首選項來執(zhí)行此操作。
在AU Lab中,從AU Lab菜單中選擇首選項。單擊設(shè)備以顯示設(shè)備首選項:
單擊框架彈出菜單。您可以選擇音頻單元在每個渲染周期中要處理的幀數(shù):
單擊“專家設(shè)置”的“公開三角形”。您可以改變滑塊以選擇用于音頻處理的CPU時間百分比。這使您可以在不同的負(fù)載條件下測試音頻單元的行為:
音頻單元的定制測試
作為一名音頻單元開發(fā)人員,您需要了解目標(biāo)市場使用的主機應(yīng)用程序的最新情況。蘋果建議您至少使用蘋果的專業(yè)主機應(yīng)用套件測試音頻單元:
- 隨身錄音室
- 邏輯專家
- 配樂專業(yè)版
- 最終切割專業(yè)版
有許多第三方和開源應(yīng)用程序支持音頻單元,其中包括Ableton Live、Amadeus、Audacity、Cubase、Digital Performer、DSP Quattro、Peak、Rax和Metro。
總結(jié)
以上是生活随笔為你收集整理的Audio Unit(三):Audio Unit Development Fundamentals的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arduino(4):使用ESP8266
- 下一篇: 浙江工业大学计算机应用基础,本科教学-浙