Android的Audio 系統(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接口通過JNI和Java框架提供給上層
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。
Audio的JNI部分:
frameworks/base/core/jni
Audio的JAVA部分:
frameworks/base/media/java/android/media
主要包含AudioManager和Audio系統(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使用JNI和JAVA對上層提供接口。
2.2 media庫中的Audio框架部分
Android 的Audio的核心框架在media庫中提供,其中對上面主要實現(xiàn)AudioSystem、AudioTrack和AudioRecorder三個類。提供了IAudioFlinger類接口,在這個類中,可以獲得IAudioTrack和IAudioRecorder兩個接口,分別用于聲音的播放和錄制。AudioTrack和AudioRecorder分別通過調(diào)用IAudioTrack和IAudioRecorder來實現(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.h:media庫的Audio部分對上層的總管接口;
IAudioFlinger.h:需要下層實現(xiàn)的總管接口;
AudioTrack.h:放音部分對上接口;
IAudioTrack.h:放音部分需要下層實現(xiàn)的接口;
AudioRecorder.h:錄音部分對上接口;
IAudioRecorder.h:錄音部分需要下層實現(xiàn)的接口。
IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h這三個接口通過下層的繼承來實現(xiàn)(即AudioFlinger)。
AudioFlinger.h,AudioTrack.h和AudioRecorder.h是對上層提供的接口,它們既供本地程序調(diào)用(例如聲音的播放器、錄制器等),也可以通過JNI向Java層提供接口。
AudioTrack和AudioRecorder 都具有start,stop和pause等接口。前者具有write接口,用于聲音的播放,后者具有read接口,用于聲音的錄制。AudioSystem用于Audio系統(tǒng)的控制工作,主要包含一些set和get接口,是一個對上層的類。
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本地代碼
Audio是AudioFlinger系統(tǒng)的中間層,其代碼的路徑為:
frameworks/base/libs/audioflinger
AudioFlinger的核心文件是AudioFlinger.h和AudioFlinger.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代碼
Audio的JNI部分的代碼的路徑為:
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代碼
Audio的JAVA部分的代碼的路徑為:
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的硬件抽象層可以是AudioFlinger和Audio硬件的接口??梢曰?/span>Linux標(biāo)準(zhǔn)的Alsa或OSS實現(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的硬件抽象層AudioStreamOut和AudioStreamIn 接口:
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)用。