国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android的Audio系統(tǒng)

 Android的Audio系統(tǒng)收藏

 

AndroidAudio 系統(tǒng)

第一部分 Audio系統(tǒng)綜述

第二部分 Audio系統(tǒng)和上層接口

第三部分 Audio的硬件抽象層

第一部分 Audio系統(tǒng)綜述

Audio系統(tǒng)在Android中負責(zé)音頻方面的數(shù)據(jù)流傳輸和控制功能,也負責(zé)音頻設(shè)備的管理。

Audio系統(tǒng)主要的分成幾個層次:

1. media中庫提供的Audio系統(tǒng)的上層接口

2. AudioFlinger作為Audio系統(tǒng)的中樞

3. Audio庫的硬件抽象層提供底層的支持

4. Audio接口通過JNIJava框架提供給上層

Audio系統(tǒng)的上層接口主要提供了兩方面的功能:放音(Track)和錄音(Recorder)。

 

 

Media庫(libmedia.so)的Audio部分的目錄中:

frameworks/base/include/media/

frameworks/base/media/libmedia/

這部分的內(nèi)容被編譯成庫libmedia.so,提供Audio部分的接口。

AudioFlinger (libaudioflinger.so)

frameworks/base/libs/audioflinger

這部分內(nèi)容被編譯成庫libaudioflinger.so

 

AudioJNI部分:

frameworks/base/core/jni

AudioJAVA部分:

frameworks/base/media/java/android/media

主要包含AudioManagerAudio系統(tǒng)的幾個類。

Audio硬件抽象層的接口:

hardware/libhardware_legacy/include/hardware/

 

第二部分 Audio系統(tǒng)和上層接口

2.1 Audio系統(tǒng)的各個層次

2.2 media庫中的Audio框架部分

2.3 AudioFlinger本地代碼

2.4 Audio系統(tǒng)的JNI代碼

2.5 Audio系統(tǒng)的Java代碼

2.1 Audio系統(tǒng)的各個層次

Audio系統(tǒng)的結(jié)構(gòu):

libmedia.so提供Audio接口,這些Audio接口既向上層開放,也向本地代碼開發(fā)。

libaudiofilnger.so提供Audio接口實現(xiàn)。

Audio硬件抽象層提供到硬件的接口,供AudioFlinger 調(diào)用。

Audio使用JNIJAVA對上層提供接口。

 

2.2 media庫中的Audio框架部分

Android Audio的核心框架在media庫中提供,其中對上面主要實現(xiàn)AudioSystemAudioTrackAudioRecorder三個類。提供了IAudioFlinger類接口,在這個類中,可以獲得IAudioTrackIAudioRecorder兩個接口,分別用于聲音的播放和錄制。AudioTrackAudioRecorder分別通過調(diào)用IAudioTrackIAudioRecorder來實現(xiàn)。

 

Audio系統(tǒng)的頭文件

