1. 程式人生 > >Android的Audio系統

Android的Audio系統

AndroidAudio 系統

第一部分 Audio系統綜述

第二部分 Audio系統和上層介面

第三部分 Audio的硬體抽象層

第一部分 Audio系統綜述

Audio系統在Android中負責音訊方面的資料流傳輸和控制功能,也負責音訊裝置的管理。

Audio系統主要的分成幾個層次:

1. media中庫提供的Audio系統的上層介面

2. AudioFlinger作為Audio系統的中樞

3. Audio庫的硬體抽象層提供底層的支援

4. Audio介面通過JNIJava框架提供給上層

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

 

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

frameworks/base/include/media/

frameworks/base/media/libmedia/

這部分的內容被編譯成庫libmedia.so,提供Audio部分的介面。

Audio Flinger (libaudioflinger.so)

frameworks/base/libs/audioflinger

這部分內容被編譯成庫libaudioflinger.so

AudioJNI部分:

frameworks/base/core/jni

AudioJAVA部分:

frameworks/base/media/java/android/media

主要包含AudioManagerAudio系統的幾個類。

Audio硬體抽象層的介面:

hardware/libhardware_legacy/include/hardware/

第二部分 Audio系統和上層介面

2.1 Audio系統的各個層次

2.2 media庫中的Audio框架部分

2.3 AudioFlinger原生代碼

2.4 Audio系統的JNI程式碼

2.5 Audio系統的Java程式碼

2.1 Audio系統的各個層次

Audio系統的結構:

libmedia.so提供Audio介面,這些Audio介面既向上層開放,也向原生代碼開發。

libaudiofilnger.so

提供Audio介面實現。

Audio硬體抽象層提供到硬體的介面,供AudioFlinger 呼叫。

Audio使用JNIJAVA對上層提供介面。

 

2.2 media庫中的Audio框架部分

Android Audio的核心框架在media庫中提供,其中對上面主要實現AudioSystemAudioTrackAudioRecorder三個類。提供了IAudioFlinger類介面,在這個類中,可以獲得IAudioTrackIAudioRecorder兩個介面,分別用於聲音的播放和錄製。AudioTrackAudioRecorder分別通過呼叫IAudioTrackIAudioRecorder來實現。

 

Audio系統的標頭檔案

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

AudioSystem.h

IAudioFlinger.h

AudioTrack.h

IAudioTrack.h

AudioRecorder.h

IAudioRecorder.h

Ixxx的介面通過AudioFlinger來實現,其他介面通過JNI向上層提供介面。

Audio系統的標頭檔案在frameworks/base/include/media/目錄中,主要的標頭檔案如下:

AudioSystem.hmedia庫的Audio部分對上層的總管介面;

IAudioFlinger.h:需要下層實現的總管介面;

AudioTrack.h:放音部分對上介面;

IAudioTrack.h:放音部分需要下層實現的介面;

AudioRecorder.h:錄音部分對上介面;

IAudioRecorder.h:錄音部分需要下層實現的介面。

IAudioFlinger.hIAudioTrack.hIAudioRecorder.h這三個介面通過下層的繼承來實現(即AudioFlinger)。

AudioFlinger.hAudioTrack.hAudioRecorder.h是對上層提供的介面,它們既供本地程式呼叫(例如聲音的播放器、錄製器等),也可以通過JNIJava層提供介面。

AudioTrackAudioRecorder 都具有startstoppause等介面。前者具有write介面,用於聲音的播放,後者具有read介面,用於聲音的錄製。AudioSystem用於Audio系統的控制工作,主要包含一些setget介面,是一個對上層的類。

AudioSystem.h

class AudioSystem

