【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用 OpenSL ES API(下)_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用 OpenSL ES API(下)_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用 OpenSL ES API(下)_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用 OpenSL ES API(下)_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用 OpenSL ES API(下)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Android音頻開發(fā)(7):使用OpenSLESAPI(下)

本文是我的《Android音頻開發(fā)》系列的第七篇文章,上一篇文章總整體上介紹了AndroidOpenSLESAPI的基本概況,告訴了大家這個框架有什么特性,可以做什么,不能做什么。本文則重點(diǎn)介紹OpenSLES框架及其API接口的一些關(guān)鍵的設(shè)計和概念,只有理解了它們,你才能更好地讀懂OpenSLES的相關(guān)代碼。示例代碼則放到了文章的最后,相信大家理解了這些基本的概念后,就能很容易地讀懂這些代碼的細(xì)節(jié)了。1.面向?qū)ο蟮腃語言接口OpenSLES雖然是C語言編寫,但是它的接口采用的是面向?qū)ο蟮姆绞?,并不是提供一系列的函?shù)接口,而是以Interface的方式來提供API,這是理解OpenSLESAPI的一個比較重要的點(diǎn)??赡苓@么說比較抽象,舉例來說,一般的C語言庫,比如:math庫,提供的接口可能是這樣的:double

cosh(double);

double

sinh(double);

double

tanh(double);我們直接在代碼中調(diào)用這個函數(shù)即可,但是OpenSLES卻不是這樣提供API的,它的大都數(shù)API需要這樣訪問://

下面代碼是對

Audio

Engine

對象進(jìn)行

“初始化”

SLEngineItf

engineObject;

SLresult

result

=