(路徑為:frameworks/base/include/media/:

AudioSystem.h

IAudioFlinger.h

AudioTrack.h

IAudioTrack.h

AudioRecorder.h

IAudioRecorder.h

Ixxx的接口通過AudioFlinger來實現(xiàn),其他接口通過JNI向上層提供接口。

 

Audio系統(tǒng)的頭文件在frameworks/base/include/media/目錄中,主要的頭文件如下:

AudioSystem.hmedia庫的Audio部分對上層的總管接口;

IAudioFlinger.h:需要下層實現(xiàn)的總管接口;

AudioTrack.h:放音部分對上接口;

IAudioTrack.h:放音部分需要下層實現(xiàn)的接口;

AudioRecorder.h:錄音部分對上接口;

IAudioRecorder.h:錄音部分需要下層實現(xiàn)的接口。

IAudioFlinger.h、IAudioTrack.hIAudioRecorder.h這三個接口通過下層的繼承來實現(xiàn)(即AudioFlinger)。

AudioFlinger.h,AudioTrack.hAudioRecorder.h是對上層提供的接口,它們既供本地程序調(diào)用(例如聲音的播放器、錄制器等),也可以通過JNIJava層提供接口。

 

AudioTrackAudioRecorder 都具有startstoppause等接口。前者具有write接口,用于聲音的播放,后者具有read接口,用于聲音的錄制。AudioSystem用于Audio系統(tǒng)的控制工作,主要包含一些setget接口,是一個對上層的類。

 

AudioSystem.h

classAudioSystem

{

public:

enumstream_type { // Audio 流的類型

SYSTEM = 1,

RING = 2,

MUSIC = 3,

ALARM = 4,

NOTIFICATION =5,

BLUETOOTH_SCO =6,

ENFORCED_AUDIBLE= 7,

NUM_STREAM_TYPES

};

enumaudio_output_type { // Audio數(shù)據(jù)輸出類型

// …… 省略部分內(nèi)容 };

enumaudio_format { // Audio數(shù)據(jù)格式

FORMAT_DEFAULT =0,

PCM_16_BIT,

PCM_8_BIT,

INVALID_FORMAT

};

enum audio_mode { // Audio模式

// …… 省略部分內(nèi)容 };

enumaudio_routes { // Audio 路徑類型

ROUTE_EARPIECE =(1 << 0),

ROUTE_SPEAKER =(1 << 1),

ROUTE_BLUETOOTH_SCO= (1 << 2),

ROUTE_HEADSET =(1 << 3),

ROUTE_BLUETOOTH_A2DP= (1 << 4),

ROUTE_ALL =-1UL,

};

static status_tsetMasterVolume(float value);

static status_tsetMasterMute(bool mute);

static status_tgetMasterVolume(float* volume);

static status_tgetMasterMute(bool* mute);

static status_tsetStreamVolume(int stream, float value);

static status_tsetStreamMute(int stream, bool mute);

static status_tgetStreamVolume(int stream, float* volume);

static status_tgetStreamMute(int stream, bool* mute);

static status_tsetMode(int mode);

static status_tgetMode(int* mode);

static status_tsetRouting(int mode, uint32_t routes, uint32_t mask);

static status_tgetRouting(int mode, uint32_t* routes);

// …… 省略部分內(nèi)容

};

 

2.3 AudioFlinger本地代碼

AudioAudioFlinger系統(tǒng)的中間層,其代碼的路徑為:

frameworks/base/libs/audioflinger

AudioFlinger的核心文件是AudioFlinger.hAudioFlinger.cpp,提供了類AudioFlinger,這個類是一個IAudioFlinger的實現(xiàn)。

 

AudioFlinger的實現(xiàn)

classAudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient

{

public: // …… 省略部分內(nèi)容

virtualsp<IAudioTrack> createTrack( // 獲得音頻輸出接口( Track

pid_t pid, intstreamType,uint32_t sampleRate,

int format,intchannelCount, int frameCount,

uint32_t flags,const sp<IMemory>& sharedBuffer,

status_t*status);

// …… 省略部分內(nèi)容

virtualstatus_t setMasterVolume(float value);

virtualstatus_t setMasterMute(bool muted);

virtualstatus_t setStreamVolume(int stream, float value);

virtualstatus_t setStreamMute(int stream, bool muted);

virtualstatus_t setRouting(int mode, uint32_t routes, uint32_t mask);

virtualuint32_t getRouting(int mode) const;

virtualstatus_t setMode(int mode);

virtual intgetMode() const;

virtualsp<IAudioRecord> openRecord( // 獲得音頻輸出接口(Record

pid_t pid,intstreamType, uint32_t sampleRate,

int format, intchannelCount,int frameCount,

uint32_tflags,status_t *status);

 

2.4 Audio系統(tǒng)的JNI代碼

AudioJNI部分的代碼的路徑為:

frameworks/base/core/jni

實現(xiàn)的幾個文件為:

android_media_AudioSystem.cpp

android_media_AudioTrack.cpp

android_media_AudioRecord.cpp

主要提供三個類的支持:

android.media.AudioSystem

android.media.AudioTrack

android.media.AudioRecorder

 

2.5 Audio系統(tǒng)的JAVA代碼

AudioJAVA部分的代碼的路徑為:

frameworks/base/media/java/android/media

實現(xiàn)了以下的幾個類:

android.media.AudioSystem

android.media.AudioTrack

android.media.AudioRecorder

android.media.AudioFormat

android.media.AudioManager

 

第三部分 Audio的硬件抽象層

Audio的硬件抽象層可以是AudioFlingerAudio硬件的接口??梢曰?/span>Linux標(biāo)準(zhǔn)的AlsaOSS實現(xiàn),也可以基于私有的Audio驅(qū)動接口來實現(xiàn)。

Audio的硬件抽象層的代碼路徑為:

hardware/libhardware_legacy/include/hardware/

其中主要的文件為:

AudioHardwareBase.h

AudioHardwareInterface.h

AudioHardwareInterface.h中定義了類:

AudioStreamOut

AudioStreamIn

AudioHardwareInterface

AudioHardwareInterface.h中定義了類:

AudioHardwareBase,它繼承AudioHardwareInterface,

這是實現(xiàn)Audio硬件抽象層的主要接口。

 

Audio的硬件抽象層AudioStreamOutAudioStreamIn 接口:

classAudioStreamOut {

public:

virtual~AudioStreamOut() = 0;

virtual status_tsetVolume(float volume) = 0;

virtual ssize_twrite(const void* buffer, size_t bytes) = 0;

/*... ... */

};

classAudioStreamIn {

public:

virtual~AudioStreamIn() = 0;

virtual status_tsetGain(float gain) = 0;

virtual ssize_tread(void* buffer, ssize_t bytes) = 0;

/*... ... */

};

 

Audio的硬件抽象層AudioHardwareInterface類:

classAudioHardwareInterface

{

public:

virtual status_tinitCheck() = 0;

virtual status_tsetVoiceVolume(float volume) = 0;

virtual status_tsetMasterVolume(float volume) = 0;

virtual status_tsetRouting(int mode, uint32_t routes) = 0;

virtual status_tgetRouting(int mode, uint32_t* routes) = 0;

virtual status_tsetMode(int mode) = 0;

virtual status_tgetMode(int* mode) = 0;

/*... ... */

virtualAudioStreamOut* openOutputStream(

int format=0,

intchannelCount=0,

uint32_tsampleRate=0,

status_t*status=0) = 0;

virtualAudioStreamIn* openInputStream(

int format,

int channelCount,

uint32_tsampleRate,

status_t *status,

AudioSystem::audio_in_acousticsacoustics) = 0;

staticAudioHardwareInterface* create();

};

 

AudioFlinger的實現(xiàn)中,以下幾個文件提供了Audio系統(tǒng)的通用實現(xiàn):

AudioHardwareGeneric.cpp

AudioHardwareStub.cpp

AudioDumpInterface.cpp

這些代碼將編譯成靜態(tài)庫libaudiointerface.so,這作為Audio系統(tǒng)的通用實現(xiàn)來完成。

 

實際的Audio硬件抽象層,通??梢曰?/span>Linux中的OSS驅(qū)動程序和ALSA驅(qū)動程序來實現(xiàn)。

基于OSS的硬件抽象層的實現(xiàn)類似AudioGeneric的實現(xiàn),但是增加了控制接口。

基于ALSA的硬件抽象層的實現(xiàn)需要構(gòu)建于用戶空間的ALSA庫上,目前在Android已經(jīng)有了成熟的應(yīng)用。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
7.2 Audio系統(tǒng)和上層接口 - 《Android系統(tǒng)原理及開發(fā)要點詳解》 - 免費試...
Android Mediaplayer解讀
Android Audio System 之一:AudioTrack如何與AudioFli...
android系統(tǒng)開發(fā)(十)-audio移植一
ANDROID音頻系統(tǒng)散記之四:4.0音頻系統(tǒng)HAL初探
Android音頻系統(tǒng)之AudioPolicyService
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服