{

public:

enum stream_type { // Audio 流的型別

SYSTEM = 1,

RING = 2,

MUSIC = 3,

ALARM = 4,

NOTIFICATION = 5,

BLUETOOTH_SCO = 6,

ENFORCED_AUDIBLE = 7,

NUM_STREAM_TYPES

};

enum audio_output_type { // Audio資料輸出型別

// …… 省略部分內容 };

enum audio_format { // Audio資料格式

FORMAT_DEFAULT = 0,

PCM_16_BIT,

PCM_8_BIT,

INVALID_FORMAT

};

enum audio_mode { // Audio模式

// …… 省略部分內容 };

enum audio_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_t setMasterVolume(float value);

static status_t setMasterMute(bool mute);

static status_t getMasterVolume(float* volume);

static status_t getMasterMute(bool* mute);

static status_t setStreamVolume(int stream, float value);

static status_t setStreamMute(int stream, bool mute);

static status_t getStreamVolume(int stream, float* volume);

static status_t getStreamMute(int stream, bool* mute);

static status_t setMode(int mode);

static status_t getMode(int* mode);

static status_t setRouting(int mode, uint32_t routes, uint32_t mask);

static status_t getRouting(int mode, uint32_t* routes);

// …… 省略部分內容

};

2.3 AudioFlinger原生代碼

AudioAudioFlinger系統的中間層,其程式碼的路徑為:

frameworks/base/libs/audioflinger

AudioFlinger的核心檔案是AudioFlinger.hAudioFlinger.cpp,提供了類AudioFlinger,這個類是一個IAudioFlinger的實現。

AudioFlinger的實現

class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient

{

public: // …… 省略部分內容

virtual sp<IAudioTrack> createTrack( // 獲得音訊輸出介面( Track

pid_t pid, int streamType,uint32_t sampleRate,

int format,int channelCount, int frameCount,

uint32_t flags, const sp<IMemory>& sharedBuffer,

status_t *status);

// …… 省略部分內容

virtual status_t setMasterVolume(float value);

virtual status_t setMasterMute(bool muted);

virtual status_t setStreamVolume(int stream, float value);

virtual status_t setStreamMute(int stream, bool muted);

virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask);

virtual uint32_t getRouting(int mode) const;

virtual status_t setMode(int mode);

virtual int getMode() const;

virtual sp<IAudioRecord> openRecord( // 獲得音訊輸出介面(Record

pid_t pid,int streamType, uint32_t sampleRate,

int format, int channelCount,int frameCount,

uint32_t flags,status_t *status);

2.4 Audio系統的JNI程式碼

AudioJNI部分的程式碼的路徑為:

frameworks/base/core/jni

實現的幾個檔案為:

android_media_AudioSystem.cpp

android_media_AudioTrack.cpp

android_media_AudioRecord.cpp

主要提供三個類的支援:

android.media.AudioSystem

android.media.AudioTrack

android.media.AudioRecorder

2.5 Audio系統的JAVA程式碼

AudioJAVA部分的程式碼的路徑為:

frameworks/base/media/java/android/media

實現了以下的幾個類:

android.media.AudioSystem

android.media.AudioTrack

android.media.AudioRecorder

android.media.AudioFormat

android.media.AudioManager

第三部分 Audio的硬體抽象層

Audio的硬體抽象層可以是AudioFlingerAudio硬體的介面。可以基於Linux標準的AlsaOSS實現,也可以基於私有的Audio驅動介面來實現。

Audio的硬體抽象層的程式碼路徑為:

hardware/libhardware_legacy/include/hardware/

其中主要的檔案為:

AudioHardwareBase.h

AudioHardwareInterface.h

AudioHardwareInterface.h中定義了類:

AudioStreamOut

AudioStreamIn

AudioHardwareInterface

AudioHardwareInterface.h中定義了類:

AudioHardwareBase,它繼承AudioHardwareInterface

這是實現Audio硬體抽象層的主要介面。

Audio的硬體抽象層AudioStreamOutAudioStreamIn 介面:

class AudioStreamOut {

public:

virtual ~AudioStreamOut() = 0;

virtual status_t setVolume(float volume) = 0;

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

/*... ... */

};

class AudioStreamIn {

public:

virtual ~AudioStreamIn() = 0;

virtual status_t setGain(float gain) = 0;

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

/*... ... */

};

Audio的硬體抽象層AudioHardwareInterface 類:

class AudioHardwareInterface

{

public:

virtual status_t initCheck() = 0;

virtual status_t setVoiceVolume(float volume) = 0;

virtual status_t setMasterVolume(float volume) = 0;

virtual status_t setRouting(int mode, uint32_t routes) = 0;

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

virtual status_t setMode(int mode) = 0;

virtual status_t getMode(int* mode) = 0;

/*... ... */

virtual AudioStreamOut* openOutputStream(

int format=0,

int channelCount=0,

uint32_t sampleRate=0,

status_t *status=0) = 0;

virtual AudioStreamIn* openInputStream(

int format,

int channelCount,

uint32_t sampleRate,

status_t *status,

AudioSystem::audio_in_acoustics acoustics) = 0;

static AudioHardwareInterface* create();

};

AudioFlinger的實現中,以下幾個檔案提供了Audio系統的通用實現:

AudioHardwareGeneric.cpp

AudioHardwareStub.cpp

AudioDumpInterface.cpp

這些程式碼將編譯成靜態庫libaudiointerface.so,這作為Audio系統的通用實現來完成。

實際的Audio硬體抽象層,通常可以基於Linux中的OSS驅動程式和ALSA驅動程式來實現。

基於OSS的硬體抽象層的實現類似AudioGeneric的實現,但是增加了控制介面。

基於ALSA的硬體抽象層的實現需要構建於使用者空間的ALSA庫上,目前在Android已經有了成熟的應用。