(*engineObject)->Realize(engineObject,

SL_BOOLEAN_FALSE);由此可見,OpenSLES的API大都數(shù)是通過“對象”來調(diào)用的,如果在AndroidNDK下開發(fā)過C代碼,就應(yīng)該不會太陌生,因?yàn)槲覀冋{(diào)用“JNI*env”的函數(shù)也是這個樣子去調(diào)用的。2.Objects和InterfacesOpenSLES有兩個必須理解的概念,就是Object和Interface,Object可以想象成Java的Object類,Interface可以想象成Java的Interface,但它們并不完全相同,下面進(jìn)一步解釋他們的關(guān)系:(1)每個Object可能會存在一個或者多個Interface,官方為每一種Object都定義了一系列的Interface(2)每個Object對象都提供了一些最基礎(chǔ)的操作,比如:Realize,Resume,GetState,Destroy等等,如果希望使用該對象支持的功能函數(shù),則必須通過其GetInterface函數(shù)拿到Interface接口,然后通過Interface來訪問功能函數(shù)(3)并不是每個系統(tǒng)上都實(shí)現(xiàn)了OpenSLES為Object定義的所有Interface,所以在獲取Interface的時候需要做一些選擇和判斷通過查看“OpenSLES.h”文件,我們可以看到OpenSLES定義的所有Object對象的ID,我們可以通過ObjectID來創(chuàng)建對應(yīng)的對象實(shí)例。其中,我們比較常用的應(yīng)該就是:ENGINE、AUDIOPLAYER和AUDIORECORDER對象了。同樣,“OpenSLES.h”文件中還定義了所有的InterfaceID,通過InterfaceID我們可以從對象中獲取到對應(yīng)的功能接口。3.OpenSLES的狀態(tài)機(jī)制OpenSLES還有一個比較重要的概念,就是它的狀態(tài)機(jī)制,如圖所示:任何一個OpenSLES的對象,創(chuàng)建成功后,都進(jìn)入SL_OBJECT_STATE_UNREALIZED狀態(tài),這種狀態(tài)下,系統(tǒng)不會為它分配任何資源,直到調(diào)用Realize函數(shù)為止。Realize后的對象,就會進(jìn)入SL_OBJECT_STATE_REALIZED狀態(tài),這是一種“可用”的狀態(tài),只有在這種狀態(tài)下,對象的各個功能和資源才能正常地訪問。當(dāng)一些系統(tǒng)事件發(fā)生后,比如出現(xiàn)錯誤或者Audio設(shè)備被其他應(yīng)用搶占,OpenSLES對象會進(jìn)入SL_OBJECT_STATE_SUSPENDED狀態(tài),如果希望恢復(fù)正常使用,需要調(diào)用Resume函數(shù)。當(dāng)調(diào)用對象的Destroy函數(shù)后,則會釋放資源,并回到SL_OBJECT_STATE_UNREALIZED狀態(tài)。簡言之,一個OpenSLES對象的生命周期,就是從create到destroy的過程,生命周期的控制,都是通過開發(fā)者顯示調(diào)用來完成的。4.常用的對象和結(jié)構(gòu)體心中保持一個概念,就是在OpenSLES中,一切API的訪問和控制都是通過Interface來完成的,連OpenSLES里面的Object也是通過SLObjectItfInterface來訪問和使用的。4.1EngineObject和SLEngineItfInterfaceOpenSLES里面最核心的對象就是:EngineObject,音頻引擎對象,它主要提供如下兩個功能:(1)管理AudioEngine的生命周期(2)提供管理接口:SLEngineItf,該接口可以用來創(chuàng)建所有其他的Object對象(3)提供設(shè)備屬性查詢接口:SLEngineCapabilitiesItf和SLAudioIODeviceCapabilitiesItf,這些接口可以查詢設(shè)備的一些屬性信息EngineObject對象的創(chuàng)建方法如下:SLObjectItf

engineObject;

slCreateEngine(

&engineObject,

0,

nullptr,

0,

nullptr,

nullptr

);初始化/銷毀:(*engineObject)->Realize(engineObject,

SL_BOOLEAN_FALSE);

(*engineObject)->Destroy(engineObject);獲取管理接口:SLEngineItf

engineEngine;

(*engineObject)->GetInterface(engineObject,

SL_IID_ENGINE,

&(engineEngine));下面我們就可以愉快地使用engineEngine來創(chuàng)建所有OpenSLES的其他對象了。4.2MediaObjectOpenSLES里面另一組比較重要的對象就是MediaObject,代表著多媒體功能的抽象,比如:player、recorder等等。我們可以通過SLEngineItf提供的CreateAudioPlayer方法來創(chuàng)建一個player對象實(shí)例,可以通過SLEngineItf提供的CreateAudioRecorder方法來創(chuàng)建一個recorder實(shí)例。4.3DataSource和DataSinkOpenSLES里面,這兩個結(jié)構(gòu)體均是作為創(chuàng)建MediaObject對象時的參數(shù)而存在的,datasource代表著輸入源的信息,即數(shù)據(jù)從哪兒來、輸入的數(shù)據(jù)參數(shù)是怎樣的;而datasink則代表著輸出的信息,即數(shù)據(jù)輸出到哪兒、以什么樣的參數(shù)來輸出。4.3.1基本定義DataSource的定義如下:typedef

struct

SLDataSource_

{

void

*pLocator;

void

*pFormat;

}

SLDataSource;DataSink的定義如下:typedef

struct

SLDataSink_

{

void

*pLocator;

void

*pFormat;

}

SLDataSink;其中,pLocator主要有如下幾種:SLDataLocator_Address

SLDataLocator_BufferQueue

SLDataLocator_IODevice

SLDataLocator_MIDIBufferQueue

SLDataLocator_URI也就是說,MediaObject對象的輸入源/輸出源,既可以是URL,也可以Device,或者來自于緩沖區(qū)隊(duì)列等等,完全是由MediaObject對象的具體類型和應(yīng)用場景來配置。4.3.2示例說明不同的MediaObject對象實(shí)例,datasource和datasink的具體內(nèi)容是不一樣的。例如,對于player而言:而對于recorder而言:5.示例程序及參考資料限于篇幅,關(guān)于OpenSLES的Player和Recorder相關(guān)API詳細(xì)的用法,就不在本文展開了,其實(shí)理解了上面介紹了這些概念之后,結(jié)合官方的

《OpenSL_ES_Specifica

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論